基于Mybatis映射的一點(diǎn)心得(分享)
以前一直使用Hibernate,基本上沒(méi)用過(guò)Mybatis,工作中需要做映射關(guān)系,簡(jiǎn)單的了解下Mybatis的映射。
兩者相差不多都支持一對(duì)一,一對(duì)多,多對(duì)多,本章簡(jiǎn)單介紹一對(duì)一的使用以及注意點(diǎn)。
建表語(yǔ)句:
CREATE TABLE `bloc` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) collate utf8_bin default NULL,
`company_id` int(11) default NULL,
`intro` varchar(255) collate utf8_bin default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT INTO`bloc` (`id`, `name`, `company_id`, `intro`) VALUES ('1', '宏偉集團(tuán)', '1', '跨國(guó)集團(tuán)');
CREATE TABLE `company` (
`id` int(11) NOT NULL,
`name` varchar(255) collate utf8_bin default NULL,
`intro` varchar(255) collate utf8_bin default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT INTO company (`id`, `name`, `intro`) VALUES ('1', '', NULL);
形式一:子查詢(xún)
JAVA代碼:SqlSessionHelper.java
package com.demo.mybatis;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionHelper {
public static SqlSessionFactory getSessionFactory() throws IOException{
SqlSessionFactory sessionFactory = null;
Reader reader = Resources.getResourceAsReader("configuration.xml");
try{
sessionFactory = new SqlSessionFactoryBuilder().build(reader);;
}catch(Exception ex){
ex.printStackTrace();
}
return sessionFactory;
}
}
Test.java:
package com.demo.mybatis;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import mapper.BlocMapper;
import model.Bloc;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
try{
SqlSession sqlSession = SqlSessionHelper.getSessionFactory().openSession();
BlocMapper blocMapper = sqlSession.getMapper(BlocMapper.class);
List<Bloc> blocs = blocMapper.getBlocList("1");
for (Bloc bloc : blocs) {
System.out.println("companyName = "bloc.getCompany().getName());
}
}catch(Exception ex){
System.out.println(ex.getMessage());
}
}
}
mapper:
package mapper;
import java.util.List;
import model.Bloc;
public interface BlocMapper {
public List<Bloc> getBlocList(String name);
}
package mapper;
public interface CompanyMapper {
}
model:
package model;
public class Bloc {
private Integer id;
private String name;
private String intro;
private Company company;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIntro() {
return intro;
}
public void setIntro(String intro) {
this.intro = intro;
}
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this.company = company;
}
}
package model;
public class Company {
private Integer id;
private String name;
private Integer intro;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getIntro() {
return intro;
}
public void setIntro(Integer intro) {
this.intro = intro;
}
}
映射配置如下:(如果是一堆多的話(huà)“brandObject”改成實(shí)體List屬性association 改成collection )
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.CompanyMapper">
<resultMap id="BaseResultMap" type="model.Company" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="intro" property="intro" jdbcType="VARCHAR" />
</resultMap>
<select id = "getCompanyInfo" parameterType="Integer" resultMap="BaseResultMap">
select * from company where id = #{id}
</select>
</mapper>
<mapper namespace="mapper.BlocMapper">
<resultMap id="BaseResultMap" type="model.Bloc" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="intro" property="intro" jdbcType="VARCHAR" />
<association column="company_id" property="company" select="mapper.CompanyMapper.getCompanyInfo">
</association>
</resultMap>
<select id="getBlocList" parameterType="String" resultMap="BaseResultMap">
select * from bloc where name = #{name}
</select>
</mapper>
column:表中的字段 property:實(shí)體當(dāng)中的字段名 select:引入的另一個(gè)xxxMapper.xml的getCompanyInfo方法
這樣當(dāng)查詢(xún)用的映射時(shí)檢測(cè)到有select就會(huì)執(zhí)行你引入的另一個(gè)Mapper的查詢(xún)方法,查詢(xún)條件是company_id= 查詢(xún)方法的參數(shù)
運(yùn)行結(jié)果
companyName =
形式二:關(guān)聯(lián)查詢(xún)
映射配置實(shí)體測(cè)試類(lèi)一樣:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.BlocMapper">
<resultMap id="BaseResultMap" type="model.Bloc" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="intro" property="intro" jdbcType="VARCHAR" />
<!-- 查詢(xún)會(huì)有賦值紊亂問(wèn)題 -->
<association column="company_id" property="company" resultMap = "mapper.CompanyMapper.BaseResultMap">
</association>
<!-- <association column="company_id" property="company" select="mapper.CompanyMapper.getCompanyInfo">
</association> -->
</resultMap>
<select id="getBlocList" parameterType="String" resultMap="BaseResultMap">
<!-- select * from bloc where name = #{name} -->
<!-- 查詢(xún)會(huì)有賦值紊亂問(wèn)題 -->
select * from bloc b left join company c on b.company_id = c.id where b.name = #{name}
</select>
</mapper>
column:表中的字段 property:實(shí)體當(dāng)中的字段名 resultMap :引入另一個(gè)Mapper的映射
值得注意的是:因?yàn)槭乔短子成?,所以形式二在兩個(gè)實(shí)體字段名一樣的情況下會(huì)引發(fā)字段賦值的紊亂,例如兩個(gè)實(shí)體都有name 當(dāng)?shù)谝粋€(gè)實(shí)體name有值,第二個(gè)實(shí)體name沒(méi)有值的時(shí)候,查詢(xún)出來(lái)的結(jié)果是兩個(gè)實(shí)體name都有值,且都是一樣的為第一個(gè)實(shí)體的name值
運(yùn)行結(jié)果為
companyName = 宏偉集團(tuán)
顯然運(yùn)行結(jié)果不是我們想要的結(jié)果
以上簡(jiǎn)單的Demo希望能幫助初學(xué)Mybatis童鞋??!
這篇基于Mybatis映射的一點(diǎn)心得(分享)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Mybatis非配置原因,導(dǎo)致SqlSession was not registered for synchronization異常
- Mybatis的特點(diǎn)及優(yōu)點(diǎn)
- Mybatis 入門(mén)之MyBatis環(huán)境搭建(第一篇)
- Mybatis配置文件之動(dòng)態(tài)SQL配置備忘錄
- MyBatis通用的10種寫(xiě)法總結(jié)大全
- mybatis-plus實(shí)體類(lèi)中出現(xiàn)非數(shù)據(jù)庫(kù)映射字段解決辦法
- MyBatis映射文件resultMap元素中使用多個(gè)association的方法
- Mybatis自定義SQL的關(guān)系映射、分頁(yè)、排序功能的實(shí)現(xiàn)
- 解決mybatis映射結(jié)果集失效的問(wèn)題
- mybatis某些字段無(wú)法映射成功的解決
- MyBatis中的JdbcType映射使用詳解
- 解決mybatis 數(shù)據(jù)庫(kù)date 與 java中Date類(lèi)型映射問(wèn)題
相關(guān)文章
Hibernate用ThreadLocal模式(線(xiàn)程局部變量模式)管理Session
今天小編就為大家分享一篇關(guān)于Hibernate用ThreadLocal模式(線(xiàn)程局部變量模式)管理Session,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
springcloud?nacos動(dòng)態(tài)線(xiàn)程池Dynamic?tp配置接入實(shí)戰(zhàn)詳解
這篇文章主要為大家介紹了springcloud?nacos動(dòng)態(tài)線(xiàn)程池Dynamic?tp配置接入實(shí)戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Java SpringBoot安全框架整合Spring Security詳解
這篇文章主要介紹了Spring Boot整合Spring Security的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-09-09
詳解SpringMVC學(xué)習(xí)系列(6) 之 數(shù)據(jù)驗(yàn)證
這篇文章主要介紹了詳解SpringMVC學(xué)習(xí)系列(6) 之 數(shù)據(jù)驗(yàn)證 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-12-12
spring boot 項(xiàng)目利用Jenkins實(shí)現(xiàn)自動(dòng)化部署的教程詳解
這篇文章主要介紹了spring boot 項(xiàng)目利用Jenkins實(shí)現(xiàn)自動(dòng)化部署的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
Java中兩個(gè)List之間的比較方法(差集、交集和并集)
在業(yè)務(wù)的開(kāi)發(fā)過(guò)程中會(huì)經(jīng)常用到兩個(gè)List集合相互取值的情況,下面這篇文章主要給大家介紹了關(guān)于Java中兩個(gè)List之間的比較方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
Mybatis查詢(xún)Sql結(jié)果未映射到對(duì)應(yīng)得實(shí)體類(lèi)上的問(wèn)題解決
使用mybatis查詢(xún)表數(shù)據(jù)得時(shí)候,發(fā)現(xiàn)對(duì)應(yīng)得實(shí)體類(lèi)字段好多都是null,本文主要介紹了Mybatis查詢(xún)Sql結(jié)果未映射到對(duì)應(yīng)得實(shí)體類(lèi)上的問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02

