SpringBoot集成MyBatis
MyBatis的介绍
MyBatis 是一个开源的持久层框架,它是在 Java 中用于简化数据库访问的工具。MyBatis 的核心思想是将 SQL 语句和 Java 代码分离,通过 XML 或注解的方式来配置 SQL 映射,从而避免了传统 JDBC 编程中大量重复、繁琐的数据库访问代码。 以下是 MyBatis 的一些核心概念:
映射文件(Mapper File):MyBatis 使用 XML 文件或者注解来定义数据库操作的映射关系,其中包含了 SQL 语句以及参数映射等信息。这些映射文件定义了如何将 Java 对象与数据库表进行映射,以及如何执行数据库操作(如查询、插入、更新、删除等)。 SqlSession:SqlSession 提供了在数据库上执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来执行映射文件中定义的 SQL 命令,包括查询、插入、更新、删除等操作。 映射接口(Mapper Interface):除了使用 XML 文件外,MyBatis 还支持使用 Java 接口和注解来定义数据库操作,这种方式称为基于接口的映射。通过定义一个接口,然后使用注解或 XML 来与具体的 SQL 语句进行映射,可以使得数据库操作更加灵活和直观。 参数映射(Parameter Mapping):MyBatis 支持将查询参数映射到 SQL 语句中,可以方便地将 Java 对象与 SQL 参数进行绑定。 结果集映射(Result Mapping):MyBatis 支持将查询结果映射到 Java 对象,可以通过 XML 或注解定义映射规则,将查询结果转换为 Java 对象。 MyBatis 的优点在于它提供了较为灵活的 SQL 映射配置,使得开发人员可以直观地编写 SQL 语句,并且能够灵活地处理参数映射和结果映射。此外,通过使用动态 SQL、缓存等特性,MyBatis 能够提供良好的性能和扩展性。因此,MyBatis 在 Java 开发领域中得到了广泛的应用。
MyBatis在StringBoot项目中的使用
< dependencys>
< dependency>
< groupId> org.mybatis.spring.boot</ groupId>
< artifactId> mybatis-spring-boot-starter</ artifactId>
< version> 2.1.4</ version>
</ dependency>
< dependency>
< groupId> mysql</ groupId>
< artifactId> mysql-connector-java</ artifactId>
< scope> runtime</ scope>
</ dependency>
</ dependencys>
MyBatis配置 在 properties.yml 文件中配置对应的信息
datasource :
url : localhost: 3306/liu
spring :
datasource :
driver-class-name : com.mysql.jdbc.Driver
url : jdbc: mysql: //${ datasource.url} ? useUnicode=true&characterEncoding=UTF8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=UTC
username : /账号/
password : /密码/
hikari :
maximum-pool-size : 10
max-lifetime : 1770000
mybatis :
type-aliases-package : com.example.springboot_learn.entity
configuration :
map-underscore-to-camel-case : true
mapper-locations :
- classpath: mapper/*.xml
使⽤的连接池是 Spring Boot ⾃带的 hikari map-underscore-to-camel-case: true, ⽤来开启驼峰命名规范,这个⽐较好⽤,⽐如数据库中字段名为:user_name, 那么 在实体类中可以定义属性为 userName (甚⾄可以写成 username,也能映射上),会⾃动匹配到驼峰属性,如果不这样配置的话,针对字 段名和属性名不同的情况,会映射不到。
基于xml的整合
使用原始的xml的方式需要新建xml文件,在上⾯的 application.yml 配置⽂件中,我们已经定义了 xml ⽂件的路 径:classpath:mapper/*.xml,所以我们在 resources ⽬录下新建⼀个 mapper ⽂件夹,然后创建⼀个 xml ⽂件。 例子:通过用户的name获取用户信息: 在数据库中创建user表
create table user
(
id bigint auto_increment
primary key ,
password varchar ( 20 ) not null ,
username varchar ( 20 ) not null ,
have_money decimal null ,
constraint UK_sb8bbouer5wak8vyiiy4pf2bx
unique ( username)
) ;
表中插入一条待查询的数据 INSERT INTO liu.user (id, password, username, have_money) VALUES (1, ‘159075’, ‘liu’, 200); 存在用户实体类User
@Setter
@Getter
@ToString
public class User {
private Long id;
private String username;
private String password;
@JsonSerialize ( using = BigDecimalSerializer . class )
private BigDecimal haveMoney;
public User ( ) { }
public User ( Long id, String username, String password, BigDecimal haveMoney) {
this . id = id;
this . username = username;
this . password = password;
this . haveMoney = haveMoney;
}
}
@Setter
@Getter
public class JsonResult < T > {
private T data;
private String code;
private String message;
public JsonResult ( ) {
this . code = StatusCode . SUCCESS . getCode ( ) ;
this . message = "操作成功!" ;
}
public JsonResult ( String code, String message) {
this . code = code;
this . message = message;
}
public JsonResult ( T data) {
this . data = data;
this . code = StatusCode . SUCCESS . getCode ( ) ;
this . message = "操作成功!" ;
}
public JsonResult ( T data, String code, String message) {
this . data = data;
this . code = code;
this . message = message;
}
}
@Mapper
public interface UserMapper {
User getUserByName ( String username) ;
}
<?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.springboot_learn.mapper.UserMapper" >
< resultMap id = " BaseResultMap" type = " com.example.springboot_learn.entity.User" >
< id column = " id" jdbcType = " BIGINT" property = " id" />
< result column = " username" jdbcType = " VARCHAR" property = " username" />
< result column = " password" jdbcType = " VARCHAR" property = " password" />
< result column = " have_money" jdbcType = " VARCHAR" property = " haveMoney" />
</ resultMap>
< select id = " getUserByName" resultType = " User" parameterType = " String" >
select * from user where username = #{username};
</ select>
</ mapper>
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUserByName ( String username) {
return userMapper. getUserByName ( username) ;
}
}
定义controller层的类TestUserWithDataBase.java进行测试
@RestController
@RequestMapping ( "/database" )
public class TestUserWithDataBase {
@Resource
private UserService userService;
@RequestMapping ( "/getUserByName" )
public JsonResult < User > getUserByName ( @RequestParam ( value = "username" ) String username) {
User user = userService. getUserByName ( username) ;
System . out. println ( user) ;
return new JsonResult < > ( user) ;
}
}
访问:http://localhost:8001/database/getUserByName?username=liu 得到的结果:
{
"data": {
"id": 1,
"username": "liu",
"password": "159075",
"haveMoney": "200"
},
"code": "0",
"message": "操作成功!"
}
Spring Boot 如何知道这个 Mapper 呢?⼀种⽅法是在上⾯的 mapper 层对应的类上⾯添加 @Mapper 注解即可,但 是这种⽅法有个弊端,当我们有很多个 mapper 时,那么每⼀个类上⾯都得添加 @Mapper 注解。另⼀种⽐较简便的⽅法是在 Spring Boot 启动类上添加@MaperScan 注解,来扫描⼀个包下的所有 mapper。
基于注解的整合
使用注解的方式与数据库交互就不需要在xml中进行配置了,MyBatis主要提供了@Select、@Insert、@Updata、@Delete四个注解。 例子:使用id查询User 只需要在Mapper接口中,定义方法并使用@Select
@Mapper
public interface UserMapper {
User getUserByName ( String username) ;
@Select ( "select * from user where id = #{id}" )
User getUserById ( Long id) ;
}
Service类就能直接调用getUserById()进行查询了,就不用再书写xml配置文件了。 如果是多个参数的话,比如使用id和name查询User,可以使用@Param注解
@Mapper
public interface UserMapper {
User getUserByName ( String username) ;
@Select ( "select * from user where id = #{id}" )
User getUserById ( Long id) ;
@Select ( "select * from user where id = #{id} and username = #{username}" )
User getUserByIdAndName ( @Param ( "id" ) Long id, @Param ( "username" ) String username) ;
}
@Param 指定的参数应该要和 sql 中 #{} 取的参数名相同,不同则取不到。 ⼀般我们在设计表字段后,都会根据⾃动⽣成⼯具⽣成实体类,这样的话,基本上实体类是能和表字段对应上的, 最起码也是驼峰对应的,由于在上⾯配置⽂件中开启了驼峰的配置,所以字段都是能对的上的。但是,万⼀有对不上的呢?我们也有解决办 法,使⽤ @Results 注解来解决。
@Select("select * from user where id = #{id}")
@Results({
@Result(property = "username", column = "user_name"),
@Result(property = "password", column = "password")
})
User getUser(Long id);