mybatis中if、where、forecah标签的使用
1、if标签
在IUserDao.xml加标签,在IUserDao.java和MybatisTest.java加方法
<!-- if 标签的使用-->
<select id="findUserByCondition" parameterType="user" resultMap="userMap">
select * from user where 1=1
<if test="userName!=null and userName != '' ">
and username like #{userName}
</if>
<if test="userAddress != null">
and address like #{userAddress}
</if>
</select>
/**
* 条件查询
* @param user
* @return
*/
List<User> findUserByCondition(User user);
/**
* if标签和where标签的使用
*/
@Test
public void testFindUserByCondition(){
User user = new User();
user.setUserName("%王%");
//user.setUserAddress("%顺义%");
//5.执行查询一个方法
List<User> users = userDao.findUserByCondition(user);
for(User u : users){
System.out.println(u);
}
}
当 user.setUserName("%王%");后,userName有值,则执行上面的sql语句拼接后的结果;
当 user.setUserAddress("%顺义%");后,userAddress 有值,则执行下面的sql语句拼接后的结果;
当二者都有值时,则两个条件都会拼接
两个条件查询时显示无这样的记录
2、where标签
<!-- where 标签的使用-->
<select id="findUserByCondition" parameterType="user" resultMap="userMap">
select * from user
<where>
<if test="userName!=null and userName != '' ">
and username like #{userName}
</if>
<if test="userAddress != null">
and address like #{userAddress}
</if>
</where>
</select>
使用 where 标签 省去了在sql语句后面拼接 where 1 = 1
3、foreach标签的使用
SQL 语句:
select 字段 from user where id in (?)
<foreach>标签用于遍历集合,它的属性:
collection:代表要遍历的集合元素,注意编写时不要写#{}
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
sperator:代表分隔符
<!-- foreach标签的使用,根据queryvo中的Id集合实现查询用户列表 -->
<!-- SELECT * FROM USERS WHERE id IN (41,46,51) -->
<select id="findUserInIds" resultMap="userMap" parameterType="queryvo">
<!--select * from user -->
<include refid="defaultUser"></include>
<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>
/**
* 根据queryvo中提供的id集合,查询用户信息
* @param vo
* @return
*/
List<User> findUserInIds(QueryVo vo);
/**
* 测试foreach标签的使用
*/
@Test
public void testFindInIds(){
QueryVo vo = new QueryVo();
List<Integer> list = new ArrayList<Integer>();
list.add(41);
list.add(46);
list.add(51);
vo.setIds(list);
//5.执行查询所有方法
List<User> users = userDao.findUserInIds(vo);
for(User user : users){
System.out.println(user);
}
}
取出了id为41,46,51的三个记录
4、include和sql标签
<!-- 抽取重复的sql语句-->
<sql id="defaultUser">
select * from user
</sql>
<select id="findAll" resultMap="userMap">
<include refid="defaultUser"></include>
</select>
使用include 标签来抽取重复sql也可以达到同样的查询所有的功能
mybatis中的连接池
mybatis连接池提供了3种方式的配置:
配置的位置:
主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何种连接池方式。
type属性的取值:
POOLED 采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现
UNPOOLED 采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想。
JNDI 采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样。
注意:如果不是web或者maven的war工程,是不能使用的。
tomcat服务器,采用连接池是dbcp连接池。
在使用POOLED时,日志最后一行明显有将连接归还池的操作
在使用UNPOOLED时,日志最后一行是直接关闭连接,没有池的思想
在使用POOLED时,查看mybatis的源码可知,mybatis会先看池中有无可用连接,如果有,直接返回一个可用连接;如果没有可用连接,且连接数还没有达到最大连接数,则创建一个连接;如果达到最大连接数,则可能会处理掉最老的连接,返回清理掉的老连接,并且获取连接的过程在synchronized代码块中,保证了多个线程不能获取同一个连接,是线程安全的。
JNDI
JNDI类似于window的注册表
对于一个web工程,需要在项目目录下,添加srcmainwebappMETA-INF目录,并在该目录下加一个文件context.xml,里面的内容是:
<?xml version="1.0" encoding="UTF-8"?>
这样tomcat启动时,就会创建一个容器,用来存放具体的信息