目录
SQL映射是Mybatis框架最具特色的部分,功能强大且简单。
参数传递
1. 直接传递:使用 @param注解 为参数命名
Mapper接口
/**
* 根据ID查询用户信息
* @param id
* @return
*/
User searchById(@Param("id") Integer id);
UserMapper.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="mapper.SysUserDemoMapper">
<sql id="baseColumn">
u.id,u.account,u.realName,u.roleId,r.roleName,u.sex,(YEAR(NOW())-YEAR(u.birthday)) age,u.phone
</sql>
<select id="searchById" resultType="User">
select
<include refid="baseColumn"></include>
from t_sysuser u,t_sysrole r
where u.roleId=r.id
and u.id=#{id}
</select>
</mapper>
测试类
package mapper;
import pojo.SysUser;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class SysUserMapperTest {
private Logger logger=Logger.getLogger(SysUserMapperTest.class);
@Test
public void searchById()throws Exception {
//1. 读取MyBatis框架的核心配置文件
String resource= "mybatis-config.xml";
//获取对mybatis-config.xml的输入流
InputStream is= Resources.getResourceAsStream(resource);
//2.使用SqlSessionFactoryBuilder 读取配置文件并构建
// SqlSessionFactory实例
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
//3. 执行
SqlSession sqlSession = factory.openSession();
//4. 创建UserMapper接口实例,调用其方法执行相关的Sql语句
User user = sqlSession.getMapper(SysUserDemoMapper.class).searchById(1);
System.out.println(user .toString());
//5. 关闭SqlSession
sqlSession.close();
}
}
2. 对象传递
/**
* 新增用户信息
* @param user
* @return
*/
int addUser(User user);
<insert id="addUser" parameterType="User">
INSERT INTO `t_sysuser`
(`account`, `realName`, `sex`, `birthday`, `phone`, `roleId`)
VALUES (#{account}, #{realName}, #{sex}, #{birthday},#{phone}, #{roleId});
</insert>
3. Map集合传递:key--value的形式。key的值要跟#{}里面的属性一样
/**
* 根据ID查询用户信息
* @param map
* @return
*/
User searchByIdMap(Map<String,Integer> map);
<select id="searchByIdMap" resultType="User" parameterType="java.util.Map">
select
<include refid="baseColumn"></include>
from t_sysuser u,t_sysrole r
where u.roleId=r.id
and u.id=#{id}
</select>
SQL映射文件的顶级元素
- mapper:SQL映射文件的根元素,有一个namespace属性
- cache:配置给定命名空间的缓存
- cache-ref:从其他命名空间引用缓存配置
- resultMap:用来描述数据库结果集和对象的对应关系
- sql:可以重用的SQL块,也可以被其他语句引用
- insert:映射插入语句
- update:映射更新语句
- delete:映射删除语句
- select:映射查询语句
mapper
<mapper>是SQL映射文件的根元素,它用于指定命名空间和其他配置信息。
常见的属性:
- namespace:指定Mapper接口的全限定名,用于与Mapper接口进行关联。
- mapUnderscoreToCamelCase:可选属性,用于指定是否将数据库列名的下划线格式转换为 Java属性的驼峰命名格式。
- autoMapping:可选属性,用于指定是否开启延迟加载。
- lazyLoadingEnabled:可选属性,用于指定是否开启延迟加载
- cache:可选属性,用于指定Mapper的二级缓存。
resultMap (结果映射)
用于将查询结果映射到Java对象或者其他数据结构中。(一般用于多张表)
resultMap元素的属性
- id:resultMap的唯一标识
- type:映射的结果类型
resultMap元素的子元素
- id:指定和数据表主键字段对应的标识属性 设置此项可提高MyBatis性能
- result:指定结果集字段和实体类属性的映射关系
- association:映射“多对一”或“一对一”关系
- collection:映射“一对多”关系
<resultMap id="userSysRole" type="SysUser">
<!--主键的映射关系 column:列名(数据库列名) property:属性名(与实体类类名一致)-->
<id property="id" column="id"></id>
<result property="realName" column="realName"></result>
<association property="sysRole" javaType="SysRole">
<id property="id" column="rid"></id>
<result property="roleName" column="roleName"></result>
</association>
</resultMap>
<select id="getUserListByRoleId" parameterType="java.lang.Integer" resultMap="userSysRole">
select u.*,r.id as rid,r.roleName from t_sysuser u,t_sysrole r
where u.roleId=#{roleId} and u.roleId = r.id
</select>
package mapper;
import pojo.SysUser;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class SysUserMapperTest {
private Logger logger=Logger.getLogger(SysUserMapperTest.class);
@Test
public void searchById()throws Exception {
//1. 读取MyBatis框架的核心配置文件
String resource= "mybatis-config.xml";
//获取对mybatis-config.xml的输入流
InputStream is= Resources.getResourceAsStream(resource);
//2.使用SqlSessionFactoryBuilder 读取配置文件并构建
// SqlSessionFactory实例
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
//3. 执行
SqlSession sqlSession = factory.openSession();
//4. 创建UserMapper接口实例,调用其方法执行相关的Sql语句
List<SysUser> userList=sqlSession.getMapper(SysUserMapper.class).getUserListByRoleId(2);
if (userList!=null) {
for (SysUser users:userList) {
logger.debug("userId:"+users.getId()
+",and realName:"+users.getRealName()
+",and roleId:"+users.getSysRole().getId()
+",and roleName:"+users.getSysRole().getRoleName());
}
}
//5. 关闭SqlSession
sqlSession.close();
}
}
自动映射
用于将查询结果自动映射到实体类对象中的属性上,而无需手动配置每个属性的映射关系。
<settings>
<setting name="autoMappingBehavior" value="FULL" />
</settings>
配置完之后则自动将查询结果的值映射到对应的属性上。
cache
是指将查询结果缓存在内存中,以提高查询性能的机制。
Mybatis提供了两级存换:①一级缓存 (本地缓存)
②二级缓存 (全局缓存)
1 . 一级缓存
一级缓存是默认开启的,它是SqlSession级别的缓存,也就是说在同一个SqlSession中。在同一个方法中,如果执行了相同的查询语句,那么第二次及以后得查询会直接从缓存中获取结果,而不是去数据库查。当SqlSession关闭或者提交了事物,缓存内容就会被清空。
@Test
public void getUserList()throws Exception {
SqlSession sqlSession = getSqlSession();
//4. 创建SysUserMapper接口实例,调用其方法执行相关的Sql语句
List<SysUser> userList =sqlSession.getMapper(SysUserMapper.class).getUserList();
List<SysUser> userList2 =sqlSession.getMapper(SysUserMapper.class).getUserList();
System.out.println(userList.toString());
System.out.print(userList2.toString());
//5. 关闭SqlSession
sqlSession.close();
}
/**
* 封装方法
* @return
* @throws IOException
*/
private static SqlSession getSqlSession() throws IOException {
//1. 读取MyBatis框架的核心配置文件
String resource= "mybatis-config.xml";
//获取对mybatis-config.xml的输入流
InputStream is= Resources.getResourceAsStream(resource);
//2.使用SqlSessionFactoryBuilder 读取配置文件并构建
// SqlSessionFactory实例
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
//3. 执行
return factory.openSession();
}
注意:一旦关闭SqlSession或者提交事物,缓存内容就会被清空了!!
2 . 二级缓存
二级缓存是全局缓存,它可以被多个SqlSession共享。当多个SqlSession执行相同的查询,第一个SqlSession会将查询结果缓存到二级缓存中,后续的SqlSession可以直接从缓存中获取结果。如果要使用二级缓存,则需要开启二级缓存。
- 开启二级缓存的条件也是比较简单,通过直接在 MyBatis 配置文件中通过
<!-- 通知 MyBatis 框架开启二级缓存 -->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
- 在SQL映射文件中设置缓存,默认情况下是没有开启缓存的
<cache eviction="FIFO" flushInterval="60000"
size="512" readOnly="true" />
-
flushinterval
缓存刷新间隔,缓存多长时间刷新一次,默认不清空,设置一个毫秒值 -
readOnly
: 是否只读;true 只读,MyBatis 认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。MyBatis 为了加快获取数据,直接就会将数据在缓存中的引用交给用户。不安全,速度快。读写(默认):MyBatis 觉得数据可能会被修改 -
size
: 缓存存放多少个元素 -
type
: 指定自定义缓存的全类名(实现Cache 接口即可) -
blocking
: 若缓存中找不到对应的key,是否会一直blocking,直到有对应的数据进入缓存。