# 前言
阅读本文前,希望读者能看完 Mybatis 标签的文章。
之前讲解 IoC,为了方便演示,我们将 Student,Card 等实体类注册为 Bean 对象,这样的应该是原型模式,而不是单例模式,类似参数传递时,通过只传入类的属性自动注入获取对象。
@Controller | |
public class HelloController {//User:String name;int age | |
@RequestMapping(path = "/sayHello") | |
public ModelAndView sayHello(User u){ | |
System.out.println(u.toString()); | |
} | |
} | |
// 直接用属性名传递就是 | |
//http://localhost:8888/SpringMVC_war_exploded/sayHello?name=bob&age=100 |
# 整合 Mybatis
导入依赖:
<dependency> | |
<groupId>mysql</groupId> | |
<artifactId>mysql-connector-java</artifactId> | |
<version>8.0.25</version> | |
</dependency> | |
<dependency> | |
<groupId>org.mybatis</groupId> | |
<artifactId>mybatis</artifactId> | |
<version>3.5.7</version> | |
</dependency> | |
<dependency> | |
<groupId>org.mybatis</groupId> | |
<artifactId>mybatis-spring</artifactId> | |
<version>2.0.6</version> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework</groupId> | |
<artifactId>spring-jdbc</artifactId> | |
<version>5.3.13</version> | |
</dependency> |
# 相关 Bean 对象
- 获取
SqlSession
:
之前我们为了每次快速获取一个 SqlSession,将 SqlSessionFactory 等操作放到了一个工具类中
public class SqlUtil { | |
private static SqlSessionFactory factory; | |
static { | |
try { | |
factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml")); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
public static SqlSession getSqlSession() { | |
return factory.openSession(true); | |
} | |
} |
mybatis-spring
依赖提供了 SqlSessionTemplate
类,这就是一个官方封装的工具类,我们可以将其注册为 Bean 对象。在配置类中创建(使用注解开发):
@Configuration | |
@ComponentScan("com.bean") | |
public class Configuration { | |
@Bean | |
public SqlSessionTemplate sqlSessionTemplate() throws IOException { | |
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml")); | |
return new SqlSessionTemplate(factory); | |
} | |
} |
在 main 中使用:
public static void main(String[] args) { | |
ApplicationContext context = new AnnotationConfigApplicationContext(Configuration.class); | |
SqlSessionTemplate template = context.getBean(SqlSessionTemplate.class); | |
StudentMapper mapper = template.getMapper(StudentMapper.class); | |
} |
- 获取
Mapper
对象。
我们可以将 Mapper 对象也交给 IoC 管理,在注解类添加:
@MapperScan("com.mapper") |
之后要获取 Mapper
对象:
public static void main(String[] args) throws InterruptedException { | |
ApplicationContext context = new AnnotationConfigApplicationContext(TestConfiguration.class); | |
TestMapper mapper = context.getBean(TestMapper.class); | |
System.out.println(mapper.getStudent()); | |
} |
前提是必须将 SqlSessionTemplate
或者 SqlSessionFacoryBean
注册为 Bean 对象,否则无法初始化。
当我们使用
MapperScan
注解时,就不需要配置文件中的<Mappers>
标签了。
- 删除
mybatis-config.xml
配置文件。
@Configuration | |
@ComponentScan("com.test") | |
@MapperScan("com.test.mapper") | |
public class TestConfiguration { | |
@Bean | |
public DataSource dataSource(){ | |
return new PooledDataSource("com.mysql.cj.jdbc.Driver", | |
"jdbc:mysql://localhost:3306/study", "root", "123456"); | |
} | |
@Bean | |
public SqlSessionFactoryBean sqlSessionFactoryBean(@Autowired DataSource dataSource){ | |
SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); | |
bean.setDataSource(dataSource); | |
return bean; | |
} | |
} |
我们需要创建一个数据源的实体类,载入数据库基本信息。
关于去掉配置文件,如何整合多个数据源,可以参看这篇。
# HikariCP 连接池
DataSource
还有其他实现,比如 C3P0,Druid 等,本部分介绍 HikariCP 连接池。
HikariCP 是由日本程序员开源的一个数据库连接池组件,代码非常轻量,并且速度非常的快。
导入依赖
<dependency> | |
<groupId>com.zaxxer</groupId> | |
<artifactId>HikariCP</artifactId> | |
<version>3.4.5</version> | |
</dependency> |
在配置类中修改一下 Bean 定义:
@Bean | |
public DataSource dataSource() throws SQLException { | |
HikariDataSource dataSource = new HikariDataSource(); | |
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/study"); | |
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); | |
dataSource.setUsername("root"); | |
dataSource.setPassword("123456"); | |
return dataSource; | |
} |
该数据源采用了 SLF4J 日志框架打印日志信息,但是没有任何日志实现,我们需要导入依赖:
<dependency> | |
<groupId>org.slf4j</groupId> | |
<artifactId>slf4j-jdk14</artifactId> | |
<version>1.7.25</version> | |
</dependency> |
lombok 也支持该日志框架快速注解:
@Slf4j | |
public class Main { | |
public static void main(String[] args) { | |
log.info("xxx"); | |
} | |
} |
# 参考
https://www.yuque.com/qingkongxiaguang/spring/rlgcf7#fff8b166