连接池和动态查询——Mybatis(二)
连接池和动态查询
一、连接池
连接池:存储数据库连接的一个容器,可以减少获取连接所消耗的时间
连接池必须实现队列的特性,保证连接先进先出。
连接池本身就是一个集合对象,改集合必须是线程安全的,不能多个线程拿到同一个连接。
1. Mybatis三种连接池
- POOLED: 使用连接池的数据源。实现DataSource接口,实现接口规则中的连接池。
- UNPOOLED: 不使用连接池的数据源。实现DataSource接口,每次获取Connection都重新创建驱动,连接数据库,使用完之后关闭连接。
- JNDI:通过服务器的JNDI技术,获取DataSource对象。只有Web或者maven项目才能使用。
Tomcat服务器采用dbcp连接池
2. POOLED连接池
Pooled实现DataSource接口,实现类名为PooledDataSource,实现连接池规则。
getConnection()流程:连接池分为空闲池IdleConnections和活动池activeConnections
- 如果空闲池内还有连接,则返回第一个连接,即remove(0)
- 否则,如果活动池个数小于最大活动数量,创建新活动连接,并返回
- 否则,取活动池中最老的连接,进行设置和清理操作,返回连接
3. JNDI(Java Naming and Directory Interface,Java命名和目录接口)
服务器通过JNDI,使得数据库配置文件,可以在Mybatis的xml中使用,完成数据库连接池的配置
步骤:
- 在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>
- 配置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(三)