Mybatis简介
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs (Plain Old Java Objects, 普通的 Java 对象) 映射成数据库中的记录。
核心特点
1、简化数据库操作:
-
MyBatis 通过 XML 或注解配置 SQL 语句,避免了繁琐的 JDBC 代码。
-
开发者只需关注 SQL 本身,而不需要处理连接、预编译语句、结果集等底层细节。
2、灵活的 SQL 映射:
-
支持动态 SQL,可以根据条件生成不同的 SQL 语句。
-
提供强大的映射功能,支持将查询结果直接映射为 Java 对象或集合。
3、与 Spring 集成:
- MyBatis 可以轻松与 Spring 框架集成,简化配置和管理。
4、轻量级:
- MyBatis 是一个轻量级框架,核心库非常小,学习成本低。
5、支持多种数据库:
- MyBatis 支持多种数据库(如 MySQL、Oracle、PostgreSQL 等),具有良好的可移植性。
Spring Boot 整合原生的 mybatis
maven依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><artifactId>spring-boot-demo-orm-mybatis</artifactId><version>1.0.0-SNAPSHOT</version><packaging>jar</packaging><name>spring-boot-demo-orm-mybatis</name><description>Demo project for Spring Boot</description><parent><groupId>com.xiaoma</groupId><artifactId>spring-boot-demo</artifactId><version>1.0.0-SNAPSHOT</version></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><mybatis.version>1.3.2</mybatis.version></properties><dependencies><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><finalName>spring-boot-demo-orm-mybatis</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
SpringBootDemoOrmMybatisApplication.java
@MapperScan(basePackages = {"com.xiaoma.orm.mybatis.mapper"})
@SpringBootApplication
public class SpringBootDemoOrmMybatisApplication {public static void main(String[] args) {SpringApplication.run(SpringBootDemoOrmMybatisApplication.class, args);}
}
application.yaml
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivertype: com.zaxxer.hikari.HikariDataSourceinitialization-mode: alwayscontinue-on-error: trueschema:- "classpath:db/schema.sql"data:- "classpath:db/data.sql"hikari:minimum-idle: 5connection-test-query: SELECT 1 FROM DUALmaximum-pool-size: 20auto-commit: trueidle-timeout: 30000pool-name: SpringBootDemoHikariCPmax-lifetime: 60000connection-timeout: 30000
logging:level:com.xiaoma: debugcom.xiaoma.orm.mybatis.mapper: trace
mybatis:configuration:# 下划线转驼峰map-underscore-to-camel-case: truemapper-locations: classpath:mappers/*.xmltype-aliases-package: com.xiaoma.orm.mybatis.entity
UserMapper.java
@Mapper
@Component
public interface UserMapper {/*** 查询所有用户** @return 用户列表*/@Select("SELECT * FROM orm_user")List<User> selectAllUser();/*** 根据id查询用户** @param id 主键id* @return 当前id的用户,不存在则是 {@code null}*/@Select("SELECT * FROM orm_user WHERE id = #{id}")User selectUserById(@Param("id") Long id);/*** 保存用户** @param user 用户* @return 成功 - {@code 1} 失败 - {@code 0}*/int saveUser(@Param("user") User user);/*** 删除用户** @param id 主键id* @return 成功 - {@code 1} 失败 - {@code 0}*/int deleteById(@Param("id") Long id);}
UserMapper.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.xiaoma.orm.mybatis.mapper.UserMapper"><insert id="saveUser">INSERT INTO `orm_user` (`name`,`password`,`salt`,`email`,`phone_number`,`status`,`create_time`,`last_login_time`,`last_update_time`)VALUES (#{user.name},#{user.password},#{user.salt},#{user.email},#{user.phoneNumber},#{user.status},#{user.createTime},#{user.lastLoginTime},#{user.lastUpdateTime})</insert><delete id="deleteById">DELETEFROM `orm_user`WHERE `id` = #{id}</delete>
</mapper>
UserMapperTest.java
@Slf4j
public class UserMapperTest extends SpringBootDemoOrmMybatisApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void selectAllUser() {List<User> userList = userMapper.selectAllUser();Assert.assertTrue(CollUtil.isNotEmpty(userList));log.debug("【userList】= {}", userList);}@Testpublic void selectUserById() {User user = userMapper.selectUserById(1L);Assert.assertNotNull(user);log.debug("【user】= {}", user);}@Testpublic void saveUser() {String salt = IdUtil.fastSimpleUUID();User user = User.builder().name("testSave3").password(SecureUtil.md5("123456" + salt)).salt(salt).email("testSave3@xkcoding.com").phoneNumber("17300000003").status(1).lastLoginTime(new DateTime()).createTime(new DateTime()).lastUpdateTime(new DateTime()).build();int i = userMapper.saveUser(user);Assert.assertEquals(1, i);}@Testpublic void deleteById() {int i = userMapper.deleteById(1L);Assert.assertEquals(1, i);}
}