Mybatis(三)之动态sql

一、连接池的介绍

我们在配置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));
}

执行结果

1

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(“女”);没有注释的执行结果

3

stu.setSex(“女”);注释掉的执行结果

2

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值