Day_03
连接池、动态SQL;
#
连接池
(1)连接池:
在实际开发中都会使用连接池,因为它可以减少我们获取连接所消耗的时间;
(2)mybatis中的连接池:
mybatis连接池提供了3种配置方式;
配置的位置:主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何种连接池方式。
type属性的值,有3种:
- POOLED:采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现
- UNPOOLED:采用传统的获取连接的方式,虽然也实现javax.sql.DataSource接口,但是并没有使用池的思想
- JNDI:采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样的
注意:如果不是web或者maven的war工程,是不能使用的;学习时使用的是tomcat服务器,采用的连接池就是dbcp连接池;
#
Mybatis事务
什么是事务?
- 事务的四大特性ACID;
- 不考虑隔离性会产生的3个问题;
- 解决办法:四种隔离级别;
它是通过sqlsession对象的commit方法和rollback方法实现事务的提交和回滚,默认update和delete是不自动提交的,需要手动commit;
动态SQL
(1) if 标签
<!-- 根据条件判断user的username是否为空,来动态的增加SQL条件语句 -->
<select id="findByCondition" resultType="com.ming.domain.User" parameterType="com.ming.domain.User">
<!-- 这里有个where1=1
select * from user where 1=1
<if test="username!=null">
and username=#{username}
</if>
<if test="sex!=null">
and sex=#{sex}
</if>
-->
<!-- 写到<where>里面 不需要 where1=1 -->
select * from user
<where>
<if test="username!=null">
and username=#{username}
</if>
<if test="sex!=null">
and sex=#{sex}
</if>
</where>
</select>
测试:
@Test
public void findByCondition() {
User u = new User();
User u0 = new User();
User u1 = new User();
//username为空,会查询所有
List<User> users0 = userDao.findByCondition(u0);
users0.stream().forEach(System.out::println);
//username不为空,会查询username=#{username}
u.setUsername("老王");
List<User> users = userDao.findByCondition(u);
users.stream().forEach(System.out::println);
//username和sex不为空,会查询username=#{username} sex=#{sex}
u1.setUsername("老王");
u1.setSex("女");
List<User> users1 = userDao.findByCondition(u1);
users1.stream().forEach(System.out::println);
session.commit();
}
(2) where和foreach标签
用于多个查询的sql:select * from user where id in(41, 42, 45);
通过一个类中传入集合的方法;
定义类:
/**
* @author A
*/
public class QueryVo {
//为测试OGNL #{user.username}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
private User user;
//为测试动态SQL if标签
private List<Integer> ids;
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}
}
定义接口方法
/**
* 根据QueryVo 中提供的id集合,查询用户信息 where id in (...)
* @param vo
* @return
*/
List<User> findByIdGroup(QueryVo vo);
定义mapper.xml的SQL
<!-- 条件查询的sql select * from user where id in(41,42,46) 条件:满足id在(...)中 通过一个 QueryVo类 传入集合的方法 -->
<select id="findByIdGroup" resultType="com.ming.domain.User" parameterType="com.ming.domain.QueryVo">
select * from user
<!--<include refid="selectFrUser"></include>-->
<where>
<if test="ids != null and ids.size()>0">
<!-- 这里有5个标签 collections open close item separator 注意 item要和下面的#{user.id}相对应 -->
<foreach collection="ids" open="and id in (" close=")" item="user.id" separator=",">
#{user.id}
</foreach>
</if>
</where>
</select>
测试:
@Test
public void findByIds(){
QueryVo queryVo = new QueryVo();
List<Integer> list = new ArrayList<Integer>();
list.add(41);
list.add(42);
list.add(46);
queryVo.setIds(list);
List<User> users = userDao.findByIdGroup(queryVo);
users.stream().forEach(System.out::println);
//session.commit();
}
(3) 复用SQL语句
对于经常重复使用的SQL语句,如SELECT * FROM user,很多
还没有评论,来说两句吧...