Mybatis使用入门,这一篇就够了 (4)

如果方法返回值是List,mapper中的resultType为泛型T

package com.wan.mapping; import com.wan.bean.Employee; import java.util.List; /** * @author StarsOne * @date Create in 2019/9/16 0016 20:38 * @description */ public interface EmployeeMapper { List<Employee> selectAll(); }

2. 编写mapper.xml

<?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="com.wan.mapping.EmployeeMapper"> <!--特例:返回值为list,resultType=bean类--> <select resultType="Employee" > select * from employee </select> </mapper>

3. 注册mapper

这里我们由于使用了package注册mapper,一定保证xxmapper.java和xxmapper.xml两个名字相同,大小写都要一样

保证Mapper.xml和接口的那个Mapper在相同的包路径,在mybatis配置xml文件指定

<?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> <!--省略数据源配置 -->... <!-- 注册SQL映射文件,在这些文件中写SQL语句 --> <mappers> <!--指定整个包中的全部Mapper --> <package/> </mappers> </configuration>

4. 使用

使用还是和之前一样,获得SqlSession对象,此对象有个getMapper方法,把接口类传入,就可以回调接口的方法了

Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader); SqlSession sqlSession = factory.openSession(); EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class); List<Employee> employees = mapper.selectAll();

接口类中的方法名与EmployeeMapper.xml中的对应

使用:

EmployeeMapper mapper = sqlsession.getMapper(EmployeeMapper.class); mapper.selectById(7369); 2.遍历列表

Mybatis中提供了foreach标签,用于遍历

如果方法参数传入了一个List,可以使用此标签遍历,例子如下:

<!--相当于select * from employee where job in (...)) --> <select parameterType="list" resultMap="baseResultMap"> select * from EMPLOYEE <where> <foreach item="job" collection="list" open="JOB IN(" close=")" separator=","> #{job} </foreach> </where> </select>

foreach标签的属性主要有 item,index,collection,open,separator,close,使用和JSTL标签里面的foreach标签差不多

属性名 说明
item   表示集合中每一个元素进行迭代时的别名  
index   指定一个名字,用于表示在迭代过程中,每次迭代到的位置,  
open   表示该语句以什么开始,  
separator   表示在每次进行迭代之间以什么符号作为分隔 符,  
close   表示以什么结束。  

关键属性:collection

如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key

参考:mybatis 中 foreach collection的三种用法

3.考虑线程安全

使用ThreadLocal对象,保证每个线程取出的SqlSession是同一个对象

方法 说明
void set(Object value)   设置当前线程的线程局部变量的值。  
public Object get()   该方法返回当前线程所对应的线程局部变量。  
public void remove()   将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。  
protected Object initialValue()   返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。  
static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); //设置 threadLocal.set(sqlsession); //取出 SqlSession s = threadLocal.get(); 嵌套查询 <!-- 结果集映射: 列《》属性名 --> <resultMap type="Employee"> <!-- 专门映射主键列 --> <id property="empno" column="EMPNO" /> <result property="ename" column="ENAME"/> <result property="job" column="JOB"/> <result property="mgr" column="MGR"/> <result property="hiredate" column="HIREDATE"/> <result property="sal" column="SAL"/> <result property="comm" column="COMM"/> <result property="deptno" column="DEPTNO"/> </resultMap> <!-- 扩展另一个结果映射 --> <resultMap type="Employee" extends="baseResultMap"> <association property="department" javaType="Department"> <!-- 关联的嵌套结果 --> <id property="deptno" column="DEPTNO"/> <result property="dname" column="DNAME"/> <result property="location" column="LOC"/> </association> </resultMap> <!-- 1.嵌套结果(推荐使用) 优点:性能好,一条语句把所有实体的数据完全查询出来。 缺点:对SQL编写的要求高了,因为涉及多表连接查询 --> <select resultMap="extendBaseResultMap" parameterType="int"> select e.EMPNO, e.ENAME, e.JOB, e.MGR, e.HIREDATE, e.SAL, e.COMM, d.DEPTNO, d.DNAME, d.LOC from EMPLOYEE E inner join DEPARTMENT D on E.DEPTNO = D.DEPTNO where E.EMPNO=#{id} </select> <!-- 2. 嵌套查询 优点:编写SQL简单,无需做多表的连接查询;关联的实体通过单独的SQL语句查询并单独封装。 缺点:执行了N+1条件语句。性能差 --> <resultMap type="Employee" extends="baseResultMap"> <association property="department" column="DEPTNO" select="selectDepartmentById" /> </resultMap> <select parameterType="int" resultType="Department"> select deptno, dname, loc as location from DEPARTMENT where DEPTNO=#{id} </select> <select resultMap="extendBaseResultMap_2" parameterType="int"> select e.EMPNO, e.ENAME, e.JOB, e.MGR, e.HIREDATE, e.SAL, e.COMM, e.DEPTNO from EMPLOYEE E where E.EMPNO=#{id} <!-- or e.empno=7902 or e.empno=7844 --> </select> 分页查询

分页的话,像以前那样使用三层嵌套查询也可以实现。

不过,有开发者为Mybatis开了个一个插件PageHelper,可以用来更为简单地使用分页查询

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zypgwj.html