什么是 MyBatis?
MyBatis 是一款优秀的 Java 持久层框架,它通过 XML 或注解的方式将 Java 对象与数据库中的记录进行映射。与传统的 JDBC 相比,MyBatis 极大地简化了数据库操作代码,让开发者能够更专注于业务逻辑而不是繁琐的数据访问细节。
MyBatis 的核心特点:
简化了 JDBC 的复杂操作
支持动态 SQL,能够根据条件灵活构建查询语句
提供了强大的映射机制,支持复杂的对象关系映射
与 Spring 等主流框架无缝集成
学习曲线平缓,配置灵活
为什么选择 MyBatis?
与其它持久层框架的对比
相比于 Hibernate 这样的全自动 ORM 框架,MyBatis 提供了更多的灵活性。MyBatis 允许你直接编写原生 SQL,这在处理复杂查询或需要优化 SQL 性能时具有明显优势。
主要优势:
灵活性:可以编写原生 SQL,灵活控制查询逻辑
性能优化:直接控制 SQL 语句,便于性能调优
简化开发:减少了大量 JDBC 模板代码
易于学习:学习曲线平缓,上手快速
与 Spring 集成良好:可以无缝集成到 Spring 框架中
环境搭建
创建springboot项目
导入mybatis起步依赖、mysql驱动及其他需求(首次使用下载时间会较长)
连接数据源
建立数据库
范例代码:- -- 创建数据库
- CREATE DATABASE IF NOT EXISTS demo;
- USE demo;
- -- 创建员工表
- CREATE TABLE employees (
- id INT PRIMARY KEY AUTO_INCREMENT,
- employee_id VARCHAR(20) UNIQUE NOT NULL,
- name VARCHAR(50) NOT NULL,
- gender ENUM('男', '女') NOT NULL,
- age INT,
- department VARCHAR(50) NOT NULL,
- position VARCHAR(50) NOT NULL,
- salary DECIMAL(10,2),
- hire_date DATE NOT NULL,
- email VARCHAR(100),
- phone VARCHAR(20),
- address VARCHAR(200),
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
- );
- -- 插入示例数据
- INSERT INTO employees (employee_id, name, gender, age, department, position, salary, hire_date, email, phone, address)
- VALUES
- ('EMP001', '张三', '男', 28, '技术部', '软件工程师', 15000.00, '2020-03-15', 'zhangsan@company.com', '13800138001', '北京市海淀区'),
- ('EMP002', '李四', '女', 32, '人力资源部', 'HR经理', 12000.00, '2018-06-20', 'lisi@company.com', '13800138002', '北京市朝阳区'),
- ('EMP003', '王五', '男', 35, '财务部', '财务主管', 18000.00, '2016-09-10', 'wangwu@company.com', '13800138003', '北京市西城区'),
- ('EMP004', '赵六', '女', 26, '市场部', '市场专员', 8000.00, '2021-01-08', 'zhaoliu@company.com', '13800138004', '北京市东城区'),
- ('EMP005', '钱七', '男', 30, '技术部', '高级工程师', 20000.00, '2019-11-25', 'qianqi@company.com', '13800138005', '北京市丰台区'),
- ('EMP006', '孙八', '女', 29, '销售部', '销售经理', 16000.00, '2020-07-30', 'sunba@company.com', '13800138006', '北京市石景山区'),
- ('EMP007', '周九', '男', 27, '技术部', '前端开发', 13000.00, '2021-03-12', 'zhoujiu@company.com', '13800138007', '北京市通州区'),
- ('EMP008', '吴十', '女', 33, '行政部', '行政主管', 11000.00, '2017-05-18', 'wushi@company.com', '13800138008', '北京市昌平区'),
- ('EMP009', '郑十一', '男', 31, '财务部', '会计', 10000.00, '2019-08-22', 'zhengshiyi@company.com', '13800138009', '北京市大兴区'),
- ('EMP010', '王芳', '女', 25, '市场部', '市场助理', 7000.00, '2022-02-14', 'wangfang@company.com', '13800138010', '北京市房山区');
复制代码 范例效果:
若已有数据库,则直接连接
在application.properties文件中配置数据库连接信息:
- spring.application.name=demo
- #驱动类名称
- spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- #数据库连接的url
- spring.datasource.url=jdbc:mysql://localhost:3306/demo
- #连接数据库的用户名
- spring.datasource.username=root
- #连接数据库的密码
- spring.datasource.password=1234
复制代码 实体类设计
在 MyBatis 中,实体类对应数据库中的表结构。良好的实体类设计是使用 MyBatis 的基础。
- @Data
- @NoArgsConstructor
- @AllArgsConstructor
- public class Emp {
- private Integer id; //ID
- private String username; //用户名
- private String password; //密码
- private String name; //姓名
- private Short gender; //性别 , 1 男, 2 女
- private String image; //图像url
- private Short job; //职位 , 1 班主任 , 2 讲师 , 3 学工主管 , 4 教研主管 , 5 咨询师
- private LocalDate entrydate; //入职日期
- private Integer deptId; //部门ID
- private LocalDateTime createTime; //创建时间
- private LocalDateTime updateTime; //修改时间
- }
复制代码
Mapper 接口设计
Mapper 接口定义了数据访问的方法,可以使用注解完成接口的实现。(例如实例代码中“分页查询”“查询数据总数”“新增员工”“根据id查询员工信息”这些功能的实现)
- @Mapper
- public interface EmpMapper {
- //分页查询
- @Select("select * from emp limit #{start},#{pageSize}")
- List<Emp> page(Integer start, Integer pageSize);
- //条件分页查询
- List<Emp> list(Integer start, Integer pageSize,String name, Short gender, LocalDate begin, LocalDate end);
- //查询数据总数
- @Select("select count(*) from emp")
- Long count();
- //批量删除员工
- void delete(List<Integer> ids);
- //新增员工
- @Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +
- "value(#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
- void save(Emp emp);
- //根据id更新员工信息
- void update(Emp emp);
- //根据id查询员工信息
- @Select("select * from emp where id = #{id}")
- Emp getById(Integer id);
- }
复制代码
Mapper XML 映射文件
XML 映射文件是 MyBatis 的核心,它定义了 SQL 语句和结果映射。在sql语句较复杂的情况下,不建议使用注解实现mapper接口(这样会使得代码显得杂乱不易阅读),而是在XML映射文件中编写sql语句。需要注意的是,XML映射文件的路径名称必须于mapper接口路径名称相同。(EmpMapper接口文件路径名称为:cn.nuist.tlias.mapper.EmpMapper,XML映射文件路径名称也为:cn.nuist.tlias.mapper.EmpMapper)
mapper接口中的“分页条件查询”“批量删除员工信息”和“根据id更新员工信息”功能在XML映射文件中实现:- <?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="cn.nuist.tlias.mapper.EmpMapper">
- <select id="list" resultType="cn.nuist.tlias.pojp.Emp">
- select *
- from emp
- <where>
- <if test="name != null and name != ''">
- name like concat('%',#{name},'%')
- </if>
- <if test="gender != null">
- and gender = #{gender}
- </if>
- <if test="begin != null and end != null">
- and entrydate between #{begin} and #{end}
- </if>
- </where>
- order by update_time desc
- limit #{start},#{pageSize}
- </select>
- <delete id="delete">
- delete
- from emp
- where id in
- <foreach collection="ids" item="id" open="(" separator="," close=")">
- #{id}
- </foreach>
- </delete>
-
- <update id="update">
- update emp
- <set>
- <if test="username != null and username != ''">
- username = #{username}
- </if>
- <if test="name != null and name != ''">
- name = #{name}
- </if>
- <if test="gender != null">
- gender = #{gender}
- </if>
- <if test="image != null and image != ''">
- image = #{image}
- </if>
- <if test="job != null">
- job = #{job}
- </if>
- <if test="entrydate != null">
- entrydate = #{entrydate}
- </if>
- <if test="deptId != null">
- dept_id = #{deptId}
- </if>
- <if test="updateTime != null">
- update_time = #{updateTime}
- </if>
- </set>
- where id = #{id}
- </update>
- </mapper>
复制代码 动态 SQL:灵活构建查询
MyBatis 的强大特性之一就是动态 SQL,它允许你根据条件动态生成 SQL 语句。
:根据条件包含 SQL 片段
, , :实现类似 switch-case 的逻辑
:智能处理 WHERE 条件,自动去除多余的 AND/OR
:用于 UPDATE 语句,智能处理 SET 子句
:遍历集合,常用于 IN 条件或批量操作
:更灵活的字符串修剪功能
:创建变量并在当前上下文使用
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |