MyBatis框架基础

文章目录

  • [1 MyBatis概述](#1 MyBatis概述)
  • [2 MyBatis入门](#2 MyBatis入门)
    • [2.1 相关依赖](#2.1 相关依赖)
    • [2.2 properties配置文件](#2.2 properties配置文件)
    • [2.3 预编译SQL](#2.3 预编译SQL)
  • [3 基本操作](#3 基本操作)
    • [3.1 新增操作](#3.1 新增操作)
    • [3.2 删除操作](#3.2 删除操作)
    • [3.3 更新操作](#3.3 更新操作)
    • [3.4 查询操作](#3.4 查询操作)
  • [4 动态SQL](#4 动态SQL)
    • [4.1 XML映射文件](#4.1 XML映射文件)
    • [4.2 if/set/where标签](#4.2 if/set/where标签)
    • [4.3 foreach标签](#4.3 foreach标签)
    • [4.4 sql/include标签](#4.4 sql/include标签)
  • [5 参考资料](#5 参考资料)

1 MyBatis概述

MyBatis是一款优秀的持久层(即数据访问层)框架,它支持定制化SQL、存储过程避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java对象映射成数据库中的记录。

官网:https://mybatis.org/mybatis-3/zh/index.html

2 MyBatis入门

2.1 相关依赖

创建Spring Boot工程,并导入MyBatis Framework、MySQL Driver。

xml 复制代码
    <dependencies>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter-test</artifactId>
            <version>3.0.3</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

Lombok工具包:通过注解的形式自动生成构造器、getter、setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率。

  1. @Data = @Getter + @Setter + @ToString + @EqualsAndHashCode:为所有的属性提供get方法、set方法,生成易阅读的 toString 方法,自动重写 equals 方法和 hashCode 方法。

  2. @NoArgsConstructor:为实体类生成无参的构造器方法。

  3. @AllArgsConstructor:为实体类生成除了static修饰的字段之外带有各参数的构造器方法。

xml 复制代码
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

2.2 properties配置文件

在Spring Boot项目中,可以编写application.properties文件配置数据库连接信息,包括driver-class-name、url 、username,password。同时可以根据需要进行其他配置。

properties 复制代码
# 数据库连接信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
spring.datasource.username=root
spring.datasource.password=1234

# 将MyBatis日志输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

# 自动将下划线命名的字段名按驼峰命名规则映射
mybatis.configuration.map-underscore-to-camel-case=true

2.3 预编译SQL

编译一次之后会将编译后的SQL语句缓存起来,后面再次执行这条语句时,不会再次编译,只是输入的参数不同。同时能将敏感字进行转义,保障SQL的安全性,防止SQL注入。

在Mybatis中提供的参数占位符有两种:${...} 、#{...}

  1. #{...}:执行SQL时,会将#{...}替换为 ? ? ?,生成预编译SQL,会自动设置参数值,一般用于参数传递,项目开发中更推荐使用。

  2. ${...}:拼接SQL,直接将参数拼接在SQL语句中,存在SQL注入问题,如果对表名、列表进行动态设置时使用。

3 基本操作

3.1 新增操作

@Mapper注解:MyBatis框架中的注解,用于标注数据访问层的接口。

@Insert注解:用于编写INSERT操作的SQL语句。

@Options注解:可以用于设置缓存时间或为对象生成自增的主键值。

java 复制代码
@Mapper
public interface EmpMapper {
    @Options(useGeneratedKeys = true,keyProperty = "id")
    @Insert("INSERT INTO emp(username, name, gender, job, entry_date, dept_id, create_time, update_time) "
            +"VALUES(#{username},#{name},#{gender},#{job},#{entryDate},#{dept},#{createTime},#{updateTime})")
    void insertEmp(Emp emp);
}

3.2 删除操作

@Delete注解:用于编写DELETE操作的SQL语句。

java 复制代码
@Mapper
public interface EmpMapper {
    @Delete("DELETE FROM emp WHERE id=#{id}")
    void deleteEmpById(Integer id);
}

3.3 更新操作

@Update注解:用于编写UPDATE操作的SQL语句。

java 复制代码
@Mapper
public interface EmpMapper {
    @Update("UPDATE emp SET username=#{username},name=#{name},image=#{image},update_time=#{updateTime} WHERE id=#{id}")
    void updateEmp(Emp emp);
}

3.4 查询操作

@Select注解:

java 复制代码
@Mapper
public interface EmpMapper {
    @Select("SELECT id, username, password, name, gender, image, job, entry_date, dept_id, create_time, update_time FROM emp WHERE id=#{id}")
    Emp selectEmpById(Integer id);
}

4 动态SQL

4.1 XML映射文件

实现复杂的SQL功能,建议使用XML来配置映射语句,在Mybatis中使用XML映射文件方式开发,需要符合一定的规范:

  1. XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在Resource中相同包下;

  2. XML映射文件的namespace属性为Mapper接口全限定名一致;

  3. XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。

4.2 if/set/where标签

<if>:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。

xml 复制代码
<if test="条件表达式">
    要拼接的sql语句
</if>

<where>:只会在子元素有内容的情况下才插入WHERE子句,而且会自动去除子句的开头的AND或OR。

<set>:动态的在SQL语句中插入SET关键字,并会删掉额外的逗号。

EmpMapper.java

java 复制代码
@Mapper
public interface EmpMapper {
    void updateEmp2(Emp emp);
}

EmpMapper.xml

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="com.example.mapper.EmpMapper">

    <update id="updateEmp2">
        UPDATE emp
        <set>
            <if test="username!=null">
                username=#{username},
            </if>
            <if test="name!=null">
                name=#{name},
            </if>
            <if test="image!=null">
                image=#{image},
            </if>
            <if test="updateTime!=null">
                update_time=#{updateTime}
            </if>
            WHERE id=#{id}
        </set>
    </update>

</mapper>

4.3 foreach标签

<foreach>:遍历集合内的参数并进行拼接。

xml 复制代码
<foreach collection="集合名称" item="集合遍历出来的元素/项" separator="每一次遍历使用的分隔符" 
         open="遍历开始前拼接的片段" close="遍历结束后拼接的片段">
</foreach>

EmpMapper.java

java 复制代码
@Mapper
public interface EmpMapper {
    void deleteEmpByIds(List<Integer> ids);
}

EmpMapper.xml

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="com.example.mapper.EmpMapper">

    <delete id="deleteEmpByIds">
        DELETE FROM emp WHERE id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>

</mapper>

4.4 sql/include标签

<sql>:定义可重用的SQL片段。

<include>:通过属性refid,指定包含的SQL片段。

EmpMapper.java

java 复制代码
@Mapper
public interface EmpMapper {
    void updateEmp2(Emp emp);
}

EmpMapper.xml

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="com.example.mapper.EmpMapper">

    <sql id="commonSelect">
        SELECT id, username, password, name, gender, image, job, entry_date, dept_id, create_time, update_time
        FROM emp
    </sql>

    <select id="selectEmpByCondition" resultType="com.example.pojo.Emp">
        <include refid="commonSelect"/>
        <where>
            <if test="name!=null">
                name LIKE CONCAT('%',#{name},'%')
            </if>
            <if test="gender!=null">
                AND gender=#{gender}
            </if>
            <if test="begin!=null and end!=null">
                AND entry_date BETWEEN #{begin} AND #{end}
            </if>
            ORDER BY update_time DESC
        </where>
    </select>

</mapper>

5 参考资料

黑马程序员JavaWeb开发教程-bilibili

相关推荐
dj244294570715 分钟前
JAVA中的Lamda表达式
java·开发语言
工业3D_大熊29 分钟前
3D可视化引擎HOOPS Luminate场景图详解:形状的创建、销毁与管理
java·c++·3d·docker·c#·制造·数据可视化
szc176732 分钟前
docker 相关命令
java·docker·jenkins
程序媛-徐师姐42 分钟前
Java 基于SpringBoot+vue框架的老年医疗保健网站
java·vue.js·spring boot·老年医疗保健·老年 医疗保健
yngsqq43 分钟前
c#使用高版本8.0步骤
java·前端·c#
尘浮生1 小时前
Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
小白不太白9501 小时前
设计模式之 模板方法模式
java·设计模式·模板方法模式
Tech Synapse1 小时前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
xoxo-Rachel1 小时前
(超级详细!!!)解决“com.mysql.jdbc.Driver is deprecated”警告:详解与优化
java·数据库·mysql