详解MyBatis的getMapper()接口、resultMap标签、Alias别名、 尽量提取sql列、动态操作

时间:2021-05-19

一、getMapper()接口

  解析:getMapper()接口 IDept.class定义一个接口,

     挂载一个没有实现的方法,特殊之处,借楼任何方法,必须和小配置中id属性是一致的

     通过代理:生成接口的实现类名称,在MyBatis底层维护名称$$Dept_abc,selectDeptByNo()

     相当于是一个强类型

Eg

  第一步:在cn.happy.dao中定义一个接口   

package cn.happy.dao;import java.util.List;import cn.happy.entity.Dept;public interface IDeptDao {//查看全部---------getAllDept要和小配置里面的id一样public List<Dept> getAllDept();}

  第二步:IDept.xml配置小配置

  解析:select里面的Id属性要和接口里面的接口方法名一样;mapper的namespace属性包名是cn.happy.dao.IDeptDao接口

<?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="cn.happy.dao.IDeptDao"><select id="getAllDept" resultType="cn.happy.entity.Dept">select * from Dept </select></mapper>

  第三步:测试类

  解析:查看全部信息有两种方法

     1)session.selectList("cn.happy.dao.IDeptDao.getAllDept");-------实体类.小配置里面的Id名称============字符串

     2)IDeptDao mapper = session.getMapper(IDeptDao.class);相当于实现类,getMapper是一个强类型

// 01查看全部信息getMapper()接口类的方法名要和小配置的id一样@Testpublic void testSelectAll() {SqlSession session = factory.openSession();//用的是弱类型========实体类.小配置里面的Id名称============字符串// 用getMapper方法HIbernate帮我们在内存中代理出一个接口的实现类======相当于强类型//mapper是一个实现类对象IDeptDao mapper = session.getMapper(IDeptDao.class);List<Dept> list = mapper.getAllDept();for (Dept dept : list) {System.out.println(dept.getDeptName());}

  第四步:全文统一用一个大配置

<?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><!-- Alias别名 小配置里面的type的属性值改成别名--><typeAliases><typeAlias type="cn.resultMap.enetity.Emp" alias="emp"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC" /><dataSource type="POOLED"><property name="driver" value="oracle.jdbc.OracleDriver" /><property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" /><property name="username" value="sa" /><property name="password" value="1" /></dataSource></environment></environments><!--映射文件:描述某个实体和数据库表的对应关系 --><mappers><mapper resource="cn/resultMap/enetity/Emp.xml" /></mappers></configuration>

二、resultMap标签

    解析:使用的场景是当实体类的属性与数据库不匹配的时候需要用到resultMap实体类和数据库的属性必须一致。(之前用的是实体类)

Eg检索所有员工,以及隶属部门

  第一步:创建一个接口

package cn.resultMap.dao;import java.util.List;import cn.resultMap.enetity.Emp;public interface IEmpDao {//检索所有员工,以及隶属部门public List<Emp> getAllEmps();}

第二步:配置小配置里面的属性

  解析: 员工角度 多的一方,嵌入一的一方的各个属性请使用association 是关联(如果去掉association的话就是基础的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="cn.resultMap.dao.IEmpDao"><resultMap type="cn.resultMap.enetity.Emp" id="empMap"><id property="empId" column="EMPID"/><result property="empName" column="EMPNAME"/><result property="empCity" column="EMPCITY"/><!-- 员工角度 多的一方,嵌入一的一方的各个属性请使用association --><association property="dept" javaType="cn.resultMap.enetity.Dept"><result property="deptName" column="DEPTNAME"/><result property="deptNo" column="DEPTNO"/></association></resultMap><select id="getAllEmps" resultMap="empMap">select e.*,d.* from Emp e,Dept dwhere e.deptNo=d.deptNo</select></mapper>

第三步:测试类

//resultMap:实体的属性名和表的字段名保证一致用resultMap//如果报NullException查看小配置的映射关联resultMap是否配置@Testpublic void testAllEmp(){SqlSession session=factory.openSession();IEmpDao mapper = session.getMapper(IEmpDao.class);List<Emp> allEmps = mapper.getAllEmps();for (Emp emp : allEmps) {System.out.println(emp.getEmpName()+"\t隶属部门"+emp.getDept().getDeptName());}session.close();}

第四步:在大配置引入小配置

三、提取sql列

  解析:Sql标签简化代码量在小配置里面写

<!-- SQl标签的使用 --><sql id="columns">d.deptNo,d.deptName</sql><!-- SQl标签的使用 --><select id="getAllEmps" resultMap="empMap">select e.*,<include refid="columns"/>from Emp e,Dept dwhere e.deptNo=d.deptNo</select>

四、Alias别名

    解析:在大配置上写,这样的话在小配置就可以引用别名了  

<!-- Alias别名 小配置里面的type的属性值改成别名--><typeAliases><typeAlias type="cn.resultMap.enetity.Emp" alias="emp"/></typeAliases>

五、动态操作

解析:用于实现动态SQL的元素主要有:

 if    choose(when,otherwise)    where     set

Eg  查看在北京城市的人员

  第一步:接口

package cn.resultMap.dao;import java.util.List;import cn.resultMap.enetity.Emp;public interface IEmpDao {//检索所有员工,以及隶属部门public List<Emp> getAllEmps();}

  第二步:小配<?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="cn.resultMap.dao.IEmpDao"><resultMap type="cn.resultMap.enetity.Emp" id="empMap"><id property="empId" column="EMPID"/><result property="empName" column="EMPNAME"/><result property="empCity" column="EMPCITY"/><!-- 员工角度 多的一方,嵌入一的一方的各个属性请使用association --><association property="dept" javaType="cn.resultMap.enetity.Dept"><result property="deptName" column="DEPTNAME"/><result property="deptNo" column="DEPTNO"/></association></resultMap><select id="getAllEmps" resultMap="empMap">select e.*,d.* from Emp e,Dept dwhere e.deptNo=d.deptNo</select><!--查询动态查询 --><select id="testAllEmpBuSelect" parameterType="cn.resultMap.enetity.Emp" resultType="cn.resultMap.enetity.Emp">select * from Emp<where><if test="empId!=null">and empId=#{empId}</if><if test="empName!=null">and empName=#{empName}</if><if test="empCity!=null">and empCity=#{empCity}</if></where></select></mapper>

第三步:测试

//动态查询@Testpublic void testSelect(){SqlSession session=factory.openSession();Emp emp=new Emp();//emp.setEmpName("331");emp.setEmpCity("sh");List<Emp> list = session.selectList("cn.resultMap.dao.IEmpDao.testAllEmpBuSelect",emp);for (Emp emps : list) {System.out.println(emps.getEmpName());}session.close();}

第四步:在大配置引入小配置

Eg    修改部门信息

  第一步:接口

  第二步:小配置

<?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="cn.resultMap.dao.IDeptDao"><resultMap type="cn.happy.entity.Dept" id="deptResultMap"><id property="deptNo" column="deptNo"/><result property="deptName" column="deptName"/></resultMap><select id="getAllDept" resultMap="deptResultMap">select d.*,e.* from Dept d,Emp ewhere d.deptNo=e.deptNo and d.deptNo=#{deptNo}</select><!--修改动态查询 --><select id="testUpdate" parameterType="int" resultType="cn.resultMap.enetity.Dept">update dept<set><if test="deptNo!=null">deptNo=#{deptNo},</if><if test="deptName!=null">deptName=#{deptName},</if></set>where deptNo=#{deptNo}</select></mapper>

  第三步:测试 

/*** 动态修改* */@Testpublic void testUpdate(){SqlSession session=factory.openSession();Dept dept=new Dept();dept.setDeptName("财务部");dept.setDeptNo(1);int count = session.update("cn.resultMap.dao.IDeptDao.testUpdate",dept);session.commit();System.out.println(count);session.close();}

以上所述是小编给大家介绍的详解MyBatis的getMapper()接口、resultMap标签、Alias别名、 尽量提取sql列、动态操作,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章