1、MyBatis介绍
MyBatis的官方定义:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
2、MyBatis配置
官方文档说明:https://mybatis.org/mybatis-3/zh/configuration.html
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
- configuration(配置)
- properties(属性):属性文件在实际应用中一般采用Spring进行配置,而不是MyBatis。
- settings(设置):这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为,可以配置映射规则,如自动映射和驼峰映射、执行器、缓存等,具体配置项可以参考官方文档:https://mybatis.org/mybatis-3/zh/configuration.html#settings
- typeAliases(类型别名):类型别名是为 Java 类型设置一个短的名字。 它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
- typeHandlers(类型处理器):在MyBatis写入和读取数据库的过程中对于不同类型的数据(Java对应JavaType,数据库对应JdbcType)进行自定义转换。
- objectFactory(对象工厂):MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。 如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。
- plugins(插件):也可以成为拦截器,通过动态代理和责任链模式来完成,可以修改MyBatis底层的实现功能。
- environments(环境配置):可以配置数据库连接内容和事务,一般可以交给Spring托管。
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识):允许MyBatis配置多类型数据库支持。
- mappers(映射器):提供SQL和POJO映射关系。
3、实战
3.1 创建项目
创建一个项目springboot-mybatis,引入相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
3.2 代码清单
SQL脚本
-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`name` varchar(10) DEFAULT '' COMMENT '用户姓名',
`password` varchar(32) DEFAULT '' COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
INSERT INTO `t_user` VALUES (1, '小H', '123456');
INSERT INTO `t_user` VALUES (2, '萧炎', '123456');
用户实体对象:User.java
public class User {
// 主键
private String id;
// 用户名
private String name;
// 密码
private String password;
// 省略掉getter、setter、toString
}
dao层接口:UserDao.java
@Mapper
public interface UserDao {
List<User> findAll();
}
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.xiaoh.springboot.mybatis.dao.UserDao">
<!-- 可根据自己的需求,是否要使用 -->
<resultMap type="com.xiaoh.springboot.mybatis.domain.User" id="userMap">
<result property="id" column="id"/>
<result property="name" column="name"/>
<result property="password" column="password"/>
</resultMap>
<sql id="Base_Column_List">
id,
name,
password
</sql>
<select id="findAll" resultMap="userMap">
SELECT <include refid="Base_Column_List"/> FROM t_user
</select>
</mapper>
注意:UserDao中的方法名需要与UserMapper.xml中方法保持一致。
SQL 映射文件只有很少的几个顶级元素(按照应被定义的顺序列出):
- cache:对给定命名空间的缓存配置cache-ref – 对其他命名空间缓存配置的引用
- cache-ref:对其他命名空间缓存配置的引用
- resultMap:是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象
- sql:可被其他语句引用的可重用语句块
- insert:映射插入语句
- update:映射更新语句
- delete: 映射删除语句
- select:映射查询语句
具体的元素细节可以参考官方文档:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html
service层接口:
UserService.java
public interface UserService {
List<User> findAll();
}
UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserDao userDao;
@Override
public List<User> findAll() {
return userDao.findAll();
}
}
配置文件:application.yml
spring:
datasource:
url: jdbc:mysql://172.16.6.31:3306/test
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvicableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat,wall,log4j
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
useGlobalDataourceStat: true
mybatis:
# 配置MyBatis映射文件
mapper-locations: classpath*:/mapper/*Mapper.xml
# MyBatis扫描包别名
type-aliases-package: com.xiaoh.springboot.mybatis.domain
写个Controller测试,UserController.java
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/users")
public List<User> findAll() {
return userService.findAll();
}
}
数据库配置类:DruidConfiguration.java
@Configuration
public class DruidConfiguration {
private static final Logger logger = LoggerFactory.getLogger(DruidConfiguration.class);
private static final String DB_PREFIX = "spring.datasource";
@Bean
public ServletRegistrationBean druidServlet() {
logger.info("init Druid Servlet Configuration ");
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
// IP白名单
servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
// IP黑名单(共同存在时,deny优先于allow)
servletRegistrationBean.addInitParameter("deny", "192.168.1.100");
//控制台管理用户
servletRegistrationBean.addInitParameter("loginUsername", "admin");
servletRegistrationBean.addInitParameter("loginPassword", "9527");
//是否能够重置数据 禁用HTML页面上的“Reset All”功能
servletRegistrationBean.addInitParameter("resetEnable", "false");
return servletRegistrationBean;
}
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
SpringbootMybatisApplication.java
@SpringBootApplication
@MapperScan(value = "com.xiaoh.springboot.mybatis.dao")
public class SpringbootMybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootMybatisApplication.class, args);
}
}
4、测试
启动项目,浏览器访问:http://localhost:8080/users ,结果如下:
5、源码
GitHub:https://github.com/chenjiecg/springboot
本文由博客一文多发平台 OpenWrite 发布!