MyBatis(下)

原始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、查询多于修改是使用二级缓存

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值