SpringBoot整合MyBatis

SpringBoot整合MyBatis

整合JDBC

  • 创建SPringBoot项目

  • application.yaml

    spring:
      datasource:
        username: root
        password: 123321
        #?serverTimezone=UTC解决时区的报错
        url: jdbc:mysql://localhost:3306/junit?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
        driver-class-name: com.mysql.cj.jdbc.Driver
    
  • 连接测试

    package com.sheep;
    
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.SQLException;
    
    @SpringBootTest
    class DemoApplicationTests {
        
        /*自动注入数据源*/
        @Autowired
        DataSource dataSource;
    
        @Test
        void contextLoads() throws SQLException {
            //查看默认数据源:com.zaxxer.hikari.HikariDataSource
            System.out.println(dataSource.getClass());
            //获取数据库连接
            Connection connection = dataSource.getConnection();
            System.out.println(connection);
            //关闭
            connection.close();
        }
    }
    
  • controller测试

    package com.sheep.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import java.util.List;
    import java.util.Map;
    
    @RestController
    public class JdbcController {
    
        /*自动注入数据源*/
        @Autowired
        JdbcTemplate jdbcTemplate;
    
        @GetMapping("/user")
        public List<Map<String,Object>> userList(){
            String sql = "select * from classes";
            List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
            return maps;
        }
    }
    

整合Druid数据源

  1. 介绍

Druid首先是一个数据库连接池,据说Druid时目前世界上最好的数据库连接池,在功能,性能,扩展方面都远远超过其他数据库连接池,同时也结合了C3P0、DBCPPROXOOL等DB池的优点,Druid可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFile插件,能够详细统计SQL的执行性能,可以线上分析数据库访问性能。

springboot2.0以上默认使用HiKari数据源,可以说Hiari与Druid都是当前Java Web上最优秀的数据源

官网:https://druid.apache.org/

  1. 使用

    创建springboot项目导入依赖

    <!--Druid-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.21</version>
    </dependency>
    <!--log4j-->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    

    application.yaml中将HiKari数据源更改为Druid数据源

    spring:
      datasource:
        username: root
        password: 123321
        #?serverTimezone=UTC解决时区的报错
        url: jdbc:mysql://localhost:3306/junit?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
        driver-class-name: com.mysql.cj.jdbc.Driver
        # 改为Druid数据源
        type: com.alibaba.druid.pool.DruidDataSource
    

    DruidDataSource 基本配置参数

    配置 缺省值 说明
    name 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。 如果没有配置,将会生成一个名字,格式是:"DataSource-" + System.identityHashCode(this)
    jdbcUrl 连接数据库的url,不同数据库不一样。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
    username 连接数据库的用户名
    password 连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。详细看这里:https://github.com/alibaba/druid/wiki/使用ConfigFilter
    driverClassName 根据url自动识别 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName(建议配置下)
    initialSize 0 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
    maxActive 8 最大连接池数量
    maxIdle 8 已经不再使用,配置了也没效果
    minIdle 最小连接池数量
    maxWait 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
    poolPreparedStatements false 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
    maxOpenPreparedStatements -1 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
    validationQuery 用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。
    testOnBorrow true 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
    testOnReturn false 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
    testWhileIdle false 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
    timeBetweenEvictionRunsMillis 有两个含义: 1) Destroy线程会检测连接的间隔时间2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
    numTestsPerEvictionRun 不再使用,一个DruidDataSource只支持一个EvictionRun
    minEvictableIdleTimeMillis
    connectionInitSqls 物理连接初始化的时候执行的sql
    exceptionSorter 根据dbType自动识别 当数据库抛出一些不可恢复的异常时,抛弃连接
    filters 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall
    proxyFilters 类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系

    配置Druid配置类(DruidConfig)

    package com.sheep.config;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import com.alibaba.druid.support.http.StatViewServlet;
    import com.alibaba.druid.support.http.WebStatFilter;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import javax.sql.DataSource;
    import java.util.HashMap;
    import java.util.Map;
    
    @Configuration
    public class DruidConfig {
    
        /*读取application.yaml配置文件*/
        @ConfigurationProperties(prefix = "spring.datasource")
        @Bean
        public DataSource dataDataSource(){
            return new DruidDataSource();
        }
    
        /*开启后台监控*/
        @Bean
        public ServletRegistrationBean statViewServlet(){
            //访问/druid/**后台页面就会显示
            ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/**");
            //设置登入后台密码
            Map<String, String> initParameters = new HashMap<>();
    
            initParameters.put("loginUsername","admin");    //loginUsername(用户名)、loginPassword(密码)固定写法
            initParameters.put("loginPassword","123456");
    
            initParameters.put("allow",""); //允许谁能访问
    
            bean.setInitParameters(initParameters); //设置初始化参数
            return bean;
        }
    
        /*过滤器*/
        public FilterRegistrationBean webStatFilter(){
    
            FilterRegistrationBean bean = new FilterRegistrationBean();
            bean.setFilter(new WebStatFilter());
            //可以过滤那些请求
            Map<String, String> initParameters = new HashMap<>();
            initParameters.put("exclusions","*.js,*.css,/druid/*");
            bean.setInitParameters(initParameters);
            return bean;
        }
    }
    

    浏览器访问:http://localhost:8080/druid/login.html

整合MyBatis

  1. 回顾MyBatis

    整合MyBatis之前线捋顺以下MyBatis框架使用思路,使用MyBatis开发有两种方式:1、原生接口开发2、代理接口开发;在原生接口开发中,先创建数据表,再创建表对应的实体类,创建MyBatis核心配置文件config.xml,创建Mapper.xml(并编写sql语句,需要注意Mapper.xml配置文件要在config.xml文件中注册),最后在测试。

    //加载配置文件
    InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.XML");
    //创建SessionFactoryBuilder对象
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    //SqlSessionFactoryBuilder对象的Build方法通过配置文件创建会话工厂SqlSessionFactory
    SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    //通过工厂获取SqlSession
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //通过SqlSession调用User3Mapper中的SQL语句
    //com.sheep.mapper.UserMapper.insert=com.sheep.mapper.UserMapper+.insert(statement标签的id属性)
    String statement = "com.sheep.mapper.UserMapper.insert";
    User user = new User(1L,"梅西","123123",22);
    sqlSession.insert(statement,user);
    //提交事务
    sqlSession.commit();
    //释放资源
    sqlSession.close();
    

    在代理接口开发中,故名使用代理接口就是创建接口然后在创建接口对应的代理类Mapper.xml,同样先创建数据表,再创建表对应的实体类,再创建接口(增删改查方法),创建接口的代理对象Mapper.xml(在核心配置文件config.xml中注册),创建MyBatis核心配置文件config.xml,编写测试类

    InputStream resource = Test2.class.getClassLoader().getResourceAsStream("config.XML");
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    SqlSessionFactory build = sqlSessionFactoryBuilder.build(resource);
    SqlSession sqlSession = build.openSession();
    /**
    * 获取实现接口的代理对象
    * */
    UserIntf mapper = sqlSession.getMapper(UserIntf.class);
    
  2. springboot整合MyBatis

    创建SpringBoot项目

    导入依赖

    <!-- springboot整合mybatis依赖 -->
    <dependency>
       <groupId>org.mybatis.spring.boot</groupId>
       <artifactId>mybatis-spring-boot-starter</artifactId>
       <version>2.1.4</version>
    </dependency>
    <!-- 简化实体类开发 -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <!-- springboot -->
    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
         <scope>runtime</scope>
    </dependency>
    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
    </dependency>
    

    创建数据表

    +---------+------------+------+-----+---------+----------------+
    | Field   | Type       | Null | Key | Default | Extra          |
    +---------+------------+------+-----+---------+----------------+
    | id      | int        | NO   | PRI | NULL    | auto_increment |
    | name    | varchar(5) | YES  |     | NULL    |                |
    | student | varchar(7) | YES  |     | NULL    |                |
    | java    | int        | YES  |     | NULL    |                |
    | python  | int        | YES  |     | NULL    |                |
    | mysql   | int        | YES  |     | NULL    |                |
    | jquery  | int        | YES  |     | NULL    |                |
    +---------+------------+------+-----+---------+----------------+
    

    创建表对应的实体类

    package com.sheep.pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Classes {
        private int id;
        private String name;
        private String student;
        private int java;
        private int python;
        private int  mysql;
        private int jquery;
    }
    

    创建接口ClassesMapper

    package com.sheep.mapper;
    
    import com.sheep.pojo.Classes;
    import org.apache.ibatis.annotations.Mapper;
    import org.springframework.stereotype.Repository;
    
    import java.util.List;
    
    //这个注解表示这是一个mybatis的mapper类
    //@Repository将该类交给容器
    @Mapper
    @Repository
    public interface ClassesMapper {
    
        List<Classes> queryClassesList();
        Classes queryClassesById(int id);
        int addClasses(Classes classes);
        int updateClasses(Classes classes);
        int deleteClasses(int id);
    }
    

    创建SQL映射文件ClassesMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.sheep.mapper.ClassesMapper">
        <select id="queryClassesList" resultType="com.sheep.pojo.Classes">
            select * from classes
        </select>
        <select id="queryClassesById" parameterType="int" resultType="com.sheep.pojo.Classes">
            select * from classes where id = #{id}
        </select>
        <insert id="addClasses" parameterType="com.sheep.pojo.Classes">
            insert into classes(id,name,student,java,python,mysql,jquery) values (#{id},#{name},#{student},#{java},#{python},#{mysql},#{jquery})
        </insert>
        <update id="updateClasses" parameterType="com.sheep.pojo.Classes">
            update classes set name=#{name},#{student},#{java},#{python},#{mysql},#{jquery} where id=#{id}
        </update>
        <delete id="deleteClasses" parameterType="int">
            delete from classes where id=#{id}
        </delete>
    </mapper>
    

    在application.properties全局配置文件中配置数据源等信息

    # 配置数据库信息
    spring.datasource.username=root
    spring.datasource.password=123321
    spring.datasource.url=jdbc:mysql://localhost:3306/junit?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    # 整合mybatis:即告诉SpingBoot实体类,和mapper的位置
    mybatis.type-aliases-package=com.sheep.pojo
    mybatis.mapper-locations=classpath:mybatis/mapper/*.XML
    

    创建ClassesController

    package com.sheep.controller;
    
    import com.sheep.mapper.ClassesMapper;
    import com.sheep.pojo.Classes;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import java.util.List;
    
    @RestController
    public class ClassesController {
    
        @Autowired
        private ClassesMapper classesMapper;
    
        @GetMapping("/queryClassesList")
        public List<Classes>  queryClassesList(){
            List<Classes> classesList = classesMapper.queryClassesList();
            for (Classes classes:classesList){
                System.out.println(classes);
            }
            return classesList;
        }
    }
    

    目录

    spring整合MyBatis和SpringBoot整合MyBatis区别:

    1. SpringBoot整合MyBatis省略了核心配置文件config.xml改而使用application.properties配置
    2. Mapper.xml映射文件必须要放在resource文件夹下(在application.properties扫描该配置文件)
posted @ 2021-05-20 17:04  一程山水一年华^_^  阅读(132)  评论(0编辑  收藏  举报
TOP 底部 /*显示代码块行号*/