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分析:
  • 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>