(1)连接池就是用于存储连接的容器,容器就是一个集合对象,必须是线程安全的,不能两个线程拿到同一个连接,该集合具有队列特性:先进先出
(2)mybatis连接池提供了3种配置方式
主配置文件在Maven工程中,在resources文件下,名称为:SqlMapConfig.xml中的DataSource标签,type属性的取值有:
POOLED: 采用传统的javax.sql.DataSource规范中的连接池,mybatis有针对规范的实现
UNPOOLED: 采用传统的获取连接的方式,虽然也实现了javax.sql.DataSource接口,但是并没有实现池的思想
JNDI: 采用服务器提供的JNDI技术实现获取DataSource对象,不同的服务器所能拿到的DataSource对象不一样。
如果不是web或者Maven的jar工程,是不能使用的
(3)<mapper namespace="cn.rzpt.dao.IUserDao">:对应谁的Dao就写谁的namespace
(4)传入未知参数的xml写法 if标签:
<mapper namespace="cn.rzpt.dao.IUserDao">
<!--在这里,使用if进行判断时,只能使用and符号,不能是两个与符号-->
<select id="findUserByCondition" resultType="cn.rzpt.domain.User" parameterType="cn.rzpt.domain.User">
select * from user where 1=1
<if test="username != null">
and username = #{username}
<!--这里面需要区分大小写,要与实体类的写法一致-->
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</select>
</mapper>
where标签:
<select id="findUserByCondition" resultType="cn.rzpt.domain.User" parameterType="cn.rzpt.domain.User">
select * from user
<where>
<if test="username != null">
and username = #{username}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</where>
</select>
需要写VO:
public class QueryVO {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
接口
List<User> findUserByVo(QueryVO vo);
//根据传入的参数条件查询:姓名,性别,地址...,有其一,其二等,或者全部
List<User> findUserByCondition(User user);
测试类
@Test
public void testFindByCondition(){
User user = new User();
user.setUsername("老王");
List<User> users = userDao.findUserByCondition(user);
for (User u : users){
System.out.println(u);
}
}
(5)foreach:传入多个参数,id in(....)
<mapper namespace="cn.rzpt.dao.IUserDao"> <!-- 配置 查询结果的列名和实体类的属性名的对应关系 --> <resultMap id="userMap" type="cn.rzpt.domain.User"> <!-- 主键字段的对应 --> <id property="id" column="id"></id> <!--非主键字段的对应,property要与实体类属性一致,column要与数据库一致,在Linux下,列名区分大小写--> <result property="username" column="username"></result> <result property="address" column="address"></result> <result property="sex" column="sex"></result> <result property="birthday" column="birthday"></result> </resultMap> <!--抽取重复的sql语句--> <sql id="defaultUser"> <!--如果后面还有其他语句,此时不要在写分号,要不然会报错--> select * from user </sql> <!--根据queryvo中的id集合实现查询用户列表--> <select id="findUserInIds" resultMap="userMap" parameterType="cn.rzpt.domain.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="id" separator=","> #{id} </foreach> </if> </where> </select> </mapper>
public class QueryVO { private User user; private List<Integer> ids; public List<Integer> getIds() { return ids; } public void setIds(List<Integer> ids) { this.ids = ids; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
public interface IUserDao 中增加
/** * 根据queryvo中提供的id集合,查询用户信息 * @param vo * @return */ List<User> findUserInIds(QueryVO vo);
测试类
@Test public void testFindInIds(){ QueryVO vo = new QueryVO(); List<Integer> list = new ArrayList<Integer>(); list.add(41); list.add(43); vo.setIds(list); List<User> users = userDao.findUserInIds(vo); for (User u : users){ System.out.println(u); } }