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

 更新时间:2016年08月30日 09:53:58   作者:葉子。  
这篇文章主要介绍了详解MyBatis的getMapper()接口、resultMap标签、Alias别名、 尽量提取sql列、动态操作的相关资料,需要的朋友可以参考下

一、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 mapper
PUBLIC "-//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一样
@Test
public void testSelectAll() {
SqlSession session = factory.openSession();
//用的是弱类型========实体类.小配置里面的Id名称============字符串
/*List<Dept> list = session.selectList("cn.happy.dao.IDeptDao.getAllDept");
for (Dept dept : list) {
System.out.println(dept.getDeptName());
}*/
// 用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 configuration
PUBLIC "-//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 mapper
PUBLIC "-//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 d
where e.deptNo=d.deptNo
</select>
</mapper>

第三步:测试类

//resultMap:实体的属性名和表的字段名保证一致用resultMap
//如果报NullException查看小配置的映射关联resultMap是否配置
@Test
public 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 d
where 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 mapper
PUBLIC "-//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 d
where 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>

第三步:测试

//动态查询
@Test
public 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 mapper
PUBLIC "-//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 e
where 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> 

  第三步:测试 

/**
* 动态修改
* */
@Test
public 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列、动态操作,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • SpringMVC中的ResourceUrlProviderExposingInterceptor详解

    SpringMVC中的ResourceUrlProviderExposingInterceptor详解

    这篇文章主要介绍了SpringMVC中的ResourceUrlProviderExposingInterceptor详解,ResourceUrlProviderExposingInterceptor是Spring MVC的一个HandlerInterceptor,用于向请求添加一个属性,需要的朋友可以参考下
    2023-12-12
  • 基于Java SWFTools实现把pdf转成swf

    基于Java SWFTools实现把pdf转成swf

    这篇文章主要介绍了基于Java SWFTools实现把pdf转成swf,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 通过Java实现对PDF页面的详细设置

    通过Java实现对PDF页面的详细设置

    这篇文章主要介绍了通过Java实现对PDF页面的详细设置,下面的示例将介绍通过Java编程来对PDF页面进行个性化设置的方法,包括设置页面大小、页边距、纸张方向、页面旋转等,需要的朋友可以参考下
    2019-07-07
  • Java实现日志文件监听并读取相关数据的方法实践

    Java实现日志文件监听并读取相关数据的方法实践

    本文主要介绍了Java实现日志文件监听并读取相关数据的方法实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 双token实现token超时策略示例

    双token实现token超时策略示例

    用于restful的app应用无状态无sesion登录示例,需要的朋友可以参考下
    2014-02-02
  • SpringMVC+ZTree实现树形菜单权限配置的方法

    SpringMVC+ZTree实现树形菜单权限配置的方法

    本篇文章主要介绍了SpringMVC+ZTree实现树形菜单权限配置的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Flutter实现文本组件、图标及按钮组件的代码

    Flutter实现文本组件、图标及按钮组件的代码

    这篇文章主要介绍了Flutter实现文本组件、图标及按钮组件的代码,本文给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-07-07
  • 从零构建可视化jar包部署平台JarManage教程

    从零构建可视化jar包部署平台JarManage教程

    这篇文章主要为大家介绍了从零构建可视化jar包部署平台JarManage教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • SpringBoot整合Thymeleaf与FreeMarker视图层技术

    SpringBoot整合Thymeleaf与FreeMarker视图层技术

    在目前的企业级应用开发中,前后端分离是趋势,但是视图层技术还占有一席之地。Spring Boot 对视图层技术提供了很好的支持,福安防推荐使用的模板引擎是Thymeleaf,不过想FreeMarker也支持,JSP技术在这里并不推荐使用
    2022-08-08
  • JAVACORE与HEAPDUMP生成方法

    JAVACORE与HEAPDUMP生成方法

    JavaCore文件主要保存的是Java应用各线程在某一时刻的运行的位置,即JVM执行到哪一个类、哪一个方法、哪一个行上,它是一个文本文件,打开后可以看到每一个线程的执行栈,以stack trace的显示,本文介绍JAVACORE与HEAPDUMP生成大法,感兴趣的朋友跟随小编一起看看吧
    2024-08-08

最新评论