连接池和动态查询——Mybatis(二)

连接池和动态查询

一、连接池

连接池:存储数据库连接的一个容器,可以减少获取连接所消耗的时间

连接池必须实现队列的特性,保证连接先进先出。

连接池本身就是一个集合对象,改集合必须是线程安全的,不能多个线程拿到同一个连接。

1. Mybatis三种连接池

  1. POOLED: 使用连接池的数据源。实现DataSource接口,实现接口规则中的连接池。
  2. UNPOOLED: 不使用连接池的数据源。实现DataSource接口,每次获取Connection都重新创建驱动,连接数据库,使用完之后关闭连接。
  3. JNDI:通过服务器的JNDI技术,获取DataSource对象。只有Web或者maven项目才能使用。

Tomcat服务器采用dbcp连接池

 

2. POOLED连接池

Pooled实现DataSource接口,实现类名为PooledDataSource,实现连接池规则。

getConnection()流程:连接池分为空闲池IdleConnections和活动池activeConnections

  1. 如果空闲池内还有连接,则返回第一个连接,即remove(0)
  2. 否则,如果活动池个数小于最大活动数量,创建新活动连接,并返回
  3. 否则,取活动池中最老的连接,进行设置和清理操作,返回连接

 

3. JNDI(Java Naming and Directory Interface,Java命名和目录接口)

服务器通过JNDI,使得数据库配置文件,可以在Mybatis的xml中使用,完成数据库连接池的配置

步骤:

  1. 在webapp下的META-INF下创建数据库配置文件xml
    <?xml version="1.0" encoding="UTF-8"?>
    <Context>
    <Resource 
    name="jdbc"
    type="javax.sql.DataSource"
    auth="Container"
    maxActive="20"
    maxWait="10000"
    maxIdle="5"
    username="root"
    password="1234"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/hellossm?serverTimezone=UTC"
    />
    </Context>
  2. 配置mabatis的xml文件
    <dataSource type="JNDI">
        <property name="data_source" value="java:com/env/jdbc"/>
    </dataSource>

二、事务

Mybatis通过commit方法和rollBack方法实现事务的提交和回滚

Mybatis 关闭Auto commit:即不自动提交SQL。

事务提交方法:

    commit(): 通过connection.commit()实现事务提交

    openSession(true): 修改提交为自动提交,不用commit就可以实现事务的提交。不太安全。

 

三、动态查询

1. <if>标签

语法:<if test=”username!=null”> sql </if>

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

2. <where>便签

语法:<where>sql</where>

<select id="findByCondition" resultType="com.one.mybatis.domain.User" parameterType="com.one.mybatis.domain.User">
        select * from user
        <where>
            <if test="username!=null">
                username=#{username}
            </if>
        </where>
</select>

3.<foreach>标签 

    <foreach colleciton="集合名" open="sql开始语句" close="sql结束语句" item="每次循环的数据"  separator="Sql分割符">#{item}</foreach?>

<select id="findByIds" parameterType="list" resultType="com.one.mybatis.domain.User">
        select * from user where id in
        <foreach collection="list" open="(" close=")" item="id" separator=",">
            #{id}
        </foreach>
</select>

传递一个 List 实例或者数组作为参数对象传给 MyBatis,MyBatis 会自动将它包装在一个 Map 中,用名称在作为键。List 实例将会以“list” 作为键,而数组实例将会以“array”作为键

 

下一篇:延迟加载——Mybatis(三)

posted @ 2021-12-24 16:22  言思宁  阅读(98)  评论(0编辑  收藏  举报