动态SQL

数据准备:

在MySQL数据库中,创建一个名为mybatis的数据库,在此数据库中创建一个teacher表,同时预先插入几条数据。如图所示:

一、利用@Param注解参数实现对teacher表中的数据的查询、删除、修改。

1、创建MyBaitsDemo1项目,使用mapper.xml绑定接口,实现对数据库记录的查询、删除、修改操作。编写程序,完成如下操作:

(1)查询周姓副教授的教师记录;

(2)删除手机号为135开头的讲师的教师记录;

(3)修改TNO:121004教师的手机号为18811597853

1.创建映射文件

在Mapper下创建一个映射文件ParamMapper.xml,在已配置好的mybatis-config.xml文件中添加路径。

 注意:namespace的路径要修改成自己的接口

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org.//DTD mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="DAO.ParamDao">
    <select id="findDao" resultType="pojo.Teacher">
        select * from teacher where  titles=#{titles} and TNAME like concat(#{tname},"%")
    </select>
    <delete id="deleteDao">
        delete from teacher where phone like concat(#{phone},"%") and titles=#{titles}
    </delete>
    <update id="updateDao">
        update teacher set phone=#{phone} where tno=#{tno}
    </update>
</mapper>

在mybatis-config.xml文件下添加映射文件路径

 

2.创建接口实现动态代理 

1.在包DAO创建一个TeacherDAO.java的接口文件,创建以下方法

import org.apache.ibatis.annotations.Param;
import pojo.Teacher;

import java.util.List;

public interface ParamDao {
    List<Teacher> findDao(@Param("tname")String tname, @Param("titles")String titles);
    void deleteDao(@Param("phone")String phone,@Param("titles")String titles);
    void updateDao(@Param("tno")String tno,@Param("phone")String phone);
}

 注意:这里传入的参数@Param就是映射文件使用的参数,如果不同会报错

3.测试

使用SqlSession.getMapper()方法完成自动代理,在使用接口动态代理的对数据库的增删改查的时候,mysql是没有立刻做出响应的,所有需要在java代码中调用comit() 方法来提交事物。

import DAO.ParamDao;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.Teacher;
import utils.MybatisUtil;

import java.util.List;

public class ParamTest {
    @Test
    public void selectTest(){
        SqlSession session = MybatisUtil.openSession();
        ParamDao mapper = session.getMapper(ParamDao.class);
        List<Teacher> list = mapper.findDao("周","副教授");
        for (Teacher teacher : list) {
            System.out.println(teacher);
        }
        session.close();
    }
    @Test
    public void deleteTest(){
        SqlSession session = MybatisUtil.openSession();
        ParamDao mapper = session.getMapper(ParamDao.class);
        mapper.deleteDao("135","讲师");
        session.commit();
        session.close();
    }
    @Test
    public void updateTest(){
        SqlSession session = MybatisUtil.openSession();
        ParamDao mapper = session.getMapper(ParamDao.class);
        mapper.updateDao("121004","18811597853");
        session.commit();
        session.close();
    }

}

二、动态SQL实现组合条件查询

(1)使用动态SQL中if+trim元素实现对teacher表中的数据的查询。

创建MyBaitsDemo2项目,使用动态SQL中if+trim元素实现对数据库记录的各种条件组合查询操作。其中:教师姓名采用模糊查询。

  1. 使用动态SQL中where元素实现对teacher表中的数据的查询

 1.创建映射文件

在mybatis-config.xml文件下加入改映射文件的路径

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org.//DTD mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="DAO.SQLMapper">
    <!--  查询数据  -->
    <select id="selectTrim" parameterType="pojo.Teacher" resultType="pojo.Teacher">
        select * from teacher
        <trim prefix="where" prefixOverrides="and | or">
            <if test="titles != null">
                and titles = #{titles}
            </if>
            <if test="tname != null and tname != ''">
                and tname like concat(#{tname},"%")
            </if>
        </trim>
    </select>
    <select id="selectWhere" parameterType="pojo.Teacher" resultType="pojo.Teacher">
        select * from teacher
        <where>
            <if test="titles != null">
                and titles = #{titles}
            </if>
            <if test="tname != null and tname != ''">
                and tname like concat(#{tname},"%")
            </if>
        </where>
    </select>
</mapper>

2.创建接口

import pojo.Teacher;

import java.util.List;

public interface SQLMapper {
    List<Teacher> selectTrim(Teacher t);
    List<Teacher> selectWhere(Teacher t);
}

3.测试

import DAO.SQLMapper;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.Teacher;
import utils.MybatisUtil;
import java.util.List;

public class SQLTest {


    @Test
    public void selectTest(){
        SqlSession session = MybatisUtil.openSession();
        SQLMapper mapper = session.getMapper(SQLMapper.class);
        List<Teacher> listTrim = mapper.selectTrim(new Teacher("", "", "讲师", ""));
        for (Teacher teacher : listTrim) {
            System.out.println(teacher);
        }
        System.out.println("-------------------------------------------------");
        List<Teacher> listWhere = mapper.selectWhere(new Teacher("", "李", "教授", ""));
        for (Teacher teacher : listWhere) {
            System.out.println(teacher);
        }
        session.close();
    }

}

数据准备:

在MySQL数据库中,创建一个名为mybatis的数据库,在此数据库中创建一个student表,同时预先插入几条数据。如图所示:

 

 创建数据库表,插入数据

INSERT INTO `student` VALUES (0x323031323135313231, '陈校', '男', 29, 'CS');
INSERT INTO `student` VALUES (0x323031323135313232, '刘晨', '女', 19, 'CS');
INSERT INTO `student` VALUES (0x323031323135313233, '王敏', '女', 18, 'MA');
INSERT INTO `student` VALUES (0x323031323135313234, '张立', '男', 35, 'IS');
INSERT INTO `student` VALUES (0x323031323135313830, '李明', '女', 34, 'CS');
INSERT INTO `student` VALUES (0x323031323135313839, '李青', '女', 20, 'IS');

创建Student实体类,

构造器和属性的get,set方法添加

public class Student {
    private String sno;
    private String sname;
    private String ssex;
    private int sage;
    private String sdept;
public Student(){}
}

三、动态SQL实现组合条件查询

1)使用动态SQL中choose+when+otherwise元素实现对student表中的数据的查询。

使用动态SQL中choose+when+otherwise元素实现对数据库记录的各种条件查询操作。优先按照姓名(sname)查询;如果姓名不确定,再按照年龄查询(sage);如果年龄再不确定,再按照系别(sdept)查询,都不确定,就查询所有学生。其中:学生姓名采用模糊查询。

(2)使用动态SQL中set元素实现对student表中的数据的修改。

使用动态SQL中set元素实现对数据库记录的字段的各种组合修改操作。将学号为201215180的学生的年龄加1,系别改为数学系(MA),其他字段信息不变。

3)使用动态SQL中foreach元素实现对student表中的数据的批量查询、修改与删除。

查询学号在:201215121-201215123这个范围内的学生的记录。

将学号在:201215122-201215123这个范围内的学生的性别修改为男。

删除学号在:201215121-201215123这个范围内的学生的记录。

 1.创建映射文件

在mybatis-config.xml下添加映射文件的路径

还是采用接口动态代理的方式来实现,注意namespace=" "是自己接口的路径,

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org.//DTD mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="DAO.StudentDao">
    <select id="selectWhen" resultType="pojo.Student">
        select * from student where 1=1
        <choose>
            <when test="sname !=null and sname !=''">
                and sname like concat('%',#{sname},'%')
            </when>
            <when test="sage !=null">
                and sage=#{sage}
            </when>
            <when test="sdept !=null and sdept !=''">
                and sdept=#{sdept}
            </when>
            <otherwise></otherwise>
        </choose>
    </select>
    <update id="updateSet">
        update student
        <set>
            <if test="sno!=null and sno!=''">
                sage=sage+1 , sdept=#{sdept}
            </if>
        </set>
        where sno=#{sno}
    </update>

    <select id="selectSno" resultType="pojo.Student">
        select * from student where sno in 
        <foreach collection="array" item="numbers"
                 open="(" separator="," close=")">
            #{numbers}
        </foreach>
    </select>
    <update id="updateSex">
        update student set ssex='男'
        where sno in
        <foreach collection="array" item="sexs"
                 open="(" separator="," close=")">
            #{sexs}
        </foreach>
    </update>
    <delete id="deleteSno">
        delete from student where sno in
        <foreach collection="array" item="numbers" open="("
                 separator="," close=")">
            #{numbers}
        </foreach>
    </delete>
</mapper>

 2.创建接口

import org.apache.ibatis.annotations.Param;
import pojo.Student;

import java.util.List;

public interface StudentDao {
    List<Student> selectWhen(@Param("sname") String sname,
                             @Param("sage") Integer sage, @Param("sdept") String sdept);

    void updateSet(@Param("sno") String sno, @Param("sdept") String sdept);
    List<Student> selectSno(String[] numbers);
    void updateSex(String[] sno);
    void deleteSno(String[] numbers);
}

3.测试代码

import DAO.StudentDao;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.Student;
import utils.MybatisUtil;

import java.util.List;

public class StudentTest {

    @Test
    public void selectWhen() {
        SqlSession session = MybatisUtil.openSession();
        StudentDao mapper = session.getMapper(StudentDao.class);
        System.out.println("-----------------查询姓名--------------------");
        List<Student> list;
        list = mapper.selectWhen("李", null, "");
        for (Student s : list) {
            System.out.println(s);
        }
        System.out.println("-----------------查询年龄--------------------");
        list = mapper.selectWhen("", 18, "");
        for (Student s : list) {
            System.out.println(s);
        }
        System.out.println("-----------------查询年龄--------------------");
        list = mapper.selectWhen("", null, "IS");
        for (Student s : list) {
            System.out.println(s);
        }
        System.out.println("-----------------查询所有--------------------");
        list = mapper.selectWhen("", null, "");
        for (Student s : list) {
            System.out.println(s);
        }
        session.close();
    }

    @Test
    public void updateSet() {
        SqlSession session = MybatisUtil.openSession();
        StudentDao mapper = session.getMapper(StudentDao.class);
        mapper.updateSet("201215180", "MA");
        session.commit();
        session.close();
    }

    @Test
    public void selectSno() {
        SqlSession session = MybatisUtil.openSession();
        StudentDao mapper = session.getMapper(StudentDao.class);
        List<Student> list;
        String[] numbers=new String[100];
        for(int i=201215121;i<=201215123;i++){
            numbers[i-201215121]=""+i;
        }
        list = mapper.selectSno(numbers);
        for (Student s : list) {
            System.out.println(s);
        }

        session.close();
    }
    @Test
    public void updateSex(){
        SqlSession session = MybatisUtil.openSession();
        StudentDao mapper = session.getMapper(StudentDao.class);
        String[] numbers=new String[100];
        for(int i=201215121;i<=201215123;i++){
            numbers[i-201215121]=""+i;
        }
        mapper.updateSex(numbers);
        session.commit();
        session.close();
    }
    @Test
    public void deleteSno(){
        SqlSession session = MybatisUtil.openSession();
        StudentDao mapper = session.getMapper(StudentDao.class);
        String[] numbers=new String[100];
        for(int i=201215121;i<=201215123;i++){
            numbers[i-201215121]=""+i;
        }
        mapper.deleteSno(numbers);
        session.commit();
        session.close();
    }
}

动态SQL的学习链接请参考 

(5条消息) MyBatis学习笔记-08.MyBatis动态Sql语句foreach的collection的用法以及用foreach实现批量删除与批量新增_YuanMxy的博客-CSDN博客

(5条消息) 【Mybatis】功能强大的动态SQL之foreach批量查询、批量插入_mybatis foreach查询_你的知识书架的博客-CSDN博客 (5条消息) MyBatis动态SQL中if、where、trim、choose、when、otherwise、foreach标签及sql标签范例_sql中的trim标签_夏志121的博客-CSDN博客

(4条消息) 【MyBatis】多条件查询、动态SQL、多表操作、注解开发_实体类添加注解默认查询条件_懒羊羊.java的博客-CSDN博客

【SSM - MyBatis篇09】动态SQL - if、choose、when、otherwise、trim、where、set、foreach、bind元素_掌握动态sql中if、trim及where元素的优点_strive_day的博客-CSDN博客

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值