基于Mybatis映射的一點心得(分享)
以前一直使用Hibernate,基本上沒用過Mybatis,工作中需要做映射關(guān)系,簡單的了解下Mybatis的映射。
兩者相差不多都支持一對一,一對多,多對多,本章簡單介紹一對一的使用以及注意點。
建表語句:
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', '宏偉集團', '1', '跨國集團');
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);
形式一:子查詢
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; } }
映射配置如下:(如果是一堆多的話“brandObject”改成實體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:實體當(dāng)中的字段名 select:引入的另一個xxxMapper.xml的getCompanyInfo方法
這樣當(dāng)查詢用的映射時檢測到有select就會執(zhí)行你引入的另一個Mapper的查詢方法,查詢條件是company_id= 查詢方法的參數(shù)
運行結(jié)果
companyName =
形式二:關(guān)聯(lián)查詢
映射配置實體測試類一樣:
<?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" /> <!-- 查詢會有賦值紊亂問題 --> <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} --> <!-- 查詢會有賦值紊亂問題 --> select * from bloc b left join company c on b.company_id = c.id where b.name = #{name} </select> </mapper>
column:表中的字段 property:實體當(dāng)中的字段名 resultMap :引入另一個Mapper的映射
值得注意的是:因為是嵌套映射,所以形式二在兩個實體字段名一樣的情況下會引發(fā)字段賦值的紊亂,例如兩個實體都有name 當(dāng)?shù)谝粋€實體name有值,第二個實體name沒有值的時候,查詢出來的結(jié)果是兩個實體name都有值,且都是一樣的為第一個實體的name值
運行結(jié)果為
companyName = 宏偉集團
顯然運行結(jié)果不是我們想要的結(jié)果
以上簡單的Demo希望能幫助初學(xué)Mybatis童鞋?。?/p>
這篇基于Mybatis映射的一點心得(分享)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Mybatis非配置原因,導(dǎo)致SqlSession was not registered for synchronization異常
- Mybatis的特點及優(yōu)點
- Mybatis 入門之MyBatis環(huán)境搭建(第一篇)
- Mybatis配置文件之動態(tài)SQL配置備忘錄
- MyBatis通用的10種寫法總結(jié)大全
- mybatis-plus實體類中出現(xiàn)非數(shù)據(jù)庫映射字段解決辦法
- MyBatis映射文件resultMap元素中使用多個association的方法
- Mybatis自定義SQL的關(guān)系映射、分頁、排序功能的實現(xiàn)
- 解決mybatis映射結(jié)果集失效的問題
- mybatis某些字段無法映射成功的解決
- MyBatis中的JdbcType映射使用詳解
- 解決mybatis 數(shù)據(jù)庫date 與 java中Date類型映射問題
相關(guān)文章
Hibernate用ThreadLocal模式(線程局部變量模式)管理Session
今天小編就為大家分享一篇關(guān)于Hibernate用ThreadLocal模式(線程局部變量模式)管理Session,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03springcloud?nacos動態(tài)線程池Dynamic?tp配置接入實戰(zhàn)詳解
這篇文章主要為大家介紹了springcloud?nacos動態(tài)線程池Dynamic?tp配置接入實戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12Java SpringBoot安全框架整合Spring Security詳解
這篇文章主要介紹了Spring Boot整合Spring Security的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-09-09詳解SpringMVC學(xué)習(xí)系列(6) 之 數(shù)據(jù)驗證
這篇文章主要介紹了詳解SpringMVC學(xué)習(xí)系列(6) 之 數(shù)據(jù)驗證 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2016-12-12spring boot 項目利用Jenkins實現(xiàn)自動化部署的教程詳解
這篇文章主要介紹了spring boot 項目利用Jenkins實現(xiàn)自動化部署的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-07-07Mybatis查詢Sql結(jié)果未映射到對應(yīng)得實體類上的問題解決
使用mybatis查詢表數(shù)據(jù)得時候,發(fā)現(xiàn)對應(yīng)得實體類字段好多都是null,本文主要介紹了Mybatis查詢Sql結(jié)果未映射到對應(yīng)得實體類上的問題解決,具有一定的參考價值,感興趣的可以了解一下2024-02-02