gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章详解MyBatis的getMapper()接口、resultMap标签、Alias别名、 尽量提取sql列、动态操作由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

1、getMapper()接口 。

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

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

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

     相当于是一个强类型 。

Eg 。

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

?
1
2
3
4
5
6
7
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接口 。

?
1
2
3
4
5
6
7
8
9
<?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是一个强类型 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 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());
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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>

2、resultMap标签 。

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

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

  第一步:创建一个接口 。

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

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

  解析: 员工角度 多的一方,嵌入一的一方的各个属性请使用association 是关联(如果去掉association的话就是基础的resultMap) 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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>

第三步:测试类 。

?
1
2
3
4
5
6
7
8
9
10
11
12
//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();
}

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

3、提取sql列 。

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

?
1
2
3
4
5
6
7
8
9
<!-- 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>

4、Alias别名 。

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

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

5、动态操作 。

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

?
1
2
3
4
if
   choose(when,otherwise)
   where
   set

Eg  查看在北京城市的人员 。

  第一步:接口 。

?
1
2
3
4
5
6
7
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" ?> 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!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>

第三步:测试 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
//动态查询
@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    修改部门信息 。

  第一步:接口 。

  第二步:小配置 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?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>

  第三步:测试  。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 动态修改
* */
@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列、动态操作,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。

原文链接:http://www.cnblogs.com/yejiaojiao/archive/2016/08/29/5818002.html 。

最后此篇关于详解MyBatis的getMapper()接口、resultMap标签、Alias别名、 尽量提取sql列、动态操作的文章就讲到这里了,如果你想了解更多关于详解MyBatis的getMapper()接口、resultMap标签、Alias别名、 尽量提取sql列、动态操作的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com