一、集成单源数据库
MyBatis 是现如今最流行的 ORM 框架,SpringBoot通过mybatis-spring-boot-starter
组件轻松的继承了Mybtis功能,几乎可以零配置来构建独立的应用,本篇可以从Spring Initial官网中选择Mybatis和DB驱动直接开始。
1.准备工作
在数据库中创建users表,以Mysql为例:
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`userName` varchar(32) DEFAULT NULL COMMENT '用户名',
`passWord` varchar(32) DEFAULT NULL COMMENT '密码',
`user_sex` varchar(32) DEFAULT NULL,
`nick_name` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2.集成Mybatis和数据库驱动
无论选择何种DB,Mybatis层面的配置都是一样的,可以在Maven中央仓库选择最新的starter。
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
在数据库选择方面,关系型DB主流有三种:1、Mysql,2、Oralce,3、Postgrel,搭建时可参照不同的实现来集成:
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--postgrel-->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
Oracle的依赖则较为特殊,在mvn中心仓库上无法获取,只能通过集成本地Odbc驱动的方式,需要在pom文件上做几处特殊的处理:
<!-- 系统默认属性配置 -->
<properties>
<cs.dir>${project.basedir}</cs.dir>
</properties>
<!-- 本地jar依赖 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${cs.dir}/lib/ojdbc6.jar</systemPath>
</dependency>
<!-- 本地jar生效的关键配置 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
3.application配置
Spring Boot 会自动加载 spring.datasource.* 相关配置,数据源就会自动注入到 sqlSessionFactory 中,sqlSessionFactory 会自动注入到 Mapper 中,剩下的就是开发了。
# mybatis属性
mybatis.config-location=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.type-aliases-package=com.example.mybatis
# spring.datasource属性
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnico
de=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
需要再注意mybatis的几个属性,有则可以加,非必须参数:
- mybatis.config-location 定义了mybatis-config.xml的路径
- mybatis.mapper-locations 定义了Mapper所对应的XML文件路径
- mybatis.type-aliases-package 配置了项目中实体类路径
4.启动类配置
在启动类中添加对 Mapper 包扫描 @MapperScan,Spring Boot 启动的时候会自动加载包路径下的Mapper(也可直接在 Mapper 类上添加注解 @Mapper,二选一,但此方法稍麻烦)。
@MapperScan("com.example.mybatis.mapper")
@SpringBootApplication
public class MybatisApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisApplication.class, args);
}
}
5.mybatis-config
mybatis-config.xml 主要配置常用的 typeAliases,设置类型别名,为 Java 类型设置一个短的名字,可用来减少类完全限定名的冗余,可以在别的XML文件的resultType和parameterType中直接引用。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="Integer" type="java.lang.Integer" />
<typeAlias alias="Long" type="java.lang.Long" />
<typeAlias alias="HashMap" type="java.util.HashMap" />
<typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
<typeAlias alias="ArrayList" type="java.util.ArrayList" />
<typeAlias alias="LinkedList" type="java.util.LinkedList" />
</typeAliases>
</configuration
6.CURD开发
有了以上配置即可进行业务层面的增删改查了,基本是流水线的工作:
- 编写mapper文件,并映射到对应的Mapper类上
- 编写SQL语句
- 编写DAO层代码
除此以外,还需要注意一点:是否使用分页查询。如果是页面查询则需要提供相关的分页查询参数,如果是大数据量的统计查询,mybatis的查询返回则是受限于9999总数的限制。
二、多源数据库
在业务开发中有时不可避免的需要连接多个数据源,比如主库为Mysql,而又需要操作辅库Postgre,那么多源数据库的配置则需要显式的声明数据库信息的配置。
1.配置多源数据库信息
mybatis.config-location=classpath:mybatis/mybatis-config.xml
spring.datasource.mysql.jdbc-url=jdbc:mysql://localhost:3306/test
spring.datasource.mysql.username=root
spring.datasource.mysql.password=root
spring.datasource.mysql.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.postgre.jdbc-url=jdbc:postgresql://localhost:5432/test1
spring.datasource.postgre.username=root
spring.datasource.postgre.password=root
spring.datasource.postgre.driver-class-name=org.postgresql.Driver
第一个数据源以spring.datasource.mysql.*
为前缀连接mysql数据库(第三个字符串mysql是可以自定义的),spring.datasource.postgre.*
为前缀连接postgrel数据库。
2.加载数据源
多数据源的最佳实践:不同的数据源mapper文件和dao层要在不同的数据源包下,包名直接反应出数据库类型名称。
配置第一个数据源的基本信息如下,而第二个的配置写法和第一个基本一致,区别在于包路径定义和数据源的声明,@Primary
则只需要注解在主库数据源上。
@Configuration
@MapperScan(basePackages = "com.example.mybatis.mysql",
sqlSessionTemplateRef = "mysqlSqlSessionTemplate")
public class DataSource1Config {
@Bean(name = "mysqlDataSource")
@ConfigurationProperties(prefix = "spring.datasource.one")
@Primary
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "mysqlSqlSessionFactory")
@Primary
public SqlSessionFactory testSqlSessionFactory
(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().
getResources("classpath:mybatis/mapper/one/*.xml"));
return bean.getObject();
}
@Bean(name = "mysqlTransactionManager")
@Primary
public DataSourceTransactionManager testTransactionManager
(@Qualifier("mysqlDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "mysqlSqlSessionTemplate")
@Primary
public SqlSessionTemplate testSqlSessionTemplate
(@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory)
throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
在ORM集成框架的选择上,除了Mybatis还有流行的JPA可供选择。另外数据库连接池的选择上,SpringBoot 2.0 使用Hikari连接池号称是Java平台最快的,性能十分卓越,当然也缺乏了druid在监控方面的便利性。
三、事务支持
SpringBoot中使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持。
// SpringBoot启动类
@SpringBootApplication
@EnableTransactionManagement
public class TomcatApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(TomcatApplication.class, args);
}
}
在访问数据库的Service方法上添加注解 @Transactional 即可实现对事务的支持。
// 业务层
@Service
public class JenkinsService {
@Autowired
private JenkinsDao jenkinsDao;
@Transactional // 事务控制
public void saveUser() {
}
}
网友评论