后端Mybatis操作数据库 & Spirng整合Mybatis
Posted 双份浓缩馥芮白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了后端Mybatis操作数据库 & Spirng整合Mybatis相关的知识,希望对你有一定的参考价值。
✨Mybatis
简介
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
- MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
- MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
maven依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
✨Mybatis操作数据库
Mybatis操作数据库主要有以下步骤
- 从 XML 中构建
SqlSessionFactory
- 从
SqlSessionFactory
中获取SqlSession
- 执行已映射的 SQL 语句
通常用Mybatis工具类直接来获取SqlSession
实例
其中映射SQL语句有两种方式
- XML映射
- Java注解
官方文档说明如下
使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。
选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的形式,完全取决于你和你的团队。 换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和 XML 的语句映射方式间自由移植和切换。
本文采用XML配置映射SQL语句
示例
@Test
public void listAdmin(){
// 从 XML 中构建 SqlSessionFactory
String resources = "mybatis-config.xml";
InputStream resourceAsStream = null;
try {
resourceAsStream = Resources.getResourceAsStream(resources);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 从 SqlSessionFactory 中获取 SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(true);
// 执行已映射的 SQL 语句
AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);
List<Admin> adminList = mapper.listAdmin();
for (Admin admin : adminList) {
System.out.println(admin);
}
// 关闭SqlSession连接
sqlSession.close();
}
mybatis-config.xml
<?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>
<properties resource="db.properties"/>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<package name="com.example.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.example.mapper"/>
</mappers>
</configuration>
db.properties
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/db_demo?useSSL=false&userUnicode=true&characterEncoding=UTF-8
username = root
password = root
Admin
package com.example.pojo;
import lombok.Data;
@Data
public class Admin {
private int adminId;
private String adminAccount;
private String adminPasswd;
}
AdminMapper
package com.example.mapper;
import com.example.pojo.Admin;
import java.util.List;
public interface AdminMapper {
List<Admin> listAdmin();
}
AdminMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.AdminMapper">
<select id="listAdmin" resultType="Admin">
select * from admin
</select>
</mapper>
下面详细说明Mybatis操作数据库步骤
从 XML 中构建 SqlSessionFactory
每个基于 MyBatis 的应用都是以一个SqlSessionFactory
的实例为核心的。SqlSessionFactory
的实例可以通过SqlSessionFactoryBuilder
获得。
而SqlSessionFactoryBuilder
则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出SqlSessionFactory
实例。
XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。后面会再探讨 XML 配置文件的详细内容,这里先给出一个简单的示例:
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
不使用 XML 构建 SqlSessionFactory 可参考 官方文档 mybatis – MyBatis 3 | 入门。
从 SqlSessionFactory 中获取 SqlSession
既然有了SqlSessionFactory
,顾名思义,我们可以从中获得SqlSession
的实例。
-
SqlSession
提供了在数据库执行 SQL 命令所需的所有方法。 -
你可以通过
SqlSession
实例来直接执行已映射的 SQL 语句。
例如:
try (SqlSession session = sqlSessionFactory.openSession()) {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
}
Mybatis工具类
package com.example.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
//XML -> SqlSessionFactory
//SqlSessionFactory -> SqlSession
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
// 从 XML 中构建 SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
// 自动提交事务
// return sqlSessionFactory.openSession(true);
}
}
可以通过Mybatis工具类简化操作
使用如下
@Test
public void utilsTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);
List<Admin> adminList = mapper.listAdmin();
for (Admin admin : adminList) {
System.out.println(admin);
}
sqlSession.close();
}
✨Mybatis-Spring
简介
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession
并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException
。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。
官方文档:mybatis-spring –
maven依赖
<!-- junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<!-- mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<!-- mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
</dependency>
<!-- spring操作数据库-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.9</version>
</dependency>
<!-- AOP-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version>
</dependency>
<!-- mybatis-spring-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
</dependencies>
✨Spring整合Mybatis
Spring整合Mybatis有两种方式
- 使用
SqlSessionTemplate
- 使用
SqlSessionDaoSupport
SqlSessionTemplate
是 MyBatis-Spring 的核心。作为 SqlSession
的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的 SqlSession
。 SqlSessionTemplate
是线程安全的,可以被多个 DAO 或映射器所共享使用。
SqlSessionDaoSupport
是一个抽象的支持类,用来为你提供 SqlSession
。调用 getSqlSession()
方法你会得到一个 SqlSessionTemplate
,之后可以用于执行 SQL 方法
第一种方式:
-
配置
DataSource
和SqlSessionFactoryBean
(相当于Mybatis操作数据库中的 从 XML 中构建 SqlSessionFactory)
-
创建
SqlSessionTemplate
-
实现 DAO 接口 注入到 IoC 容器中
(相当于Mybatis操作数据库中的 从 SqlSessionFactory 中获取 SqlSession)
-
执行已映射的 SQL 语句
第二种方式:
-
配置
DataSource
和SqlSessionFactoryBean
(相当于Mybatis操作数据库中的 从 XML 中构建 SqlSessionFactory)
-
实现DAO接口并继承
SqlSessionDaoSupport
抽象类 -
注入DAO实现类
-
执行已映射的 SQL 语句
✨整合方式一
配置 DataSource 和 SqlSessionFactoryBean
在基础的 MyBatis 用法中,是通过 SqlSessionFactoryBuilder
来创建 SqlSessionFactory
的。而在 MyBatis-Spring 中,则使用 SqlSessionFactoryBean
来创建。
XML配置如下
<!-- DataSource-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db_demo?useSSL=false&userUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 绑定Mybatis配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath*:com/example/mapper/*.xml"/>
</bean>
注入 SqlSessionTemplate
在 MyBatis 中,你可以使用 SqlSessionFactory
来创建 SqlSession
。 一旦你获得一个 session 之后,你可以使用它来执行映射了的语句,提交或回滚连接,最后,当不再需要它的时候,你可以关闭 session。 使用 MyBatis-Spring 之后,你不再需要直接使用 SqlSessionFactory
了,因为你的 bean 可以被注入一个线程安全的 SqlSession
,它能基于 Spring 的事务配置来自动提交、回滚、关闭 session。
可以使用 SqlSessionFactory
作为构造方法的参数来创建 SqlSessionTemplate
对象。
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
实现 DAO 接口 注入到IoC容器中
package com.example.mapper;
import com.example.pojo.Admin;
import org.mybatis.spring.SqlSessionTemplate;
import java.util.List;
public class AdminMapperImpl implements AdminMapper{
private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public List<Admin> listAdmin() {
AdminMapper mapper = sqlSession.getMapper(AdminMapper.class);
return mapper.listAdmin();
}
}
<bean id="adminMapper" class="com.example.mapper.AdminMapperImpl">
<property name="SqlSession" ref="sqlSession"/>
</bean>
执行已映射的 SQL 语句
@Test
public void MybatisSpring(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
AdminMapper adminMapper = context.getBean("adminMapper", AdminMapper.class);
List<Admin> adminList = adminMapper.listAdmin();
for (Admin admin : adminList) {
System.out.println(admin);
}
}
✨整合方式二
配置 DataSource 和 SqlSessionFactoryBean
同整合方式一。
实现DAO接口并继承 SqlSessionDaoSupport 抽象类
package com.example.mapper;
import com.example.pojo.Admin;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import java.util.List;
public class AdminMapperImpl2 extends SqlSessionDaoSupport implements AdminMapper{
@Override
public List<Admin> listAdmin() {
return getSqlSession().getMapper(AdminMapper.class).listAdmin();
}
}
注入DAO实现类
<bean id="adminMapper2" class="com.example.mapper.AdminMapperImpl2">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
执行已映射的 SQL 语句
@Test
public void MybatisSpring2(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
AdminMapper adminMapper = context.getBean("adminMapper2", AdminMapper.class);
List<Admin> adminList = adminMapper.listAdmin();
for (Admin admin : adminList) {
System.out.println(admin);
}
}
✨完整XML配置
mybatis-config.xml
<?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>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<package name="com.example.pojo"/>
</typeAliases>
</configuration>
spring-dao.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- DataSource 使用Spring的数据源替换Mybatis配置 c3p0 dbcp druid
这里使用Spring提供的JDBC org.springframework.jdbc.datasource.DriverManagerDataSource
-->
<!-- DataSource-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db_demo?useSSL=false&userUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 绑定Mybatis配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath*:com/example/mapper/*.xml"/>
</bean>
<!-- SqlSessionTemplate:就是Mybatis中使用的SqlSession-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!-- 官方文档:可以使用 SqlSessionFactory 作为构造方法的参数来创建 SqlSessionTemplate 对象。-->
<!-- 只能使用构造器注入 SqlSessionFactory 因为没有set方法-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
</beans>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<import resource="spring-dao.xml"/>
<bean id="adminMapper" class="com.example.mapper.AdminMapperImpl">
<property name="SqlSession" ref="sqlSession"/>
</bean>
<bean id="adminMapper2" class="com.example.mapper.AdminMapperImpl2">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
</beans>
✨官方文档
Mybatis
Spring
Spring Framework Documentation
Mybatis-Spring
⭐转载请注明出处
本文作者:双份浓缩馥芮白
原文链接:https://www.cnblogs.com/Flat-White/p/15119326.html
版权所有,如需转载请注明出处。
以上是关于后端Mybatis操作数据库 & Spirng整合Mybatis的主要内容,如果未能解决你的问题,请参考以下文章
MLIR,LLVM SPIR-V Getting started初步探索
由 SPIR-V 的 SPIRV-cross 生成的 GLSL 是不是违反了 std140 规则?