前言
今天周日,上午研究了下Mybatis,下午准备的牛客网机试,机试没啥好说的,下面就记录一下今天对Mybatis的学习。下面主要分两部分,第一部分是Mybatis的原生配置方式,第二部分是Mybatis与SpringBoot的整合。
一、Mybatis的原生配置
pom.xml中只要引入mybatis和mysql的依赖即可,因为我用了lombok,所以多引入了个lombok的依赖:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.17</version> </dependency>
然后配置了下图所示的类和xml:
在mybatis-config.xml中,配置数据源和mapper.xml文件的地址:
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE configuration
3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4 "http://mybatis.org/dtd/mybatis-3-config.dtd">
5 <configuration>
6 <environments default="development">
7 <environment id="development">
8 <transactionManager type="JDBC"/>
9 <dataSource type="POOLED">
10 <property name="driver" value="com.mysql.jdbc.Driver"/>
11 <property name="url" value="jdbc:mysql://localhost:3306/my_project?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true"/>
12 <property name="username" value="localuser"/>
13 <property name="password" value="Jinger!"/>
14 </dataSource>
15 </environment>
16 </environments>
17 <mappers>
18 <mapper resource="mybatis/mapper/ManagerInfoMapper.xml"/>
19 </mappers>
20 </configuration>
最后是测试入口类:
1 package com;
2
3
4 import com.mybatisDemo.entity.ManagerInfoEntityDO;
5 import com.mybatisDemo.mapper.ManagerInfoMapper;
6 import org.apache.ibatis.io.Resources;
7 import org.apache.ibatis.session.SqlSession;
8 import org.apache.ibatis.session.SqlSessionFactory;
9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
10
11 import java.io.InputStream;
12
13 /**
14 * 通过原生的方式配置Mybatis
15 */
16 public class MybatisDemo1 {
17 public static void main(String[] args) throws Exception {
18 String resource = "mybatis/mybatis-config.xml"; // 配置文件的相对地址
19 InputStream inputStream = Resources.getResourceAsStream(resource);
20 SqlSessionFactory sqlSessionFactory =
21 new SqlSessionFactoryBuilder().build(inputStream);
22
23 SqlSession sqlSession = sqlSessionFactory.openSession();
24 ManagerInfoEntityDO entityDO = sqlSession.getMapper(ManagerInfoMapper.class).selectByPrimaryKey(5);
25 System.out.println("ManagerInfoEntityDO:" + entityDO);
26 }
27 }
启动main方法就可以看到能成功访问数据库了。由此可见,Mybatis是可以独立于Spring或者SpringBoot使用的,但平时大家用Mybatis应该大都是基于SpringBoot使用的,所以下面看一下在SpringBoot中是如何引入Mybatis的。
二、Mybatis与SpringBoot的整合
pom.xml中增加以下几个依赖,其中spring-boot-starter-web是为了通过页面调用接口而引入的,druid是用来做连接池的,剩下的两个jar包是专为二者整合而存在。
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-web</artifactId> 4 </dependency> 5 <dependency> 6 <groupId>org.mybatis.spring.boot</groupId> 7 <artifactId>mybatis-spring-boot-starter</artifactId> 8 <version>1.3.2</version> 9 </dependency> 10 <dependency> 11 <groupId>org.mybatis</groupId> 12 <artifactId>mybatis-spring</artifactId> 13 <version>2.0.1</version> 14 </dependency> 15 <dependency> 16 <groupId>com.alibaba</groupId> 17 <artifactId>druid</artifactId> 18 <version>1.1.13</version> 19 </dependency>
yml文件中配置了mapper.xml的位置:
server: port: 8090 mybatis: #映射文件路径 mapper-locations: classpath:mybatis/mapper/*Mapper.xml
AppConfig中配置的数据库源和对mapper接口的扫描:
1 @Configuration 2 @MapperScan("com.mybatisDemo.mapper") 3 //@ComponentScan("com") 4 public class AppConfig { 5 6 private String userName = "localuser"; 7 private String password = "Jinger!"; 8 private String url = "jdbc:mysql://localhost:3306/my_project?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true"; 9 private String driverClassName = "com.mysql.jdbc.Driver"; 10 11 @Bean 12 @Primary 13 public DataSource dataSource() { 14 DruidDataSource dataSource = new DruidDataSource(); 15 dataSource.setUrl(url); 16 dataSource.setUsername(userName);//用户名 17 dataSource.setPassword(password);//密码 18 dataSource.setDriverClassName(driverClassName); 19 dataSource.setInitialSize(5);//初始化时建立物理连接的个数 20 dataSource.setMaxActive(50);//最大连接池数量 21 dataSource.setMinIdle(1);//最小连接池数量 22 dataSource.setMaxWait(60000);//获取连接时最大等待时间,单位毫秒。 23 dataSource.setTestWhileIdle(true); 24 dataSource.setTestOnBorrow(false); // 25 dataSource.setTestOnReturn(false); 26 dataSource.setPoolPreparedStatements(true); //缓存游标 27 dataSource.setMaxPoolPreparedStatementPerConnectionSize(20); //游标缓存大小 28 dataSource.setTimeBetweenEvictionRunsMillis(60000); // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 29 dataSource.setMinEvictableIdleTimeMillis(30000); //配置一个连接在池中最小生存的时间,单位是毫秒 30 dataSource.setValidationQuery("SELECT 1");//用来检测连接是否有效的sql 31 dataSource.setTestOnBorrow(false);//申请连接时执行validationQuery检测连接是否有效 32 dataSource.setTestWhileIdle(true);//建议配置为true,不影响性能,并且保证安全性。 33 dataSource.setPoolPreparedStatements(false);//是否缓存preparedStatement,也就是PSCache 34 return dataSource; 35 } 36 37 }
在MyService中调用了mapper接口:
1 @Service 2 public class MyService { 3 @Autowired 4 private ManagerInfoMapper managerInfoMapper; 5 6 public ManagerInfoEntityDO selectByPrimaryKey(Integer id) { 7 return managerInfoMapper.selectByPrimaryKey(id); 8 } 9 }
最后是测试主类:
1 ** 2 * SpringBoot与Mybatis整合 3 */ 4 @SpringBootApplication 5 @Controller 6 public class MybatisDemo3 { 7 8 @Autowired 9 private MyService managerService; 10 11 public static void main(String[] args) { 12 SpringApplication.run(MybatisDemo3.class, args); 13 } 14 15 @RequestMapping("/test") 16 @ResponseBody 17 public ManagerInfoEntityDO myTest () { 18 ManagerInfoEntityDO entityDO = managerService.selectByPrimaryKey(5); 19 System.out.println(entityDO); 20 return entityDO; 21 } 22 }
启动该类后,访问localhost:8090/test则能正常访问数据库。
小结
可以看到,与SpringBoot整合之后,Mybatis只需简单配置两下就可使用,方便至极。今天还研究了一下Mybatis与SpringBoot整合的原理,但未完全搞清楚,就暂时不做详细记录了,只贴一张流程草图,挖个坑。