原始Dao开发
Mapper动态代理方式开发
数据库表
动态SQL语句
通过mybatis提供的各种标签实现动态拼接sql
<sql id="userinfocolumns">
uid,uname, upwd, ubir
</sql>
<select id="findByCond3" parameterType="map"
resultType="userinfo">
select <include refid="userinfocolumns"></include> from userinfo
<where>
<if test="uname!=null">
and uname=#{uname}
</if>
<if test="upwd!=null">
and upwd=#{upwd}
</if>
<if test="ids!=null">
and uid in
<foreach collection="ids" open="(" close=")" separator=","
item="id">
#{id}
</foreach>
</if>
</where>
</select>
测试
@Test
public void testfindByCond3() {
SqlSession session = sessionFactory.openSession();
UserInfoDao dao = session.getMapper(UserInfoDao.class);
Map<String, Object> params = new HashMap<String, Object>();
params.put("uname", "孙行者");
// params.put("upwd", "666666");
params.put("ids", new int[] { 2, 3, 7, 8 });
List<UserInfo> users = dao.findByCond3(params);
for (UserInfo userinfo : users) {
System.out.println(userinfo);
}
}
结果
mybatis多表查询
mybatis延迟加载策略
<?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>
<properties resource="jdbc.properties"></properties>
<!-- 延迟加载策略 -->
<settings>
<setting name="lazyLoadingEnabled" value="false"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<typeAliases>
<!-- 批量注册 -->
<package name="com.twy.pojo" />
</typeAliases>
<!-- 数据库的连接信息 -->
<environments default="development">
<!-- 环境一 -->
<environment id="development">
<!--JDBC(采用JDBC的方式来管理事务) MANAGED(由容器来管理事务的生命周期, spring) -->
<transactionManager type="JDBC"></transactionManager>
<!-- UNPOOLED(不使用连接池) POOLED(使用连接池) JNDI(通过JNDI容器获取数据库连接) -->
<dataSource type="POOLED">
<!-- db连接四要素 -->
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.uname}" />
<property name="password" value="${jdbc.upwd}" />
</dataSource>
</environment>
</environments>
<!-- 映射文件信息 -->
<mappers>
<package name="com.twy.dao"/>
</mappers>
</configuration>
直接加载 lazyLoadingEnabled=false aggressiveLazyLoading=false
不论什么情况下,查询部门总是查询出员工,即使你没用使用员工信息
@Test
public void testFindByPk2() {
SqlSession session = sf.openSession();
DeptDao dao = session.getMapper(DeptDao.class);
Dept dept = dao.findByPk2(1);
}
侵入式延迟 lazyLoadingEnabled=true aggressiveLazyLoading=true 查询部门的时候员工没有查询出来 我们操作部门数据的时候(没有操作员工数据)员工数据查询出来了
@Test
public void testFindByPk2() {
SqlSession session = sf.openSession();
DeptDao dao = session.getMapper(DeptDao.class);
Dept dept = dao.findByPk2(1);
}
@Test
public void testFindByPk2() {
SqlSession session = sf.openSession();
DeptDao dao = session.getMapper(DeptDao.class);
Dept dept = dao.findByPk2(1);
// 操作部门数据 主要没有操作员工数据
System.out.println(dept.getDname());
}
深度延迟加载 lazyLoadingEnabled=true aggressiveLazyLoading=false 查询部门的时候员工没有查询出来 我们操作部门数据的时候(没有操作员工数据)员工数据也没有查询出来了 只要操作了员工数据 员工数据才查询出来
@Test
public void testFindByPk2() {
SqlSession session = sf.openSession();
DeptDao dao = session.getMapper(DeptDao.class);
Dept dept = dao.findByPk2(1);
// 操作部门数据 主要没有操作员工数据
System.out.println(dept.getDname());
// 操作员工数据
System.out.println(dept.getEmps());
}
mybatis缓存机制
一级缓存:缓存范围SQLSession(默认开启,无法关闭,增删改会清空一级缓存)
二级缓存:mybatis二级缓存是Application级别的缓存,它可以提高对数据库查询效率,以提高应用的性能
<?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.twy.dao.EmpDao">
<cache></cache><!-- 开启二级缓存 -->
<resultMap type="emp" id="empMap">
<id property="eid" column="eid"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<association property="dept" javaType="dept" column="did">
<id property="did" column="did"/>
<id property="dname" column="dname"/>
<id property="loc" column="loc"/>
</association>
</resultMap>
<!-- useCache="false" 单独关闭当前查询的二级缓存 -->
<select id="findByPk" parameterType="int" useCache="false" resultMap="empMap">
select * from emp as e,dept as d where e.did=d.did and e.eid=#{eid}
</select>
<resultMap type="emp" id="empMap2">
<id property="eid" column="eid"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<association property="dept" javaType="dept" column="did" select="findDept">
</association>
</resultMap>
<select id="findByPk2" parameterType="int" resultMap="empMap2" >
select * from emp as e where e.eid=#{eno}
</select>
<select id="findDept" parameterType="int" resultType="dept" >
select * from dept where did=#{dno}
</select>
</mapper>
注意实体类要实现Serializable接口
二级缓存使用原则
1、只能在一个名称空间下使用二级缓存
2、在单表上使用二级缓存
3、查询多于修改是使用二级缓存