Mybatis—动态SQL

动态SQL:是指根据不同的条件生成不同的SQL语句

Mybatis 动态 sql 是做什么的

Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能。

Mybatis 提 供 了 9 种 动 态 sql 标 签

trim , foreach when ,where ,if , otherwise, set ,choose , bind

动态 sql 的执行原理为,使用 OGNL(表达式语言) 从 sql 参数对象中计算表达式的值,根据表达式

的值动态拼接 sql,以此来完成动态 sql 的功能

#{}与${}的区别

#{}是预编译处理,${}是字符串替换。

Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值;

Mybatis 在处理${}时,就是把${}替换成变量的值。

使用#{}可以有效的防止 SQL 注入,提高系统安全性。

下面是实现Mybatis动态SQL的demo

实体类

package org.zhx.entity;

import java.util.List;

public class ClassInfo {
    private int classId;
    private String className;
    private List<StudentInfo> studentInfoList;

    public int getClassId() {
        return classId;
    }

    public void setClassId(int classId) {
        this.classId = classId;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public List<StudentInfo> getStudentInfoList() {
        return studentInfoList;
    }

    public void setStudentInfoList(List<StudentInfo> studentInfoList) {
        this.studentInfoList = studentInfoList;
    }

    public ClassInfo() {
    }

    public ClassInfo(int classId, String className, List<StudentInfo> studentInfoList) {
        this.classId = classId;
        this.className = className;
        this.studentInfoList = studentInfoList;
    }

    public ClassInfo(int classId, String className) {
        this.classId = classId;
        this.className = className;
    }
}
package org.zhx.entity;

public class StudentInfo {
    private int stuId;
    private String stuName;
    private String password;
    private String stuAge;
    private String stuSex;
    private int stuClassId;
    private ClassInfo classInfo;

    public int getStuId() {
        return stuId;
    }

    public void setStuId(int stuId) {
        this.stuId = stuId;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getStuAge() {
        return stuAge;
    }

    public void setStuAge(String stuAge) {
        this.stuAge = stuAge;
    }

    public String getStuSex() {
        return stuSex;
    }

    public void setStuSex(String stuSex) {
        this.stuSex = stuSex;
    }

    public int getStuClassId() {
        return stuClassId;
    }

    public void setStuClassId(int stuClassId) {
        this.stuClassId = stuClassId;
    }

    public ClassInfo getClassInfo() {
        return classInfo;
    }

    public void setClassInfo(ClassInfo classInfo) {
        this.classInfo = classInfo;
    }

    public StudentInfo() {
    }



    public StudentInfo(int stuId, String stuName, String password, String stuAge, String stuSex, int stuClassId, ClassInfo classInfo) {
        this.stuId = stuId;
        this.stuName = stuName;
        this.password = password;
        this.stuAge = stuAge;
        this.stuSex = stuSex;
        this.stuClassId = stuClassId;
        this.classInfo = classInfo;
    }

    public StudentInfo(int stuId, String stuName, String password, String stuAge, String stuSex, int stuClassId) {
        this.stuId = stuId;
        this.stuName = stuName;
        this.password = password;
        this.stuAge = stuAge;
        this.stuSex = stuSex;
        this.stuClassId = stuClassId;
    }
}

接口

package org.zhx.dao;

import org.zhx.entity.ClassInfo;

import java.util.List;

public interface ClassInfoDao {
    public ClassInfo findClassById(int id);
}

package org.zhx.dao;

import org.apache.ibatis.annotations.Param;
import org.zhx.entity.ClassInfo;
import org.zhx.entity.StudentInfo;

import java.util.List;

public interface StudentInfoDao {
    List<StudentInfo> findAll();

    public int addStu(@Param("stuname") String stuName, @Param("password")String password, @Param("stuage")String stuAge, @Param("stusex")String stuSex, @Param("stuclassid")int stuClassId);

    public int updateStu(@Param("stuage")int stuAge,@Param("stuid")int stuId);

    public int deleteStu(@Param("stuid")int stuId);

    public List<StudentInfo> findByList(int [] array);

    public List<StudentInfo> findByLists(List<Integer> list);

    public List<StudentInfo> findByChoose(@Param("stuname")String stuName,@Param("classid") int classId);

    public List<StudentInfo> findByTest(@Param("stuname")String stuName,@Param("classid") int classId,@Param("stuage") int stuAge);

    public int update(StudentInfo s);

    public StudentInfo findById(String id);
}

工具类

​
package org.zhx.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MybatisUtil {
//    创建mybatis配置文件
//    创建sqlsessionfactory对象
    private static SqlSessionFactory sessionFactory;
    static {
        String resource = "MyBatis.xml";
        try {
            InputStream is = Resources.getResourceAsStream(resource);
            sessionFactory = new SqlSessionFactoryBuilder().build(is);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //    创建sqlsession连接对象
    public static SqlSession getSession(){
        return sessionFactory.openSession();
    }
    //      创建关闭sqlsession连接对象
    public static void closeSession(SqlSession session){
        if (session!=null){
            session.close();
        }
    }
}

​

Mapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.zhx.dao.ClassInfoDao">
    <select id="findClassById" resultType="ClassInfo" >
        select s.*,c.classname from studentinfo s,classinfo c where s.stuclassid=c.classid and classid=#{classid};
    </select>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.zhx.dao.StudentInfoDao">

    <select id="findAll" resultType="StudentInfo">
        select s.*,c.classname from studentinfo s,classinfo c where s.stuclassid=c.classid
    </select>
    <insert id="addStu"  parameterType="org.zhx.entity.StudentInfo" useGeneratedKeys="true">
        insert into studentinfo (stuname,password,stuage,stusex,stuclassid) values (#{stuname},#{password},#{stuage},#{stusex},#{stuclassid})
    </insert>

    <update id="updateStu" parameterType="org.zhx.entity.StudentInfo">
        update studentinfo set stuage=#{stuage} where stuid=#{stuid}
    </update>

    <delete id="deleteStu" parameterType="org.zhx.entity.StudentInfo">
        delete from studentinfo where stuid=#{stuid}
    </delete>

    <select id="findByList" resultType="org.zhx.entity.StudentInfo">
        select * from studentinfo where stuid in
        <foreach item="stuid" open="(" separator="," close=")" collection="array">
            #{stuid}
        </foreach>
    </select>

    <select id="findByLists" resultType="org.zhx.entity.StudentInfo">
        select * from studentinfo where stuid in
        <foreach collection="list" item="stuid" open="(" separator="," close=")">
            #{stuid}
        </foreach>
    </select>

    <select id="findByChoose" resultType="org.zhx.entity.StudentInfo">
        select * from studentinfo where 1=1
        <choose>
            <when test="stuname != null and stuname != ''">stuname like concat('%',#{stuname},'%')</when>
            <when test="classid != null and classid != ''">and stuclassid=#{classid}</when>
            <otherwise></otherwise>
        </choose>
    </select>

    <select id="findByTest" resultType="org.zhx.entity.StudentInfo">
        select * from studentinfo
        <where>
            <trim suffix="" suffixOverrides="and">
                <if test="stuname != null and stuname != ''">stuname like concat(#{stuname},'%')</if>
                <if test="classid != null and classid !=0">and stuclassid=#{classid}</if>
                <if test="stuage != null and stuage != 0">and stuage>#{stuage}</if>
            </trim>
        </where>
    </select>

    <update id="update" parameterType="StudentInfo">
        update studentinfo
        <set>
            <trim suffix="where stuid=#{stuId}" suffixOverrides="," >
                <if test="stuName != null and stuName != ''">stuname=#{stuName},</if>
            </trim>
        </set>
    </update>

    <select id="findById" resultType="org.zhx.entity.StudentInfo" >
        select * from  studentinfo where stuid=#{stuid}
    </select>

</mapper>

测试类

package org.zhx.test;

import org.apache.ibatis.session.SqlSession;
import org.zhx.dao.ClassInfoDao;
import org.zhx.dao.StudentInfoDao;
import org.zhx.entity.ClassInfo;
import org.zhx.entity.StudentInfo;
import org.zhx.util.MybatisUtil;

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
//        test1();
//        test2();
//        test3();
//        test4();
//        test5();
//        test6();
//        test7();
//        test8();
//        test9();
        test10();
    }

    private static void test10() {
        SqlSession session = MybatisUtil.getSession();
        StudentInfo s = session.getMapper(StudentInfoDao.class).findById("3");
        if (s!=null){
            s.setStuName("李四");
            int result = session.getMapper(StudentInfoDao.class).update(s);
            if (result>0){
                session.commit();
                System.out.println(s.getStuClassId()+"\t"+s.getStuName());
            }
        }
    }

    private static void test9() {
        SqlSession session = MybatisUtil.getSession();
        List<StudentInfo> list = session.getMapper(StudentInfoDao.class).findByTest(null,1,0);
        for (StudentInfo s:list) {
            System.out.println(s.getStuClassId()+"\t"+s.getStuName());
        }
    }

    private static void test8() {
        SqlSession session = MybatisUtil.getSession();
        List<StudentInfo> list = session.getMapper(StudentInfoDao.class).findByChoose("张",5);
        for (StudentInfo s:list) {
            System.out.println(s.getStuClassId()+"\t"+s.getStuName());
        }
    }

    private static void test7() {
        SqlSession session = MybatisUtil.getSession();
        List<Integer> list = new ArrayList<Integer>();
        list.add(2);
        list.add(4);
        List<StudentInfo> list1 = session.getMapper(StudentInfoDao.class).findByLists(list);
        for (StudentInfo s:list1) {
            System.out.println(s.getStuId());
            System.out.println(s.getStuName());
        }
    }

    private static void test6() {
        SqlSession session = MybatisUtil.getSession();
        int [] array = {1,2};
        List<StudentInfo> list = session.getMapper(StudentInfoDao.class).findByList(array);
        for (StudentInfo s:list) {
            System.out.println(s.getStuName());
        }
    }

    private static void test5() {
        SqlSession session = MybatisUtil.getSession();
        int stu =  session.getMapper(StudentInfoDao.class).deleteStu(2);
        if (stu>0){
            session.commit();
            System.out.println("删除成功");
        }
    }

    private static void test4() {
        SqlSession session = MybatisUtil.getSession();
        int stu =  session.getMapper(StudentInfoDao.class).updateStu(25,2);
        if (stu>0){
            session.commit();
            System.out.println("修改成功");
        }
    }

    private static void test3() {
        SqlSession session = MybatisUtil.getSession();
        int stu =  session.getMapper(StudentInfoDao.class).addStu("小猪","123","27","男",1);
        if (stu>0){
            session.commit();
            System.out.println("添加成功");
        }
    }

    private static void test2() {
        SqlSession session = MybatisUtil.getSession();
        ClassInfo ci =  session.getMapper(ClassInfoDao.class).findClassById(1);
        System.out.println(ci.getClassName());
        for (StudentInfo s:ci.getStudentInfoList()) {
            System.out.println(s.getStuName());
        }
    }

    private static void test1() {
        SqlSession session = MybatisUtil.getSession();
        List<StudentInfo> list =  session.getMapper(StudentInfoDao.class).findAll();
        for (StudentInfo s: list) {
            System.out.println(s.getStuName());
            System.out.println(s.getClassInfo().getClassName());
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值