MyBatis级联一对一与一对多
1.概述
在一個人申請某些賬號或者權(quán)限的時候,比如微信的認(rèn)證流程。
會讓你一步一步按要求輸入,比如第一步:點(diǎn)擊微信認(rèn)證,第二步:認(rèn)證聯(lián)系人信息填寫;最后一步:填寫公眾號名稱、功能介紹、選擇運(yùn)營地區(qū)就。
當(dāng)你在填寫完第二步退出之后,再重新登錄會發(fā)現(xiàn)第一步的信息已經(jīng)記錄了。
這里至少要設(shè)計四張表,流程表和每一步的表,都是主鍵一一關(guān)聯(lián),這是一對一。
又或者如其他平臺的企業(yè)版的認(rèn)證,可以添加下級的機(jī)構(gòu),這就是一對多了。
mybatis是通過映射sql語句把關(guān)系模型(數(shù)據(jù)庫中的表)與領(lǐng)域模型(java中的實(shí)體類)關(guān)聯(lián)起的1.1級聯(lián):
簡單分析級聯(lián)查詢:關(guān)系模型中:表與表只有主外鍵關(guān)聯(lián)
領(lǐng)域模型中:實(shí)體類與實(shí)體類這間關(guān)聯(lián),只有一和多的關(guān)系。
一是指別一個實(shí)體類以對象屬性存在當(dāng)前實(shí)體類中。
多是指別一個實(shí)體類以集合對象屬性存在當(dāng)前實(shí)體類中。
mybatis的級聯(lián)分為三種:
鑒別器(discriminator):它是根據(jù)某些條件決定采用具體實(shí)現(xiàn)類級聯(lián)的方案,比如體檢表要根據(jù)性別去區(qū)分。
一對一(association):比如學(xué)生證和學(xué)生就是一對一的級聯(lián),雇員和工牌也是一種一對一的級聯(lián)。
一對多(collection):比如班主任和學(xué)生就是一種一對多的級聯(lián)。
2.一對一(association):
這里至少要設(shè)計四張表,流程表和每一步的表,都是主鍵一一關(guān)聯(lián),這是一對一。
mybatis構(gòu)建
2.1在數(shù)據(jù)庫中創(chuàng)建部門表dept和員工表emp
drop database if exists mydb; -- 創(chuàng)建數(shù)據(jù)庫 create database mydb; -- 使用數(shù)據(jù)庫 use mydb;#部門表 drop table if exists dept; create table dept(did int primary key,dname varchar(20),dinfo varchar(50) );insert into dept values(101,'市場部','負(fù)責(zé)公司市場的開拓'); insert into dept values(102,'產(chǎn)品部','負(fù)責(zé)公司產(chǎn)品的營銷'); insert into dept values(103,'研發(fā)部','負(fù)責(zé)公司產(chǎn)品的研發(fā)'); insert into dept values(104,'測試部','負(fù)責(zé)公司產(chǎn)品的測試');select * from dept;-- 員工表 drop table if exists emp; create table emp( eid int primary key AUTO_INCREMENT, ename varchar(20), dept varchar(20), job varchar(20), sal double, phone varchar(11), address varchar(100), did int );insert into emp(ename,dept,job,sal,phone,address,did)values('張翠萍','測試部','測試工程師',5800,'15821563548','鄭州',101); insert into emp(ename,dept,job,sal,phone,address,did)values('李耀菲','測試部','測試經(jīng)理',9800,'13658942168','許昌',101); insert into emp(ename,dept,job,sal,phone,address,did)values('王長林','研發(fā)部','開發(fā)工程師',8800,'13954865721','南陽',102); insert into emp(ename,dept,job,sal,phone,address,did)values('陳清泰','研發(fā)部','開發(fā)經(jīng)理',14900,'13785463249','洛陽',102); insert into emp(ename,dept,job,sal,phone,address)values('趙德保','運(yùn)維部','運(yùn)維工程師',5200,'15785642139','信陽'); insert into emp(ename,dept,job,sal,phone,address)values('劉瑞琳','運(yùn)維部','產(chǎn)品經(jīng)理',12600,'17956248563','商丘');select * from emp; select * from emp inner join dept on emp.did=dept.did where eid=12.2在idea中導(dǎo)入jar包,配置mybatis.xml配置文件
一對一:
外部文件
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mydb jdbc.username=root jdbc.password=root日志打印
log4j.rootLogger=TRACE,stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender #log4j.appender.stdout.Target=System.err log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout log4j.appender.logfile=org.apache.log4j.FileAppender log4j.appender.logfile.File=wocao.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %F %p %m%n log4j.logger.mapperNS =TRACElog4j.logger.com.mybatis=DEBUG log4j.logger.com.mybatis.common.jdbc.SimpleDataSource=DEBUG log4j.logger.com.mybatis.common.jdbc.ScriptRunner=DEBUG log4j.logger.com.mybatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.org.springframework=error log4j.logger.org.apache=ERROR log4j.logger.org.mybatis=DEBUGmybatis.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><properties resource="jdbc.properties" /><settings><setting name="logImpl" value="log4j"/></settings><typeAliases><package name="com.zhao.bean"/></typeAliases><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment><environment id="oracle"><transactionManager type=""></transactionManager><dataSource type=""></dataSource></environment></environments><mappers><package name="com.zhao.dao"/></mappers> </configuration>2.3部門表dept
接口
package com.chen.dao;import com.chen.bean.Dept;public interface DeptDao {Dept selectByDid(int did); }映射
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.chen.dao.DeptDao"><select id="selectByDid" parameterType="int" resultType="com.chen.bean.Dept">select * from dept where did=#{did};</select> </mapper>2.4員工表emp
接口
package com.chen.dao;import com.chen.bean.Emp;import java.util.List;public interface EmpDao {Emp selectBuEid(int eid);List<Emp> selectAll(); }association標(biāo)簽配置一對一級聯(lián)
property:對應(yīng)實(shí)體類中的屬性名名,必填項(xiàng)。
javaType:屬性對應(yīng)的Java類型
resultMap:可以直接使用現(xiàn)有的 resultMap,而不需要在這里配置。
映射
方法一:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.chen.dao.EmpDao"><!--定義手動映射關(guān)系:數(shù)據(jù)庫中字段 和 類的屬性 的映射--><resultMap id="empMap" type="com.chen.bean.Emp"><id property="eid" column="eid" /><result property="ename" column="ename" /><result property="job" column="job" /><result property="sal" column="sal" /><result property="phone" column="phone" /><result property="address" column="address" /><!--一對一的映射配置association: 自動關(guān)聯(lián)查詢:根據(jù)外鍵did執(zhí)行dept表的關(guān)聯(lián)查詢,把查詢出來部門信息封裝到emp的dept屬性--><association column="did" select="com.chen.dao.DeptDao.selectByDid" property="dept"></association></resultMap><select id="selectBuEid" parameterType="int" resultMap="empMap">select * from emp where eid=#{eid}</select><select id="selectAll" resultMap="empMap">select * from emp</select> </mapper>方法二:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.chen.dao.EmpDao"><!--定義手動映射關(guān)系:數(shù)據(jù)庫中字段 和 類的屬性 的映射--><resultMap id="empMap" type="com.chen.bean.Emp"><id property="eid" column="eid" /><result property="ename" column="ename" /><result property="job" column="job" /><result property="sal" column="sal" /><result property="phone" column="phone" /><result property="address" column="address" /><!--一對一的映射配置association: 手動映射配置emp中 dept對象中的屬性和表字段的對應(yīng)關(guān)系--><association property="dept" javaType="com.chen.bean.Dept"><id property="did" column="did"/><result property="dname" column="dname"/><result property="dinfo" column="dinfo"/></association></resultMap><select id="selectBuEid" parameterType="int" resultMap="empMap">select * from emp inner join dept on emp.did=dept.did where eid=#{eid};</select> </mapper>2.5測試類
一對一測試類
package com.zhao.test;import com.zhao.bean.Emp; import com.zhao.dao.EmpDao; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test;import java.io.IOException; import java.io.InputStream; import java.util.List;public class EmpTest {InputStream stream=null;SqlSessionFactoryBuilder builder=null;SqlSessionFactory factory=null;SqlSession sqlSession=null;EmpDao empDao=null;@Beforepublic void init() throws IOException {stream= Resources.getResourceAsStream("mybatis.xml");builder=new SqlSessionFactoryBuilder();factory=builder.build(stream);sqlSession=factory.openSession();empDao=sqlSession.getMapper(EmpDao.class);}@Testpublic void testSelectByEid(){Emp emp = empDao.selectByEid(1);System.out.println(emp);}@Afterpublic void distory() throws IOException {sqlSession.commit();sqlSession.close();stream.close();} }控制臺打印日志信息:
3.一對多:
又或者如其他平臺的企業(yè)版的認(rèn)證,可以添加下級的機(jī)構(gòu),這就是一對多了。
外部文件和日志打印以及mybatis.xml配置文件如上2:
員工表emp
接口
package com.chen.dao;import com.chen.bean.Emp;import java.util.List;public interface EmpDao {Emp selectByEid(int eid);List<Emp> selectByDid(int did); }映射
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.chen.dao.EmpDao"><select id="selectByEid" parameterType="int" resultType="emp">select * from emp where eid=#{eid}</select><select id="selectByDid" parameterType="int" resultType="emp">select * from emp where did=#{did}</select> </mapper>部門表dept
接口
package com.chen.dao;import com.chen.bean.Dept;public interface DeptDao {Dept selectByDid(int did); }映射
collection標(biāo)簽配置一對多級聯(lián)
方法一:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.chen.dao.DeptDao"><resultMap id="deptMap" type="com.chen.bean.Dept"><id property="did" column="did" /><result property="dname" column="dname"/><result property="dinfo" column="dinfo"/><!--配置一對多關(guān)系:手動映射配置--><collection property="emps" ofType="com.chen.bean.Emp"><id property="eid" column="eid" /><result property="ename" column="ename" /><result property="job" column="job" /><result property="sal" column="sal" /><result property="phone" column="phone" /><result property="address" column="address" /></collection></resultMap><select id="selectByDid" parameterType="int" resultMap="deptMap">select * from dept inner join emp on dept.did=emp.did where dept.did=#{did};</select> </mapper>方法二:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.chen.dao.DeptDao"><resultMap id="deptMap" type="com.chen.bean.Dept"><id property="did" column="did" /><result property="dname" column="dname"/><result property="dinfo" column="dinfo"/><!--配置一對多關(guān)系:自動根據(jù)did去關(guān)聯(lián)查詢emp表中該did的信息--><collection column="did" select="com.chen.dao.EmpDao.selectByDid" property="emps"></collection></resultMap><select id="selectByDid" parameterType="int" resultMap="deptMap">select * from dept where did=#{did};</select> </mapper>測試類:
一對多測試類:
public class DeptTest {InputStream stream = null;SqlSessionFactoryBuilder builder = null;SqlSessionFactory factory = null;SqlSession sqlSession = null;DeptDao deptDao = null;@Beforepublic void init() throws IOException {stream = Resources.getResourceAsStream("mybatis.xml");builder = new SqlSessionFactoryBuilder();factory = builder.build(stream);sqlSession = factory.openSession();deptDao = sqlSession.getMapper(DeptDao.class);}@Testpublic void testSelectByDid(){Dept dept = deptDao.selectByDid(101);System.out.println(dept);}@Testpublic void testSelectAll(){List<Dept> deptList = deptDao.selectAll();for (Dept dept : deptList) {System.out.println(dept);}}@Afterpublic void destroy() throws IOException {sqlSession.commit();sqlSession.close();stream.close();} }控制臺日志信息:
總結(jié)
以上是生活随笔為你收集整理的MyBatis级联一对一与一对多的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分享一个小案例,用HMS Scankit
- 下一篇: c语言100列作业,C语言经典例题100