前言
今天周日,上午研究了下Mybatis,下午准备的牛客网机试,机试没啥好说的,下面就记录一下今天对Mybatis的学习。下面主要分两部分,第一部分是Mybatis的原生配置方式,第二部分是Mybatis与SpringBoot的整合。
一、Mybatis的原生配置
pom.xml中只要引入mybatis和mysql的依赖即可,因为我用了lombok,所以多引入了个lombok的依赖:
org.mybatis mybatis 3.5.1 org.projectlombok lombok 1.18.10 mysql mysql-connector-java 8.0.17
然后配置了下图所示的类和xml:
在mybatis-config.xml中,配置数据源和mapper.xml文件的地址:
1 2 DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 56 7 178 169 10 1511 12 13 14 18 2019
最后是测试入口类:
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包是专为二者整合而存在。
12 5org.springframework.boot 3spring-boot-starter-web 46 10org.mybatis.spring.boot 7mybatis-spring-boot-starter 81.3.2 911 15org.mybatis 12mybatis-spring 132.0.1 1416 com.alibaba 17druid 181.1.13 19
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整合的原理,但未完全搞清楚,就暂时不做详细记录了,只贴一张流程草图,挖个坑。