文章目录
- 1 MyBatis概述
- 2 MyBatis入门
- 2.1 相关依赖
- 2.2 properties配置文件
- 2.3 预编译SQL
- 3 基本操作
- 3.1 新增操作
- 3.2 删除操作
- 3.3 更新操作
- 3.4 查询操作
- 4 动态SQL
- 4.1 XML映射文件
- 4.2 if/set/where标签
- 4.3 foreach标签
- 4.4 sql/include标签
- 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。
<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开发、提高效率。
@Data = @Getter + @Setter + @ToString + @EqualsAndHashCode:为所有的属性提供get方法、set方法,生成易阅读的 toString 方法,自动重写 equals 方法和 hashCode 方法。
@NoArgsConstructor:为实体类生成无参的构造器方法。
@AllArgsConstructor:为实体类生成除了static修饰的字段之外带有各参数的构造器方法。
<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。同时可以根据需要进行其他配置。
# 数据库连接信息
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中提供的参数占位符有两种:${…} 、#{…}
#{…}:执行SQL时,会将#{…}替换为 ? ? ?,生成预编译SQL,会自动设置参数值,一般用于参数传递,项目开发中更推荐使用。
${…}:拼接SQL,直接将参数拼接在SQL语句中,存在SQL注入问题,如果对表名、列表进行动态设置时使用。
3 基本操作
3.1 新增操作
@Mapper注解:MyBatis框架中的注解,用于标注数据访问层的接口。
@Insert注解:用于编写INSERT操作的SQL语句。
@Options注解:可以用于设置缓存时间或为对象生成自增的主键值。
@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语句。
@Mapper
public interface EmpMapper {@Delete("DELETE FROM emp WHERE id=#{id}")void deleteEmpById(Integer id);
}
3.3 更新操作
@Update注解:用于编写UPDATE操作的SQL语句。
@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注解:
@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映射文件方式开发,需要符合一定的规范:
-
XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在Resource中相同包下;
-
XML映射文件的namespace属性为Mapper接口全限定名一致;
-
XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。
4.2 if/set/where标签
<if>
:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。
<if test="条件表达式">要拼接的sql语句
</if>
<where>
:只会在子元素有内容的情况下才插入WHERE子句,而且会自动去除子句的开头的AND或OR。
<set>
:动态的在SQL语句中插入SET关键字,并会删掉额外的逗号。
EmpMapper.java
@Mapper
public interface EmpMapper {void updateEmp2(Emp emp);
}
EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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>
:遍历集合内的参数并进行拼接。
<foreach collection="集合名称" item="集合遍历出来的元素/项" separator="每一次遍历使用的分隔符" open="遍历开始前拼接的片段" close="遍历结束后拼接的片段">
</foreach>
EmpMapper.java
@Mapper
public interface EmpMapper {void deleteEmpByIds(List<Integer> ids);
}
EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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
@Mapper
public interface EmpMapper {void updateEmp2(Emp emp);
}
EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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_timeFROM 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