【后端】Mybatis操作数据库 & Spirng整合Mybatis

✨Mybatis

简介

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL存储过程以及高级映射

  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

官方文档:mybatis – MyBatis 3 | 简介


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 的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的 SqlSessionSqlSessionTemplate 是线程安全的,可以被多个 DAO 或映射器所共享使用。

SqlSessionDaoSupport 是一个抽象的支持类,用来为你提供 SqlSession。调用 getSqlSession() 方法你会得到一个 SqlSessionTemplate,之后可以用于执行 SQL 方法


第一种方式:

  • 配置 DataSourceSqlSessionFactoryBean

    (相当于Mybatis操作数据库中的 从 XML 中构建 SqlSessionFactory

  • 创建 SqlSessionTemplate

  • 实现 DAO 接口 注入到 IoC 容器中

    (相当于Mybatis操作数据库中的 从 SqlSessionFactory 中获取 SqlSession

  • 执行已映射的 SQL 语句


第二种方式:

  • 配置 DataSourceSqlSessionFactoryBean

    (相当于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&amp;userUnicode=true&amp;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&amp;userUnicode=true&amp;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

mybatis – MyBatis 3 | 简介

Spring

Spring Framework Documentation

Mybatis-Spring

mybatis-spring –


⭐转载请注明出处

本文作者:双份浓缩馥芮白

原文链接:https://www.cnblogs.com/Flat-White/p/15119326.html

版权所有,如需转载请注明出处。

posted @ 2021-08-09 16:33  双份浓缩馥芮白  阅读(301)  评论(0编辑  收藏  举报