zoukankan      html  css  js  c++  java
  • 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扫描该配置文件)
    还历史以真诚,还生命以过程。 ——余秋雨
  • 相关阅读:
    linux centos 安装配置rsync
    linux下mysql权限配置
    让nginx支持patchinfo,(支持codeigniter,thinkphp,ZF等框架)
    nginx、php-fpm安装mongodb及驱动扩展
    redis和redis php扩展安装
    sea.js 入门
    require.js 入门笔记
    怎么玩耍图标字体.
    利用 Gulp 处理前端工作流程
    LESS 学习记录(简单入门)
  • 原文地址:https://www.cnblogs.com/w-eye/p/14790573.html
Copyright © 2011-2022 走看看