详解Mybatis之动态sql问题(下)

简介: 详解Mybatis之动态sql问题(下)

3.4 set标签

👉功能

主要用于解决set关键字及多出一个【,】问题

👉用法案例

修改员工的信息

代码示例如下:

①在EmployeeMapper接口中定义修改员工的信息的方法

//修改员工的信息
public void updateEmp(Employee employee);

②在EmployeeMapper接口对应的映射文件中书写相应的sql

问题版(会出现多一个【,】问题

<update id="updateEmp">
    update
        tbl_employee
    set
        <if test="lastName != null">
            last_name=#{lastName}  ,
        </if>
        <if test="email != null">
            email=#{email}  ,
        </if>
        <if test="salary != null">
            salary=#{salary} ,
        </if>
    where
        id=#{id}
</update>

set标签解决问题版

<update id="updateEmp">
    update
        tbl_employee
    <set>
        <if test="lastName != null">
            last_name=#{lastName}  ,
        </if>
        <if test="email != null">
            email=#{email}  ,
        </if>
        <if test="salary != null">
            salary=#{salary} ,
        </if>
    </set>
    where
        id=#{id}
</update>

③测试

@Test
public void test03(){
    try {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过SqlSessionFactory对象调用openSession();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取EmployeeMapper的代理对象
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
        //动态参数
        Employee employee=new Employee();
        employee.setId(1);
        employee.setLastName("tom");
        employee.setSalary(16800.0);
        employeeMapper.updateEmp(employee);
xml
    } catch (IOException e) {
        e.printStackTrace();
    }
}

使用问题版的sql进行测试

使用set标签解决问题版的sql进行测试

3.5 choose标签

👉功能

类似java中if-else【switch-case】结构

👉应用场景

应用于单个条件不确定的业务场景

👉用法案例

不指定查询条件,查询对应的员工信息(单个条件不确定的)

代码示例如下:

①在EmployeeMapper接口书写相应的方法

//不指定查询条件,查询对应员工信息(单个条件不确定的)
public List<Employee> selectEmpByOneOpr(int empId);

②在EmployeeMapper接口对应的映射文件中书写相应的sql

<!--  根据查询条件查找对应的员工信息(条件不确定) 动态的sql(trim标签优化版)  -->
<select id="selectEmpByOneOpr" resultType="employee">
    SELECT
        `id`,
        `last_name`,
        `email`,
        `salary`,
        `dept_id`
    FROM
        `tbl_employee`
    <where>
        <choose>
            <when test="id !=null">
                id=#{id}
            </when>
            <when test="lastName != null">
                last_name=#{lastName}
            </when>
            <when test="email != null">
                email=#{email}
            </when>
            <otherwise>
                salary=#{salary}
            </otherwise>
        </choose>
    </where>
</select>

③测试

@Test
public void test04(){
    try {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过SqlSessionFactory对象调用openSession();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取EmployeeMapper的代理对象
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
        List<Employee> employees = employeeMapper.selectEmpByOneOpr(1);
        System.out.println(employees);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

3.6 foreach标签

👉功能

类似java中for循环

👉标签属性

  • collection要迭代的集合
  • item当前从集合中迭代出的元素
  • separator元素与元素之间的分隔符
  • open开始字符
  • close结束字符

👉应用场景

🚩 ①遍历迭代

用法案例

通过多个id获取员工的信息 【EmpIds:员工id的集合】

代码示例如下:

a.在EmployeeMapper接口定义相应的方法

/**
 * 通过多个id获取员工的信息 【EmpIds:员工id的集合】
 * @param EmpIds
 * @return
 */
public List<Employee> selectEmpByIds(@Param("ids") List<Integer> EmpIds);

b.在EmployeeMapper接口对应的映射文件中定义相应的sql

<select id="selectEmpByIds" resultType="employee">
        SELECT
            `id`,
            `last_name`,
            `email`,
            `salary`,
            `dept_id`
        FROM
            `tbl_employee`
        <where>
            `id` in
            (
            <foreach collection="ids" item="id" separator=",">
                #{id}
            </foreach>
            )
        </where>
    </select>

c.测试

@Test
public void test04(){
    try {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过SqlSessionFactory对象调用openSession();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取EmployeeMapper的代理对象
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
        List<Employee> employees = employeeMapper.selectEmpByOneOpr(1);
        System.out.println(employees);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

🚩②批量导入

用法案例

批量添加员工数据

代码示例如下:

a.在EmployeeMapper接口定义相应的方法

//批量添加员工数据
    public void batchInsertEmp(@Param("emps") List<Employee> employees);

b.在EmployeeMapper接口对应的映射文件中定义相应的sql

// 批量添加员工数据,使用insert标签书写相应的sql
<insert id="batchInsertEmp">
    insert into
        tbl_employee(last_name,email,salary)
    values
        <foreach collection="emps" item="emp" separator=",">
            (#{emp.lastName},#{emp.email},#{emp.salary})
        </foreach>
</insert>

c.测试

@Test
public void test06(){
    try {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过SqlSessionFactory对象调用openSession();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取EmployeeMapper的代理对象
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
        //定义要添加的员工集合
       List<Employee> list=new ArrayList<>();
       list.add(new Employee("zhangsan","sdhjsd@qq.com",6700.0));
       list.add(new Employee("wangwu","dddhjsd@123.com",9700.0));
        employeeMapper.batchInsertEmp(list);
        sqlSession.commit();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

3.7 sql标签

👉功能

提取可重用SQL片段

❗注意

该SQL片段可以是一个完整的sql语句,也可以是一个sql语句中的某个片段)

👉用法案例

使用sql标签对3.6小节中的应用场景1的案例里映射文件里的的”select xxx,xxxx,xxx from

xxxx”部分提取出来,作为一个可重用的sql片段,在select>标签内引入该sql片段

代码示例如下:

①使用sql标签抽取映射文件中”select xxx,xxxx,xxx from xxxx”部分片段作为可重用的sql片段

<!-- 抽取映射文件中”select xxx,xxxx,xxx from xxxx”部分片段作为可重用的sql片段   -->
<sql id="select_employee">
        SELECT
            `id`,
            `last_name`,
            `email`,
            `salary`,
            `dept_id`
        FROM
            `tbl_employee`
    </sql>
    <select id="selectEmpByIds" resultType="employee">
        <!--  将刚才抽取的sql片段select_employee引入进来  -->
        <include refid="select_employee"></include>
        <where>
            `id` in
            (
            <foreach collection="ids" item="id" separator=",">
                #{id}
            </foreach>
            )
        </where>
    </select>

②测试运行

相关文章
|
4月前
|
SQL Java 测试技术
3、Mybatis-Plus 自定义sql语句
这篇文章介绍了如何在Mybatis-Plus框架中使用自定义SQL语句进行数据库操作。内容包括文档结构、编写mapper文件、mapper.xml文件的解释说明、在mapper接口中定义方法、在mapper.xml文件中实现接口方法的SQL语句,以及如何在单元测试中测试自定义的SQL语句,并展示了测试结果。
3、Mybatis-Plus 自定义sql语句
|
5天前
|
SQL XML Java
mybatis实现动态sql
MyBatis的动态SQL功能为开发人员提供了强大的工具来应对复杂的查询需求。通过使用 `<if>`、`<choose>`、`<foreach>`等标签,可以根据不同的条件动态生成SQL语句,从而提高代码的灵活性和可维护性。本文详细介绍了动态SQL的基本用法和实际应用示例,希望对您在实际项目中使用MyBatis有所帮助。
27 11
|
1月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
26天前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
2月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
53 10
|
3月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
4月前
|
SQL Java 数据库连接
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
文章讲述了在使用Mybatis时遇到的资源文件找不到的问题,并提供了通过修改Maven配置来解决资源文件编译到target目录下的方法。
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
|
3月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
67 1
|
4月前
|
SQL Java 数据库连接
Mybatis系列之 动态SQL
文章详细介绍了Mybatis中的动态SQL用法,包括`<if>`、`<choose>`、`<when>`、`<otherwise>`、`<trim>`和`<foreach>`等元素的应用,并通过实际代码示例展示了如何根据不同条件动态生成SQL语句。
|
4月前
|
SQL 关系型数据库 MySQL
解决:Mybatis-plus向数据库插入数据的时候 报You have an error in your SQL syntax
该博客文章讨论了在使用Mybatis-Plus向数据库插入数据时遇到的一个常见问题:SQL语法错误。作者发现错误是由于数据库字段中使用了MySQL的关键字,导致SQL语句执行失败。解决方法是将这些关键字替换为其他字段名称,以避免语法错误。文章通过截图展示了具体的操作步骤。