一、连接池的介绍
我们在配置mybatis连接池的时候,可以设置的类型有三种,分别为POOLED、UNPOOLED、JNDI。
POOLED:使用JDBC的传统规范使用连接池
UNPOOLED:不使用连接池,需要连接就创建一个连接
JNDI:使用JNDI实现的数据源
配置代码如下:
<!--配置数据源(连接池)-->
<dataSource type="POOLED"><!--连接池数据源的配置-->
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
二、mybatis中的事务管理
1、事务管理
事务管理的内容可以参考之前的文章:
https://blog.youkuaiyun.com/stevensam_lin/article/details/82115587
2、设置openSession的自动提交
在创建sqlSession会话对象的时候,添加上一个true即可以设置成自动提交,也就是关闭事务。
//3.工厂生产SqlSession对象
session = factory.openSession(true);
三、动态sql语句
1、if标签
在IStudentDao接口中创建一个查询方法findById
/**
* 根据id查询学生
* @return Student
*/
Student findById(Student student);
在映射配置文件中增加查询标签语句
<!--配置模糊查询学生的方法-->
<select id="findById" parameterType="student" resultType="student">
SELECT * from student WHERE 1=1
<!--这里仅仅是测试if标签的用法,实际开发中可以不用这么写-->
<if test="#{sid} != null">
AND sid = #{sid}
</if>
</select>
在测试类中增加测试方法
/**
* 模糊根据id查询学生信息
*/
@Test
public void testFindById() {
Student stu = new Student();
stu.setSid(16);
//5.使用代理对象执行方法
System.out.println(mapper.findById(stu));
}
执行结果
2、where标签
我在上面的if标签例子的基础上进行改装,在IStudentDao接口中创建一个查询方法findByStudent
/**
* 根据多个学生信息查询学生
* @return Student
*/
List<Student> findByStudent(Student student);
在映射配置文件中增加查询标签语句
<!--配置根据多个信息查询学生的方法-->
<select id="findByStudent" parameterType="student" resultType="student">
SELECT * from student
<where>
<if test="sname != null"><!--这里的sname指的是参数中的sname,并不是数据库中表列名sname-->
AND sname like #{sname}
</if>
<if test="sex != null">
AND sex = #{sex}
</if>
</where>
</select>
在测试类中增加测试方法
/**
* 模糊根据多个学生信息查询学生信息
*/
@Test
public void testFindByStudent() {
Student stu = new Student();
stu.setSname("%张%");
//stu.setSex("女");//这里注释掉表示只根据姓名来查询
//5.使用代理对象执行方法
List<Student> studentList = mapper.findByStudent(stu);
for (Student student:studentList) {
System.out.println(student);
}
}
stu.setSex(“女”);没有注释的执行结果
stu.setSex(“女”);注释掉的执行结果
3、foreach标签
在IStudentDao接口中创建一个查询方法findByIds
/**
* 根据多个id查询学生
* @return Student
*/
List<Student> findByIds(QueryVo queryVo);
创建一个实体类用于接收多个id的list集合QueryVo,当然里面也可以再设置一个成员变量student,但此处不演示
public class QueryVo implements Serializable {
private List<Integer> ids;
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}
}
在映射配置文件中增加查询标签语句
<!--配置根据多个id查询学生的方法,注意参数类型为QueryVo-->
<select id="findByIds" parameterType="QueryVo" resultType="student">
SELECT * from student
<where>
<if test="ids != null and ids.size()>0">
<!--遍历qv中成员变量ids的数据-->
<foreach collection="ids" open="and sid in(" close=")" item="sid" separator=",">
#{sid}
</foreach>
</if>
</where>
</select>
在测试类中增加测试方法
/**
* 模糊根据多个学生id查询学生信息
*/
@Test
public void testFindByIds() {
Student stu = new Student();
QueryVo qv = new QueryVo();
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
qv.setIds(list);
//5.使用代理对象执行方法
List<Student> studentList = mapper.findByIds(qv);
for (Student student:studentList) {
System.out.println(student);
}
}
执行结果
4、sql和include标签
include标签和jsp中的include标签是一样的功能,用于提取重复的代码,在映射配置文件中可以修改代码,演示代码如下:
<sql id="t_stu" >
select * from student;
</sql>
<!--配置查询所有学生的方法-->
<select id="findAll" resultType="student">
<include refid="t_stu"></include>
</select>