最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

焦点速递!学习笔记——Mybatis动态SQL

来源:博客园

2023-01-12

一、Mybatis动态SQL


(资料图片)

即将SQL动态化

同时Mybatis的动态SQL支持OFNL表达式,OGNL(Object Graph Navigation Language)对象图导航语言。

1、先搭建环境

(1)创建一个“maven”模块,命名为“day04_mybatis”

(2)在“day04_mybatis”中的“pom.xml”中的标签内部添加依赖,即添加jar包

                            mysql            mysql-connector-java            8.0.26                                    org.mybatis            mybatis            3.5.6                                    junit            junit            4.12            test                                    log4j            log4j            1.2.17            

(3)在"day04_mybatis.src.main.resources"中添加"db.properties(连接数据库,里面的形式是:key=value),需要设置4个值(driver、url、username、password)"和“log4j.xml”

                                                                                                    

(4)在“day04_mybatis.src.resources”中添加“mybatis-config.xml”

                                                                                                                                                                                                                    

(5)在“day04_mybatis.src.main.java”中创建“com.hh.mybatis.pojo”和“com.hh.mybatis.mapper”。之后在“day04_mybatis.src.main.resources”中创建“mapper”文件夹,在“mapper”文件夹下创建“EmployeeMapper.xml”

(6)在“pojo”文件夹下创建“Dept”、“Employee”。在“mapper”文件夹下创建“EmployeeMapper”接口并添加代码

public interface EmployeeMapper {    /**     * 按条件查询员工信息(条件不确定)     * @return     */    public List selectEmpByOpr(Employee employee);}

(7)EmployeeMapper.xml中的映射文件

    

(8)在“day04_mybatis.src.test.java"中创建测试类“TestDynamicSql”

public class TestDynamicSql {    @Test    public void testDynamicSql() throws Exception{        String resource = "mybatis-config.xml";        InputStream inputStream = Resources.getResourceAsStream(resource);        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        SqlSession sqlSession = sqlSessionFactory.openSession();        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);        Employee employee = new Employee();        List employees = employeeMapper.selectEmpByOpr(employee);        for (Employee employee1 : employees) {            System.out.println("employee1 = " + employee1);        }    }}

(9)注意:

如果出现“java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corres”这种问题报错时,可以将sql语句先在“SQLyog”中先写一遍,运行,如果运行无误,之后将代码再放入“映射文件”中,即可

2、进行动态SQL设置

(1)注意:在动态SQL中“test”中放置的是“属性”

(2)动态SQL标签

用于完成简单的判断

测试类

public class TestDynamicSql {    @Test    public void testDynamicSql() throws Exception{        String resource = "mybatis-config.xml";        InputStream inputStream = Resources.getResourceAsStream(resource);        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        SqlSession sqlSession = sqlSessionFactory.openSession();        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);        Employee employee = new Employee();        //动态标签        employee.setId(1);//        employee.setSalary(50.0);        List employees = employeeMapper.selectEmpByOpr(employee);        for (Employee employee1 : employees) {            System.out.println("employee1 = " + employee1);        }    }}

注意:动态参数中,无参数时报错,没有第一个参数也报错。

(3)动态SQL:标签

where用于解决SQL语句中where关键字以及条件前面的and或者or的问题

(3)动态SQL:

可以在条件判断完的SQL语句前后添加或者去掉指定的字符

标签中的属性:

①prefix:添加前缀

②prefixOverrides:去掉前缀

③suffix:添加后缀

④suffixOverrides:去掉后缀

例如:

(4)动态SQL:

用于解决修改操作中SQL语句中可能多出逗号的问题

在“EmployeeMapper”接口中添加方法

/**     * 按条件修改员工信息(条件不确定)     * @param employee     */    public void updateEmpByOpr(Employee employee);

映射文件

        update            tbl_employee                                    last_name = #{lastName},                                        email = #{email},                                        salary = #{salary}                            where           id = #{id}

(5)动态SQL标签:

类似于java中if-else(switch-case)结构

        SELECT            id,            last_name,            email,            salary        FROM            tbl_employee                                                           id = #{id}                                                       email = #{email}                                                       salary = #{salary}                                                       1=1                                          

(6)动态SQL标签:

类似于java中的for循环

collection:要迭代的集合

item:当前从集合中迭代出的元素

separator:元素与元素之间的分隔符

①“EmployeeMapper”接口中的函数

/**     * 通过多个id获取员工信息     * @param ids     * @return     */    public List selectEmpByIds(@Param("ids") List ids);

②映射文件

③测试主要代码

List ids = new ArrayList<>();        ids.add(1);        ids.add(3);        ids.add(4);        List employees = employeeMapper.selectEmpByIds(ids);        for (Employee employee1 : employees) {            System.out.println("employee1 = " + employee1);        }

(7)sql标签

提取可重用SQL片段

        SELECT            id,            last_name,            email,            salary        FROM            tbl_employee                    id,        last_name,        email,        salary        

关键词: 延迟加载 用于解决 设置属性