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数据源
- 介绍
Druid首先是一个数据库连接池,据说Druid时目前世界上最好的数据库连接池,在功能,性能,扩展方面都远远超过其他数据库连接池,同时也结合了C3P0、DBCPPROXOOL等DB池的优点,Druid可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFile插件,能够详细统计SQL的执行性能,可以线上分析数据库访问性能。
springboot2.0以上默认使用HiKari数据源,可以说Hiari与Druid都是当前Java Web上最优秀的数据源
-
使用
创建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; } }
整合MyBatis
-
回顾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);
-
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区别:
- SpringBoot整合MyBatis省略了核心配置文件config.xml改而使用application.properties配置
- Mapper.xml映射文件必须要放在resource文件夹下(在application.properties扫描该配置文件)