Mybatis框架总结(三)

第1章 Mybatis连接池与事务

1.1 Mybatis的连接池技术

1.1.1 Mybatis连接池分类

POOLED :使用连接池的数据源
UNPOOLED: 不使用连接池的数据源
JNDI:使用JNDI实现的数据源

1.1.2 Mybatis中数据源配置(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 在初始化时,根据<dataSource>的 type 属性来创建相应类型的的数据源 DataSource,即:
	type=”POOLED”:MyBatis 会创建 PooledDataSource 实例
	type=”UNPOOLED” : MyBatis 会创建 UnpooledDataSource 实例
	type=”JNDI”:MyBatis 会从 JNDI 服务上查找 DataSource 实例,然后返回使用

1.2 Mybatis的事务

1.2.1 Mybatis中事物的提交方式

Mybatis 中事务的提交方式,本质上就是调用 JDBC 的 setAutoCommit()来实现事务控制。

  • 为什么 CUD 过程中必须使用 sqlSession.commit()提交事务?
    主要原因就是在连接池中取出的连接,都会将调用 connection.setAutoCommit(false)方法,这样我们就必须使用 sqlSession.commit()方法,相当于使用了 JDBC 中的 connection.commit()方法实现事务提交。
  • 设置为自动提交方式为 false 再根据情况决定是否进行提交,这种方式更常用。因为我们可以根据业务情况来决定提交是否进行提交。

第2章 Mybatis的动态SQL语句

2.1 < if >标签

<select id="findByUser" resultType="user" parameterType="user">
	select * from user where 1=1
	<if test="username!=null and username != '' ">
		and username like #{username}
	</if> 
	<if test="address != null">
		and address like #{address}
	</if>
</select>

注意:标签的 test 属性中写的是对象的属性名,如果是包装类的对象要使用 OGNL 表达式的写法。
另外要注意 where 1=1 的作用~!

2.2 < where > 标签

简化上面 where 1=1 的条件拼装,我们可以采用标签来简化开发。

<!-- 根据用户信息查询 --> 
<select id="findByUser" resultType="user" parameterType="user"> 
	<include refid="defaultSql"></include> 
	<where> 
		<if test="username!=null and username != '' ">
			and username like #{username}
		</if> 
		<if test="address != null">
			and address like #{address}
		</if>
	</where>
</select>

2.3 标签

<!-- 查询所有用户在 id 的集合之中 --> 
<select id="findInIds" resultType="user" parameterType="queryvo">
<!-- select * from user where id in (1,2,3,4,5); --> 
	<include refid="defaultSql"></include> 
		<where> 
			<if test="ids != null and ids.size() > 0">
			<foreach collection="ids" open="id in ( " close=")" item="uid" separator=",">
					#{uid}
			</foreach>
			</if>
	    </where>
</select>
SQL 语句:
select 字段 from user where id in (?)
<foreach>标签用于遍历集合,它的属性:
	collection:代表要遍历的集合元素,注意编写时不要写#{}
	open:代表语句的开始部分
	close:代表结束部分
	item:代表遍历集合的每个元素,生成的变量名
	sperator:代表分隔符

2.4 Mybatis中简化编写的SQL片段

将重复的sql提取出来,使用include引用即可。

2.4.1 抽取重复代码块

<!-- 抽取重复的语句代码片段 --> 
	<sql id="defaultSql">
		select * from user
	</sql>

2.4.2 引用代码块

<!-- 配置查询所有操作findAll --> 
	<select id="findAll" resultType="user"> 
		<include refid="defaultSql"></include>
	</select>


<!-- 根据 id 查询 --> 
	<select id="findById" resultType="UsEr" parameterType="int">
		<include refid="defaultSql"></include>
			where id = #{uid}
	</select>

第3章 Mybatis多表查询一对多

3.1 一对一查询(多对一)

3.1.1 方式一:定义专门的PO类作为输出类型,其中定义了sql查询结果集所有的字段。(常用)

查询所有的账户信息,并关联查询出该账户下的用户信息

3.1.1.1 定义账户用户信息实体类(AccountUser)

  • 为了能够封装上面 SQL 语句的查询结果,定义 AccountCustomer 类中要包含账户信息同时还要包含用户信息,所以我们要在定义 AccountUser 类时可以继承 Account 类

3.1.1.2 定义账户的持久层Dao接口

3.1.1.3 定义AccountDao.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.itheima.dao.IAccountDao">
	<!-- 配置查询所有操作--> 
	<select id="findAll" resultType="accountuser">
		select a.*,u.username,u.address from account a,user u where a.uid =u.id;
	</select> 
</mapper>
注意:因为上面查询的结果中包含了账户信息同时还包含了用户信息,所以我们的返回值类型 returnType
的值设置为 AccountUser 类型,这样就可以接收账户信息和用户信息了。

进行测试。

3.1.2 方式二:使用 resultMap,定义专门的 resultMap 用于映射一对一查询结果。

3.1.2.1 修改Account类,在Account类中加入User类的对象作为Account类的一个属性。

3.1.2.2 重新定义AccountDao.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.itheima.dao.IAccountDao">
<!-- 建立对应关系 --> 
<resultMap type="account" id="accountMap"> 
	<id column="aid" property="id"/>
	<result column="uid" property="uid"/>
	<result column="money" property="money"/>
	<!-- 它是用于指定从表方的引用实体属性的 --> 
	<association property="user" javaType="user"> 
		<id column="id" property="id"/>
		<result column="username" property="username"/>
		<result column="sex" property="sex"/>
		<result column="birthday" property="birthday"/>
		<result column="address" property="address"/>
	</association>
</resultMap> 
	<select id="findAll" resultMap="accountMap">
		select u.*,a.id as aid,a.uid,a.money from account a,user u where a.uid =u.id;
</select>
</mapper>

进行测试。

3.2 一对多查询

查询所有用户信息及用户关联的账户信息(一个人可能有多个账户)
方式与一对一和多对一一致。使用方法二。

3.2.1 持久层Dao映射配置文件

<?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"> 
 	<resultMap type="user" id="userMap"> 
 		<id column="id" property="id"></id> 
 		<result column="username" property="username"/>
		<result column="address" property="address"/>
		<result column="sex" property="sex"/>
		<result column="birthday" property="birthday"/>
<!-- collection 是用于建立一对多中集合属性的对应关系ofType 用于指定集合元素的数据类型--> 
	<collection property="accounts" ofType="account"> 
		<id column="aid" property="id"/>
		<result column="uid" property="uid"/>
		<result column="money" property="money"/>
		</collection>
</resultMap>
<!-- 配置查询所有操作 --> 
	<select id="findAll" resultMap="userMap">
		select u.*,a.id as aid ,a.uid,a.money from user u left outer join account a on u.id =a.uid
	</select>
</mapper> 
collection
部分定义了用户关联的账户信息。表示关联查询结果集
property="accList":
关联查询的结果集存储在 User 对象的上哪个属性。
ofType="account":
指定关联查询的结果集中的对象类型即List中的对象类型。此处可以使用别名,也可以使用全限定名。
发布了37 篇原创文章 · 获赞 3 · 访问量 1540
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览