Mybatis连接池:
Mybatis 将它自己的数据源分为三类:
UNPOOLED
: 不使用连接池的数据源
POOLED
: 使用连接池的数据源(常用)
JNDI
: 使用 JNDI 实现的数据源(JNDI:MyBatis 会从服务器上查找 DataSource 实例,然后返回使用,如:tomcat是使用dhcp)
而调用连接池的方式还是使用传统的java.sql.DataSource接口实现
数据源配置在 SqlMapConfig.xml 文件中, 具体配置如下:
<!-- 配置数据源(连接池)信息 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
缓存
Mybatis 中缓存分为
一级缓存
一级缓存是 SqlSession 级别的缓存,只要 SqlSession 没有 flush 或 close,它就存在。
sqlSession.clearCache();//此方法也可以清空缓存
一级缓存是 SqlSession 范围的缓存,当调用 SqlSession 的修改,添加,删除, commit(), close()等
二级缓存
第一步:在 SqlMapConfig.xml 文件开启二级缓存
<settings>
<!-- 开启二级缓存的支持 -->
<setting name="cacheEnabled" value="true"/>
</settings>
因为cacheEnabled
的取值默认就为 true
,所以这一步可以省略不配置。为 true
代表开启二级缓存;为false 代表不开启二级缓存
配置实体类相关的 Mapper 映射文件
<cache>标签表示当前这个 mapper 映射将使用二级缓存,区分的标准就看 mapper 的 namespace 值。
<?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.itheima.dao.IUserDao">
<!-- 开启二级缓存的支持 -->
<cache></cache>
</mapper>
配置 Mapper上面的 useCache 属性
<!-- 根据 id 查询 -->
<select id="findById" resultType="user" parameterType="int" useCache="true">
select * from user where id = #{uid}
</select>
将 UserDao.xml 映射文件中的<select>标签中设置 useCache=”true”代表当前这个 statement 要使用
二级缓存,如果不使用二级缓存可以设置为 false。
注意: 针对每次查询都需要最新的数据 sql,要设置成 useCache=false,禁用二级缓存。
动态Sql
当我们不使用动态Sql去配置查询时,数据量一多就容易,代码就会显得繁琐复杂,
所以Mybatis为我们提供了动态sql的配置。
动态sql:自动拼接sql语句
IUserDao.java
/**
* 根据queryvo中提供的id集合,查询用户信息
* @param vo
* @return
*/
List<User> findUserInIds(QueryVo vo);
QueryVo.java
package com.itheima.domain;
import java.util.List;
/**
* 一个帮助类
*/
public class QueryVo {
private User user;
private List<Integer> ids;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}
}
IUserDao.xml
<!-- 了解的内容:抽取重复的sql语句-->
<sql id="defaultUser">
select * from user
</sql>
<!-- 根据queryvo中的Id集合实现查询用户列表 -->
<select id="findUserInIds" resultMap="userMap" parameterType="queryvo">
<include refid="defaultUser"></include>//这里是配置了sql语句抽取的注入
<where>
<if test="ids != null and ids.size()>0">
<foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
#{uid}
</foreach>
</if>
</where>
</select>
where
标签相当于sql
语句的where,
可以不用每次使用标签时都用where1=1