本篇讲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 >= #{beginTime}
</if>
<if test="endTime !=null and endTime !=''">
and e.emp_hire_time <= #{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框架去实现增删改查的全部过程。