MyBatis数据操作和动态SQL


本篇讲MyBatis数据操作和动态SQL

在使用原生的JDBC去实现查询时,往往需要我们进行手动拼接sql语句。mybatis提供了相关的动态标签可以大大简化我们的操作。


一、数据操作和动态SQL的使用

根据业务逻辑的需要,mybatis给我们提供了四种操作数据的标签,首先实体类是以员工类和部门类作为演示

package com.lzl.entity;

import java.io.Serializable;

/**
 * --效率,是成功的核心关键--
 * --自负,会让每个人都屈膝下跪--
 *
 * @Author lzl
 * @Date 2022/9/17 09:54
 */

public class Employee implements Serializable {
    private Integer emp_no;
    private String emp_name;
    private String  emp_gender;
    private Integer emp_age;
    private Integer emp_dept_no;
    private Double emp_salary;
    private String emp_hire_time;
    private String emp_position;
    private Integer emp_status;
    private Department department;

    public Employee(Integer emp_no, String emp_name, String emp_gender, Integer emp_age, Integer emp_dept_no, Double emp_salary, String emp_hire_time, String emp_position, Integer emp_status, Department department) {
        this.emp_no = emp_no;
        this.emp_name = emp_name;
        this.emp_gender = emp_gender;
        this.emp_age = emp_age;
        this.emp_dept_no = emp_dept_no;
        this.emp_salary = emp_salary;
        this.emp_hire_time = emp_hire_time;
        this.emp_position = emp_position;
        this.emp_status = emp_status;
        this.department = department;
    }

    public Employee() {
    }

  //getter 和 setter方法略

    @Override
    public String toString() {
        return "Employee{" +
                "emp_no=" + emp_no +
                ", emp_name='" + emp_name + '\'' +
                ", emp_gender='" + emp_gender + '\'' +
                ", emp_age=" + emp_age +
                ", emp_dept_no=" + emp_dept_no +
                ", emp_salary=" + emp_salary +
                ", emp_hire_time='" + emp_hire_time + '\'' +
                ", emp_position='" + emp_position + '\'' +
                ", emp_status=" + emp_status +
                ", department=" + department +
                '}';
    }
}

package com.lzl.entity;

import java.io.Serializable;
import java.util.List;

/**
 * --效率,是成功的核心关键--
 * --自负,会让每个人都屈膝下跪--
 *
 * @Author lzl
 * @Date 2022/9/17 09:54
 */

public class Department implements Serializable {
    private Integer dept_no;
    private String dept_name;
    private List<Employee> list;

    public Department(Integer dept_no, String dept_name, List<Employee> list) {
        this.dept_no = dept_no;
        this.dept_name = dept_name;
        this.list = list;
    }

    public Department() {
    }

//getter和setter方法略

    @Override
    public String toString() {
        return "Department{" +
                "dept_no=" + dept_no +
                ", dept_name='" + dept_name + '\'' +
                ", list=" + list +
                '}';
    }
}

select查询标签

 <!-- id是全局引用的唯一标识 type是指定的实体类名 可以是别名-->
    <resultMap id="empMap" type="employee">
        <!-- property是实体类属性 column是数据库列名 -->
        <!-- id标注主键列 -->
        <!-- result标注普通列-->
        <id property="emp_no" column="emp_no" jdbcType="INTEGER"/>
        <result property="emp_name" column="emp_name" jdbcType="VARCHAR"/>
        <result property="emp_gender" column="emp_gender" jdbcType="VARCHAR"/>
        <result property="emp_age" column="emp_age" jdbcType="INTEGER"/>
        <result property="emp_dept_no" column="emp_dept_no" jdbcType="INTEGER"/>
        <result property="emp_salary" column="emp_salary" jdbcType="DOUBLE"/>
        <result property="emp_hire_time" column="emp_hire_time" jdbcType="VARCHAR"/>
        <result property="emp_position" column="emp_position" jdbcType="VARCHAR"/>
        <result property="emp_status" column="emp_status" jdbcType="INTEGER"/>
        <!-- 映射多类合作 普通属性可以不用指定jdbcType  此处指定的是javaType 必须指定-->
        <association property="department" javaType="department">
            <id column="dept_no" property="dept_no"/>
            <result column="dept_name" property="dept_name"/>
        </association>
    </resultMap>
    <!-- 注意在<select>元素中,不能同时使用 resultMap 和 resultType 属性。-->
    <select id="getAll" resultMap="empMap">
        select e.*,d.dept_no,d.dept_name from employee e
        inner join department d on e.emp_dept_no = d.dept_no
        <where>
            <if test="emp_name !=null and emp_name !=''">
                and e.emp_name like "%"#{emp_name}"%"
            </if>
            <if test="emp_no !=null and emp_no !=''">
                and e.emp_no = #{emp_no}
            </if>
            <if test="emp_position !=null and emp_position !=''">
                and e.emp_position = #{emp_position}
            </if>
            <if test="emp_status !=null and emp_status !=''">
                and e.emp_status = #{emp_status}
            </if>
            <if test="beginTime !=null and beginTime !=''">
                and e.emp_hire_time  &gt;= #{beginTime}
            </if>
            <if test="endTime !=null and endTime !=''">
                and e.emp_hire_time &lt;= #{endTime}
            </if>
        </where>
        order by e.emp_no
        limit #{page},#{limit}
    </select>

resultMap配置一对一映射 此处不在详细介绍
collection配置多对一映射,看下边代码:

<resultMap id="department" type="department">
        <id property="deptNo" column="dept_no"/>
        <result property="deptName" column="dept_name"/>
        <collection property="employeeList" ofType="com.lzl.pojo.Employee">
            <id property="empNo" column="emp_no"/>
            <result property="empName" column="emp_name"/>
            <result property="empGender" column="emp_gender"/>
            <result property="empAge" column="emp_age"/>
            <result property="empSalary" column="emp_salary"/>
            <result property="empHireTime" column="emp_hire_time"/>
            <result property="empPosition" column="emp_position"/>
            <result property="empStatus" column="emp_status"/>
        </collection>
    </resultMap>
  • where标签表示条件语句,搭配if标签即可实现动态拼接sql语句
  • if标签表示判断

sql片段标签的使用

<!--  sql片段  -->
    <sql id="user_fields">
        u.id id,
        u.username,
        u.`password`,
        u.birthday,
        u.phone,
        u.address
    </sql>

    <select id="findUserById" resultType="User" parameterType="int">
        select
           <!--  引用sql片段  -->
           <include refid="user_fields"/>
        from user u where u.id = #{id}
    </select>

insert插入标签

 <insert id="addNew" useGeneratedKeys="true" keyColumn="emp_no" keyProperty="emp_no">
        insert into employee(emp_name,emp_gender,emp_age,emp_dept_no,emp_salary,
            emp_hire_time,emp_position)
        values(#{emp_name},#{emp_gender},#{emp_age},#{emp_dept_no},#{emp_salary},
        #{emp_hire_time},#{emp_position});
    </insert>

如何获取自增主键的值:
useGeneratedKeys=“true” 告诉mybatis获取自增主键的值
keyColumn: 来自于表的对应列
keyProperty:要存到实体类的属性
可以把获取的自增主键的值 反向存储到传入的实体类的对应属性中
例如,在电商业务中,下订单可以生成一个订单号,做一个自动回显的效果,可以通过获取自增主键设置给实体。
可以在insert标签中添加以下sql片段

 <selectKey keyProperty="id" order="AFTER" resultType="int">
     select last_insert_id()
 </selectKey>

keyProperty : 装载id的属性
order : 顺序,是指在insert前或者后执行该句话
resultType : 结果类型
解释: 在插入数据后,执行该句话,将主键查询到将其赋值给User类的id属性
select last_insert_id()是mybatis自己提供的一个语句可以得到自增长的id属性值

update修改标签

<update id="updateInfo">
        update employee
        <set>
            <if test="emp_name != null and emp_name != '' ">
                emp_name = #{emp_name},
            </if>
            <if test="emp_gender != null and emp_gender != '' ">
                emp_gender = #{emp_gender},
            </if>
            <if test="emp_age != null and emp_age != '' ">
                emp_age = #{emp_age},
            </if>
            <if test="emp_dept_no != null and emp_dept_no != '' ">
                emp_dept_no = #{emp_dept_no},
            </if>
            <if test="emp_salary != null and emp_salary != '' ">
                emp_salary = #{emp_salary},
            </if>
            <if test="emp_position != null and emp_position != '' ">
                emp_position = #{emp_position},
            </if>
            <if test="emp_status != null and emp_status != '' ">
                emp_status = #{emp_status},
            </if>
        </set>
        where emp_no = #{emp_no}
    </update>

set标签可以把我们的修改语句智能的进行set的拼接,并且会自动帮我们去掉最后的逗号

delete删除标签

<delete id="deleteInfoByEmp_no">
        delete from employee where emp_no in
        <foreach collection="emp_nos" item="emp_no"
                 open="(" close=")" separator=",">
            #{emp_no}
        </foreach>
    </delete>

foreach是一个动态遍历的标签
collection 指定的是传过来的参数名,注意,参数名要用注解修饰,否则无法识别。
item是集合中的形参名
open标签指定开头的拼接内容
close指定结束的拼接内容
separator指定每个元素之间的中间隔断字符

总结

以上就是使用mybatis框架去实现增删改查的全部过程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值