zoukankan      html  css  js  c++  java
  • 【后端】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

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

  • 相关阅读:
    坐标变化
    labelme VOC
    threejs物体设置中心坐标
    IfcProjectOrderTypeEnum
    IfcCostItemTypeEnum
    利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习)
    依赖注入框架Autofac的简单使用
    阿里技术嘉年华官网上线啦!
    Silverlight 4以下版本模拟鼠标双击事件
    iOS学习系列 利用ASIHTTPRequest实现异步队列
  • 原文地址:https://www.cnblogs.com/Flat-White/p/15119326.html
Copyright © 2011-2022 走看看