Mybatis学习day04mybatis连接池及事务控制以及mybatis配置动态sql

mybatis连接池及事务控制

mybatis中连接池使用及分析
  • 连接池
    • 在实际的开发中都会使用连接池,可以减少获取连接所需要的时间
    • 连接池就是用于存储连接的一个容器
    • 容器其实就是一个集合对象,该集合必须是线程安全的,不能两个线程拿到统一连接
    • 该集合还必须实现队列的特性:先进先出
  • mybatis的连接池
    • 配置的位置
      • 主配置文件SqlMapConfig.xml的dataSource标签,type属性就是采用何种连接池方式。方式如下
      • POOLED:采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现
      • UNPOOLED:采取传统的获取连接的方式,虽然也实现了Javax.sql.DataSource接口,但并没有使用池的思想
      • JNDI:采用服务器提供的JNDI技术实现来获取DataSource对象,不同的服务器所能拿到的DataSource是不一样的

        注意:JNDI如果不是web或者maven的war工程,是不能使用的。我们使用tomcat服务器,采用的是dbcp连接池
    • UNPOOLED分析:每次都new一个新的连接返回去
    • POOLED分析:
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Pe4644P-1570066196738)(./images/mybatis_pooled的过程.png)]
    • JNDI使用:JNDI数据源

mybatis的连接池技术既没有用C3P0也没有用DBCP,而是它自己实现了一套数据库连接池的思想,也是用的jdbc规范中的javax.sql的接口的实现的方式

mybatis事务控制的分析
  • 什么是事务
  • 事务的四大特性ACID
  • 不考虑隔离性会产生的3个问题
  • 解决办法:四种隔离级别
  • mybatis是通过sqlsession对象和commit方法实现事务的提交和回滚
    • 源码的跟踪最后会找到JdbcTransaction类里的commit方法
    • 里面的connection.commit()即为javax.sql里的connection,即原始的jdbc操作
    • 测试类里的opensession里不只有不带参数的方法,还有带参数的,可以设置默认提交为true即factory.opensession(true)

mybatis基于XML配置的动态sql语句使用

mappers配置文件中的几个标签
  • <if>
    • 接口示例
      //查询的条件有可能有用户名,有可能有性别有可能有地址还有可能都有或都没有
      List<User> findUserByCondition(User user)
      
    • 配置文件xml
      <select id="findUserByCondition" resultMap="userMap" parameterType="user">
          select * from user where 1=1
          <if test="userName != null">
              and username = #{userName}
          </if>
          <if test="userSex != null">
              and  sex = #{userSex}
          </if>
      </select>
      
  • <where>
    • 还是上面的接口
    • 配置文件改造
      <select id="findUserByCondition" resultMap="userMap" parameterType="user">
          select * from user 
          <where>
              <if test="userName != null">
                  and username = #{userName}
              </if>
              <if test="userSex != null">
                  and  sex = #{userSex}
              </if>
          </where>
      </select>
      
  • <foreach>
    • 接口示例
      /**
      * 根据queryvo中提供的id集合,查询用户信息
      * @param vo
      */
      List<User> findUserInIds(QueryVo vo);
      
      //QueryVo类 getter和setter此处就省略啦
      public class QueryVo {
          private User user;
          private List<Integer> ids;
      }
      
      
    • 配置文件写法(xml)
      <!-- 根据queryvo中的Id集合实现查询用户列表 -->
      <select id="findUserInIds" resultMap="userMap" parameterType="queryvo">
          select * from user
          <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>
      
  • <sql>
    • 配置文件写法
      <!-- 了解的内容:抽取重复的sql语句-->
      <sql id="defaultUser">
          select * from user
      </sql>
      
      <!-- 查询所有 -->
      <select id="findAll" resultMap="userMap">
          <include refid="defaultUser"></include>
      </select>
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值