7.mybatis(Sql深入、多表查询、连接池与事务深入)

1、Mybatis的连接池与事务深入

(1)存储连接池的特征:存放在队列里结构的连接池

(2)我们不用连接池技术时:先初始化,然后再去调用driverManger

(3)Mybatis连接池将它自己的数据源分类:

l UNPOOLED 不使用连接池的数据源

l POOLED 使用连接池的数据源

l JNDI 使用JNDI实现的数据源

(4)JNDI

Jndi不仅仅存储数据源,目前理解为数据源,连接jnd的服务器启动时候才能创建,扔进连接池

:事务隔离级别

我在执行操作的时候是不是在使用一个连接。

(4)数据源的连接池的配置

(5)Mybatis中DataSource的存取

(6)Mybatis中连接的获取过程分析

1.2Mybatis的事务控制

1.2.1 JDBC中事务的回顾

JDBC中我们可以通过手动方式将事务的提交改为手动方式,通过setAutoCommit()方法就可以调整。

1.2.2 Mybatis中事务提交方式

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

1.2.3 Mybatis自动提交事务的设置

通过上面的研究和分析,现在我们一起思考,为什么CUD过程中必须使用sqlSession.commit()提交事务?主要原因就是在连接池中取出的连接,都会将调用connection.setAutoCommit(false)方法,这样我们就必须使用sqlSession.commit()方法,相当于使用了JDBC中的connection.commit()方法实现事务提交。

明白这一点后,我们现在一起尝试不进行手动提交,一样实现CUD操作。

 

 

2.Mybatis映射文件的SQL深入

Mybatis的映射文件中,前面我们的SQL都是比较简单的,有些时候业务逻辑复杂时,我们的SQL是动态变化的,此时在前面的学习中我们的SQL就不能满足要求了。

(1)动态SQL之<if>标签

我们根据实体类的不同取值,使用不同的SQL语句来进行查询。比如在id如果不为空时可以根据id查询,如果username不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。

(2)动态SQL之<where>标签

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

(3)动态标签之<foreach>标签

需求

传入多个id查询用户信息,用下边两个sql实现:

SELECT * FROM USERS WHERE username LIKE '%%' AND (id =10 OR id =89 OR id=16)

SELECT * FROM USERS WHERE username LIKE '%%' AND id IN (10,89,16)

这样我们在进行范围查询时,就要将一个集合中的值,作为参数动态添加进来。这样我们将如何进行参数的传递?

解决步骤:

  1. QueryVo中加入一个List集合用于封装参数
  2. 编写UserDao接口中方法
  3. UserDao.xml 文件添加范围查询的配置
  4. 编写测试方法

(4)Mybatis中简化(优化)编写的SQL语句:

Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的。

我们先到UserDao.xml文件中使用<sql>标签,定义出公共部分,如下:

然后在UserDao.xml文件中用<include>标签再引用上面的id。

其中<include>标签的refid属性的值就是<sql> 标签定义id的取值。

注意:如果引用其它mapper.xml的sql片段,则在引用时需要加上namespace,如下:

<include refid="namespace.sql片段”/>

3、Mybatis的多表关联查询

(1)一对一方式查询

下图是一对一的两种方式,另外身份证外键,具有唯一性,

方式一:定义专门的po类作为输出类型,其中定义了sql查询结果集所有的字段。此方法较为简单,企业中使用普遍。

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

通过面向对象的(has a)关系可以得知,我们可以在Account类中加入一个User类的对象来代表这个账户是哪个用户的。

(2)一对多查询

需求:查询所有用户信息及用户关联的账户信息。

分析:用户信息和他的账户信息为一对多关系,并且查询过程中如果用户没有账户信息,此时也要将用户信息查询出来,我们想到了左外连接查询比较合适。

区分多对一,以及一对多,多对多:在程序中看pojo类中的封装。以及对应的关系。

(3)多对多查询

需求:实现查询所有对象并且加载它所分配的用户信息。

分析:查询角色我们需要用到Role表,但角色分配的用户的信息我们并不能直接找到用户信息,而是要通过中间表(USER_ROLE)才能关联到用户信息。

如果没有中间表,那么两张表就没有关系,多对多的前提条件就是一张中间表;

下图是sql语句:

注意:分配主键时主键重复,如下图

解决办法:雪花算法

以前用的都是自动递增id,所以没有察觉id的问题。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值