如果方法返回值是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,可以用来更为简单地使用分页查询