前言

关于Mybatis常见的一些知识点,总结了一个思维导图,分享给大家。

MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。
MyBatis可以通过简单的XML或注解来配置和映射原始类型、接口和Java POJO(Plain Old Java
Objects,普通老式Java对象)为数据库中的记录。

越来越多的企业已经将MyBatis使用到了正式的生产环境,本文就使用MyBatis的几种方式提供简单的示例。
以及如何对数据库密码进行加密。

目前有以下章节:

单独使用MyBatis

集成Spring框架

集成Spring Boot框架

Spring Boot配置数据库密码加密

一、单独使用

引入MyBatis依赖,单独使用,版本是3.5.6

引入依赖

<dependencies><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.19</version></dependency></dependencies>

添加mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下: properties?, settings?, typeAliases?,typeHandlers?, objectFactory?,objectWrapperFactory?, plugins?, environments?,databaseIdProvider?, mappers? --><!-- 配置mybatis的缓存,延迟加载等等一系列属性 --><settings><!-- 全局映射器启用缓存 --><setting name="cacheEnabled" value="false" /><!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 --><setting name="multipleResultSetsEnabled" value="true" /><!-- 是否开启自动驼峰命名规则映射,数据库的A_COLUMN映射为Java中的aColumn --><setting name="mapUnderscoreToCamelCase" value="true" /><!-- MyBatis利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询 --><setting name="localCacheScope" value="STATEMENT" /></settings><!-- 指定路径下的实体类支持别名(默认实体类的名称,首字母小写), @Alias注解可设置别名 --><typeAliases><package name="tk.mybatis.simple.model" /></typeAliases><!-- 配置当前环境信息 --><environments default="development"><environment id="development"><transactionManager type="JDBC"><property name="" value=""/></transactionManager><!-- 配置数据源 --><dataSource type="UNPOOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/gsfy_user?useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false"/><property name="username" value="user"/><property name="password" value="password"/></dataSource></environment></environments><!-- 指定Mapper接口的路径 --><mappers><package name="tk.mybatis.simple.mapper"/></mappers>
</configuration>

开始使用

Model类

tk.mybatis.simple.model.DbTest.java
package tk.mybatis.simple.model;public class DbTest {public Integer id;public String text;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getText() {return text;}public void setText(String text) {this.text = text;}@Overridepublic String toString() {return "DbTest{" +"id=" + id +", text='" + text + '\'' +'}';}
}

Mapper接口

tk.mybatis.simple.mapper.DbTestMapper
package tk.mybatis.simple.mapper;import tk.mybatis.simple.model.DbTest;public interface DbTestMapper {DbTest queryById(Integer id);
}

XML映射文件

XML映射文件请放于Mapper接口所在路径下,保证名称相同

tk/mybatis/simple/mapper/DbTestMapper.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="tk.mybatis.simple.mapper.DbTestMapper"><select id="queryById" parameterType="int" resultType="DbTest">SELECT db_test_id AS id, db_test_text AS textFROM db_testWHERE db_test_id = #{id, jdbcType=INTEGER}</select>
</mapper>

执行示例

package tk.mybatis.simple;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 tk.mybatis.simple.mapper.DbTestMapper;import java.io.IOException;
import java.io.Reader;public class MyBatisHelper {private static SqlSessionFactory sqlSessionFactory;static {try {// MyBatis的配置文件Reader reader = Resources.getResourceAsReader("mybatis-config.xml");// 创建一个 sqlSessionFactory 工厂类sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);reader.close();} catch (IOException e) {e.printStackTrace();}}public static SqlSession getSqlSession() {return sqlSessionFactory.openSession();}public static void main(String[] args) {// 创建一个 SqlSession 会话SqlSession sqlSession = MyBatisHelper.getSqlSession();// 获取 DbTestMapper 接口的动态代理对象DbTestMapper dbTestMapper = sqlSession.getMapper(DbTestMapper.class);// 执行查询System.out.println(dbTestMapper.queryById(1).toString());}
}

二、集成Spring

在 Spring 项目中,使用 MyBatis 的模板,请注意 Spring 的版本为5.2.10.RELEASE

日志框架使用Log4j2(推荐),版本为2.13.3,性能高于logback和log4j

我的项目模板 Git 地址

工程结构图

MyBatis-Spring-Example-Structure
其中jquery.min.js文件可以去官网下载

引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>tk.mybatis.simple</groupId><artifactId>mybatis-spring</artifactId><packaging>war</packaging><properties><!-- MyBatis 版本号 --><mybatis.version>3.5.6</mybatis.version><!-- Jackson 版本号 --><jackson.version>2.11.3</jackson.version><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-framework-bom</artifactId><version>5.2.10.RELEASE</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-bom</artifactId><version>2.13.3</version><scope>import</scope><type>pom</type></dependency></dependencies></dependencyManagement><dependencies><!-- MyBatis 相关 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.2</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.19</version></dependency><!-- druid 数据源--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.3</version></dependency><!-- pagehelper 分页插件 --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.2.0</version></dependency><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>3.2</version></dependency><!--web--><!--支持 Servlet--><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><!--支持 JSP--><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.1</version><scope>provided</scope></dependency><!--支持 JSTL--><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!--Spring 上下文,核心依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><!--Spring JDBC--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId></dependency><!--Spring 事务--><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId></dependency><!--Spring 面向切面编程--><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></dependency><!--spring-aop 依赖--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.2</version></dependency><!--JSR 250 公共注解--><dependency><groupId>javax.annotation</groupId><artifactId>javax.annotation-api</artifactId><version>1.2</version></dependency><!--Java 事务接口--><dependency><groupId>javax.transaction</groupId><artifactId>javax.transaction-api</artifactId><version>1.2</version></dependency><!--Spring Web 核心--><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId></dependency><!--Spring MVC--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></dependency><!--spring mvc-json依赖--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>${jackson.version}</version></dependency><!-- 日志文件管理包 --><!-- log4j2 start --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId></dependency><!-- 保证 web 应用正常清理 log 资源 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-web</artifactId></dependency><dependency> <!-- 桥接:slf4j 到 log4j2 的桥梁 --><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId></dependency><dependency> <!-- 后向兼容:log4j1.x 平滑升级到 log4j2 --><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-1.2-api</artifactId></dependency><dependency> <!-- 桥接:commons-logging(jcl) 到 log4j2 的桥梁 --><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-jcl</artifactId></dependency><!-- slf4j 日志切面,相当于一个适配器 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.7</version></dependency><!-- 高性能并发编程框架 log4j2 使用 --><dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.4.2</version></dependency><!-- log4j2 end --><!-- 上传组件包 --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.8.0</version></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.15</version></dependency></dependencies><build><finalName>study-ssm</finalName><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin></plugins><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource><resource><directory>src/main/resources/META-INF/spring</directory><includes><include>spring-mybatis.xml</include><include>spring-mvc.xml</include></includes><filtering>false</filtering></resource><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources></build></project>

添加spring-mvc.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:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.1.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"><!-- 自动扫描该包,将 Spring Bean 注册到 Spring 的上下文中 --><context:component-scan base-package="tk.mybatis.simple" /><!--避免 IE 执行 AJAX 时,返回 JSON 出现下载文件 --><bean id="mappingJacksonHttpMessageConverter"class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value></list></property></bean><!-- 启动 SpringMVC 的注解功能,完成请求和注解 POJO 的映射 --><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter "><property name="messageConverters"><list><ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON转换器 --></list></property></bean><!-- 配置文件上传,如果没有使用文件上传可以不用配置,pom 中也不必引入上传组件包 --><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 默认编码 --><property name="defaultEncoding" value="utf-8" /><!-- 文件大小最大值 100M --><property name="maxUploadSize" value="104857600" /><!-- 内存中的最大值 4M--><property name="maxInMemorySize" value="40960" /><!-- 启用是为了推迟文件解析,以便捕获文件大小异常 --><property name="resolveLazily" value="true"/></bean><!-- 定义 ViewResolver(视图解析器),配置多个需要使用 order 属性排序,InternalResourceViewResolver 放在最后--><bean class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"><property name="favorParameter" value="true" /><property name="parameterName" value="format"/><property name="ignoreAcceptHeader" value="true" /><property name="mediaTypes"><value><!-- 告诉视图解析器,返回的类型为 json 格式 -->json=application/jsonxml=application/xmlhtml=text/html</value></property><property name="defaultContentType" value="text/html" /></bean><!-- 定义跳转的文件的前后缀,视图名称解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 自动给后面action的方法return的字符串加上前缀和后缀,变成一个可用的地址 --><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" /></bean><!-- 扩充了注解驱动,可以将请求参数绑定到控制器参数 --><mvc:annotation-driven /><!-- 让一些静态的不被SpringMVC的拦截器拦截 --><mvc:default-servlet-handler/><!-- 静态资源 --><mvc:resources location="static/" mapping="/static/**"/></beans>

添加mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下: properties, settings, typeAliases, plugins,objectFactory, objectWrapperFactory, reflectorFactory, environments, databaseIdProvider, typeHandlers, mappers --><!-- 配置mybatis的缓存,延迟加载等等一系列属性 --><settings><!-- 全局的开启或关闭配置文件中的所有映射器已经配置的任何缓存,关闭二级缓存,默认开启 --><setting name="cacheEnabled" value="false" /><!-- 开启一级缓存,缓存级别为SESSION(默认),如果缓存级别为STATEMENT将不会再同一个SqlSession中缓存 --><setting name="localCacheScope" value="STATEMENT" /><!-- 通过resultMap标签内的association标签可使用延迟加载 --><!-- 查询时,关闭关联对象即时加载以提高性能,开启延迟加载,默认关闭,关闭表示直接加载,查询时就进行关联查询 --><setting name="lazyLoadingEnabled" value="true" /><!-- 设置关联对象加载的形态,关闭侵入式延迟加载,在访问主对象时不进行查询关联对象,而是在真正访问关联对象时才进行关联查询,以提高性能 --><!-- 3.4.1及之前的版本默认为开启,表示查询时不进行关联查询,访问主对象时才进行关联查询 --><setting name="aggressiveLazyLoading" value="false" /><!-- 允许使用列标签代替列名 --><setting name="useColumnLabel" value="true" /><!-- 不允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 --><setting name="useGeneratedKeys" value="false" /><!-- 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名A_COLUMN到经典Java属性名aColumn的类似映射 --><setting name="mapUnderscoreToCamelCase" value="true" /></settings><!-- 指定路径下的实体类支持别名(默认实体类的名称 全小写), @Alias 注解可设置别名 --><typeAliases><package name="tk.mybatis.simple.model" /></typeAliases><plugins><!-- PageHelper分页插件,配置参考:https://github.com/pagehelper/Mybatis-PageHelper --><plugin interceptor="com.github.pagehelper.PageInterceptor"><!-- 使用哪种方言的分页方式,默认会检测数据库连接,自动选择合适的分页方式 --><property name="helperDialect" value="mysql"/><!-- 默认值为false,该参数对使用RowBounds作为分页参数时有效。当该参数设置为true 时,会将 RowBounds中的 offset 参数当成pageNum使用,可以用页码和页面大小两个参数进行分页 --><property name="offsetAsPageNum" value="true" /><!-- 默认值为false,该参数对使用RowBounds作为分页参数时有效。当该参数设置为true时,使用 RowBounds分页会进行count 查询 --><property name="rowBoundsWithCount" value="true" /><!-- 默认值为false,当该参数设置为 true 时,如果pageSize=0 或者RowBounds.limit = 0就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是Page类型)--><property name="pageSizeZero" value="true" /></plugin></plugins>
</configuration>

添加spring-mybatis.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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"><!--定义一个数据源--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"init-method="init" destroy-method="close"><property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&amp;characterEncoding=utf8"/><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="username" value="root"/><property name="password" value="password"/><property name="filters" value="stat,log4j,wall"/><!--最大连接池数量--><property name="maxActive" value="20"/><property name="minIdle" value="20"/><!-- 初始化时建立物理连接的个数 --><property name="initialSize" value="5"/><!-- 获取连接时最大等待时间 --><property name="maxWait" value="10000"/><!-- 在指定时间间隔内执行一次空闲连接回收器 --><property name="timeBetweenEvictionRunsMillis" value="3600000"/><!-- 池中的连接空闲指定时间后被回收 --><property name="minEvictableIdleTimeMillis" value="120000"/><property name="testWhileIdle" value="true"/><property name="testOnBorrow" value="false"/></bean><!-- Spring 和 MyBatis 整合 --><bean id="mySqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><!-- 引入 MyBatis 配置文件 --><property name="configLocation" value="classpath:mybatis-config.xml"/><!-- 自动扫描 XML 映射文件 --><property name="mapperLocations" value="classpath:tk/mybatis/simple/mapper/*.xml"/></bean><!-- 通过 MapperScannerConfigurer 类自动扫描 Mapper 接口 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!-- Mapper 接口所在包路径 --><property name="basePackage" value="tk.mybatis.simple.mapper"/><!--引用上面的 SqlSessionFactoryBean 对象 --><property name="sqlSessionFactoryBeanName" value="mySqlSessionFactory"/></bean><!-- 事务管理器 --><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!-- 指定数据源 --><property name="dataSource" ref="dataSource"/></bean><!-- 设置为上面定义事务管理器,默认值为 transactionManager --><tx:annotation-driven transaction-manager="txManager"/><!-- 配置事务传播特性  --><tx:advice id="transactionAdvice" transaction-manager="txManager"><tx:attributes><tx:method name="insert*" rollback-for="java.lang.Exception"/><tx:method name="delete*" rollback-for="java.lang.Exception"/><tx:method name="update*" rollback-for="java.lang.Exception"/><tx:method name="*" read-only="true"/></tx:attributes></tx:advice><!--  配置哪些类的哪些方法参与事务 --><aop:config><aop:advisor advice-ref="transactionAdvice" pointcut="execution(* tk.mybatis.*.service..*Service*.*(..))"/></aop:config><aop:aspectj-autoproxy/></beans>

添加log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="INFO" monitorInterval="30"><appenders><!-- 参考官方地址:https://logging.apache.org/log4j/2.x/ --><!-- 这个输出控制台的配置  --><Console name="Console" target="SYSTEM_OUT"><!-- 设置输出日志级别(高于 level),匹配才打印 --><ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/><!-- 打印日志的格式 --><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n"/></Console><!-- 定义一个日志输入文件 RollingFile,按天或者超过 100M 分割会进行分割 --><RollingFile name="RollingFile" fileName="logs/trace.log"append="true" filePattern="logs/$${date:yyyy-MM}/trace-%d{yyyy-MM-dd}-%i.log.gz"><!-- 需要接收的日志的级别(高于 level) --><ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/><!-- 日志的格式 --><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile><!-- 定义一个日志输入文件 RollingErrorFile,按天或者超过 100M 分割会进行分割 --><RollingFile name="RollingErrorFile" fileName="logs/error.log"append="true" filePattern="logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz"><!-- 需要接收的日志的级别(高于 level) --><ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/><!-- 日志的格式 --><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile></appenders><loggers><!--过滤掉 Spring 和 Mybatis 的一些无用的 DEBUG 信息 --><logger name="org.springframework" level="INFO"/><logger name="org.mybatis" level="INFO"/><root level="INFO" includeLocation="true"><appender-ref ref="Console"/><appender-ref ref="RollingFile"/><appender-ref ref="RollingErrorFile"/></root></loggers>
</configuration>

添加web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><display-name>Archetype Created Web Application</display-name><!-- Spring 和 MyBatis 的配置文件 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mybatis.xml</param-value></context-param><!-- 编码过滤器,Spring 提供了 CharacterEncodingFilter 过滤器这个过滤器就是针对于每次浏览器请求进行过滤的,然后再其之上添加了父类没有的功能即处理字符编码 --><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><async-supported>true</async-supported><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 在容器(Tomcat、Jetty)启动时会被 ContextLoaderListener 监听到,从而调用其 contextInitialized() 方法,初始化 Root WebApplicationContext 容器 --><!-- 声明 Spring Web 容器监听器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 防止 Spring 内存溢出监听器 --><listener><listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class></listener><!-- 1.SpringMVC 配置 前置控制器(SpringMVC 的入口)DispatcherServlet 是一个 Servlet,所以可以配置多个 DispatcherServlet --><servlet><!-- 在 DispatcherServlet 的初始化过程中,框架会在 web 应用 的 WEB-INF 文件夹下,寻找名为 [servlet-name]-servlet.xml 的配置文件,生成文件中定义的 Bean. --><servlet-name>SpringMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 配置需要加载的配置文件 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><!-- 程序运行时从 web.xml 开始,加载顺序为:context-param -> Listener -> Filter -> Structs -> Servlet设置 web.xml 文件启动时加载的顺序(1 代表容器启动时首先初始化该 Servlet,让这个 Servlet 随 Servlet 容器一起启动)load-on-startup 是指这个 Servlet 是在当前 web 应用被加载的时候就被创建,而不是第一次被请求的时候被创建  --><load-on-startup>1</load-on-startup><async-supported>true</async-supported></servlet><servlet-mapping><!-- 这个 Servlet 的名字是 SpringMVC,可以有多个 DispatcherServlet,是通过名字来区分的每一个 DispatcherServlet 有自己的 WebApplicationContext 上下文对象,同时保存在 ServletContext 中和 Request 对象中ApplicationContext(Spring 容器)是 Spring 的核心Context 我们通常解释为上下文环境,Spring 把 Bean 放在这个容器中,在需要的时候,可以 getBean 方法取出--><servlet-name>SpringMVC</servlet-name><!-- Servlet 拦截匹配规则,可选配置:*.do、*.action、*.html、/、/xxx/* ,不允许:/* --><url-pattern>/</url-pattern></servlet-mapping><welcome-file-list><!-- 浏览器输入到项目名,默认打开如下配置页面 --><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>

开始使用

Model类

tk.mybatis.simple.model.DbTest.java
package tk.mybatis.simple.model;public class DbTest {public Integer id;public String text;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getText() {return text;}public void setText(String text) {this.text = text;}@Overridepublic String toString() {return "DbTest{" +"id=" + id +", text='" + text + '\'' +'}';}
}

Mapper接口

tk.mybatis.simple.mapper.DbTestMapper
package tk.mybatis.simple.mapper;import tk.mybatis.simple.model.DbTest;public interface DbTestMapper {DbTest queryById(Integer id);
}

XML映射文件

XML映射文件请放于Mapper接口所在路径下,保证名称相同

tk/mybatis/simple/mapper/DbTestMapper.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="tk.mybatis.simple.mapper.DbTestMapper"><select id="queryById" parameterType="int" resultType="DbTest">SELECT db_test_id AS id, db_test_text AS textFROM db_testWHERE db_test_id = #{id, jdbcType=INTEGER}</select>
</mapper>

Controller类

package tk.mybatis.simple.controller;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import tk.mybatis.simple.mapper.DbTestMapper;
import tk.mybatis.simple.model.DbTest;@Controller
@RequestMapping(value = "/test")
public class DbTestController {private static final Logger logger = LogManager.getLogger(DbTestController.class);@Autowiredprivate DbTestMapper dbTestMapper;@GetMapping("/")public String index() {return "welcome";}@GetMapping("/query")public ModelAndView query(@RequestParam("id") Integer id) {DbTest dbTest = dbTestMapper.queryById(id);logger.info("入参:{},查询结果:{}", id, dbTest.toString());ModelAndView mv = new ModelAndView();mv.setViewName("result");mv.addObject("test", dbTest);return mv;}
}

index.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="zh-CN">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>首页</title>
</head>
<body>
<h3>Hello World!</h3>
<form method="get" action="<c:url value="/test/"/>"><button class="btn btn-default" type="submit"><span>开始测试</span></button>
</form>
</body>
</html>

welcome.jsp

<%--Created by IntelliJ IDEA.User: jingpDate: 2019/6/5Time: 15:17To change this template use File | Settings | File Templates.
--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="zh-CN">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>查询</title></head>
<body>
<h3>查询数据库</h3>
<form method="get" action="<c:url value="/test/query"/>"><div class="input-group"><span class="input-group-addon">ID:</span><input type="number" name="id" class="form-control" required></div><button class="btn btn-default" type="submit"><span>查询</span></button>
</form><script src="../../static/jquery.min.js"></script>
</body>
</html>

result.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="zh-CN">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>结果</title>
</head>
<body>
<h4>查询结果:${test.toString()}</h4>
<form method="post" action="<c:url value="/"/>"><button class="btn btn-default" type="submit"><span>退出</span></button>
</form><script src="../../static/jquery.min.js"></script>
</body>
</html>

运行程序

配置好Tomcat,然后启动就可以了,进入页面,点击开始测试,然后查询数据库就可以通过MyBatis操作数据库了

三、集成SpringBoot

引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELEASE</version></parent><modelVersion>4.0.0</modelVersion><groupId>tk.mybatis.simple</groupId><artifactId>mybatis-spring-boot</artifactId><packaging>jar</packaging><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencyManagement><dependencies><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-bom</artifactId><version>2.13.3</version><scope>import</scope><type>pom</type></dependency></dependencies></dependencyManagement><dependencies><!-- Spring Boot 核心包,包括自动装配,日志,以及YAML文件解析 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><!-- 提供全栈的 WEB 开发特性,包括 Spring MVC 依赖和 Tomcat 容器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 提供通用单元测试依赖,包括 JUnit, Hamcrest , Mockito --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- lombok 工具 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.22</version><scope>provided</scope></dependency><!-- MyBatis 相关 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.19</version></dependency><!-- druid 数据源--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.3</version></dependency><!-- pagehelper 分页插件 --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.3.0</version></dependency><!-- 日志文件管理包 --><!-- log4j2 start --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId></dependency><!-- 保证 web 应用正常清理 log 资源 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-web</artifactId></dependency><dependency> <!-- 桥接:slf4j 到 log4j2 的桥梁 --><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId></dependency><dependency> <!-- 后向兼容:log4j1.x 平滑升级到 log4j2 --><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-1.2-api</artifactId></dependency><dependency> <!-- 桥接:commons-logging(jcl) 到 log4j2 的桥梁 --><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-jcl</artifactId></dependency><!-- slf4j 日志切面,相当于一个适配器 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.7</version></dependency><!-- 高性能并发编程框架 log4j2 使用 --><dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.4.2</version></dependency><!-- log4j2 end --><!-- JSON 工具 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.54</version></dependency></dependencies><build><finalName>basic</finalName><!-- 配置相关插件 --><plugins><!-- appassembler-maven-plugin --><!-- mvn clean package appassembler:assemble -Dmaven.test.skip=true -Dmaven.javadoc.skip=true --><plugin><groupId>org.codehaus.mojo</groupId><artifactId>appassembler-maven-plugin</artifactId><version>1.10</version><configuration><!-- 生成linux和windows两种执行脚本 --><platforms><platform>unix</platform><platform>windows</platform></platforms><!-- jar存放的目录 --><repositoryName>lib</repositoryName><!-- jar包存放在指定目录的规则,默认是${groupId}/${artifactId}的目录格式,flat表示直接把jar放到目录下 --><repositoryLayout>flat</repositoryLayout><!-- 配置文件存放的目录 --><configurationDirectory>conf</configurationDirectory><!-- copy配置文件到上面目录 --><copyConfigurationDirectory>true</copyConfigurationDirectory><!-- 从哪里copy配置文件(默认src/main/config) --><configurationSourceDirectory>src/main/resources</configurationSourceDirectory><includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath><!-- ${project.build.directory}:target, 文件存放的根目录 --><assembleDirectory>${project.build.directory}/basic-assemble</assembleDirectory><programs><program><!-- 启动类 --><mainClass>com.fullmoon.study.Application</mainClass><!-- 生成的文件名称:basic.sh --><id>basic</id><!-- 配置JVM参数 --><jvmSettings><extraArguments><!--<extraArgument>-server</extraArgument>--><extraArgument>-XX:+HeapDumpOnOutOfMemoryError</extraArgument><extraArgument>-XX:HeapDumpPath=/app/dump</extraArgument><extraArgument>-Xmx512m</extraArgument><extraArgument>-Xms512m</extraArgument></extraArguments></jvmSettings></program></programs></configuration></plugin><!-- 编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins><!-- 指定 resources --><resources><resource><directory>src/main/resources</directory><includes><include>*.properties</include><include>*.xml</include><include>*.yml</include></includes><filtering>false</filtering></resource><resource><directory>src/main/resources/mapper</directory><targetPath>mapper/</targetPath><includes><include>*.xml</include></includes><filtering>false</filtering></resource></resources></build></project>

添加mybatis-config.xml

MyBatis 的配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下: properties, settings, typeAliases, plugins,objectFactory, objectWrapperFactory, reflectorFactory, environments, databaseIdProvider, typeHandlers, mappers --><!-- 配置mybatis的缓存,延迟加载等等一系列属性 --><settings><!-- 全局的开启或关闭配置文件中的所有映射器已经配置的任何缓存,关闭二级缓存,默认开启 --><setting name="cacheEnabled" value="false" /><!-- 开启一级缓存,缓存级别为SESSION(默认),如果缓存级别为STATEMENT将不会再同一个SqlSession中缓存 --><setting name="localCacheScope" value="STATEMENT" /><!-- 通过resultMap标签内的association标签可使用延迟加载 --><!-- 查询时,关闭关联对象即时加载以提高性能,开启延迟加载,默认关闭,关闭表示直接加载,查询时就进行关联查询 --><setting name="lazyLoadingEnabled" value="true" /><!-- 设置关联对象加载的形态,关闭侵入式延迟加载,在访问主对象时不进行查询关联对象,而是在真正访问关联对象时才进行关联查询,以提高性能 --><!-- 3.4.1及之前的版本默认为开启,表示查询时不进行关联查询,访问主对象时才进行关联查询 --><setting name="aggressiveLazyLoading" value="false" /><!-- 允许使用列标签代替列名 --><setting name="useColumnLabel" value="true" /><!-- 不允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 --><setting name="useGeneratedKeys" value="false" /><!-- 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名A_COLUMN到经典Java属性名aColumn的类似映射 --><setting name="mapUnderscoreToCamelCase" value="true" /></settings>
</configuration>

添加application.yml

Spring Boot 的配置文件

server:port: 9092servlet:context-path: /mybatis-spring-boot-demotomcat:accept-count: 200min-spare-threads: 200
spring:application:name: mybatis-spring-boot-demoprofiles:active: testservlet:multipart:max-file-size: 100MBmax-request-size: 100MBdatasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:driver-class-name: com.mysql.cj.jdbc.Driver # 不配置则会根据 url 自动识别initial-size: 5 # 初始化时建立物理连接的个数min-idle: 20 # 最小连接池数量max-active: 20 # 最大连接池数量max-wait: 10000 # 获取连接时最大等待时间,单位毫秒validation-query: SELECT 1 # 用来检测连接是否有效的 sqltest-while-idle: true # 申请连接的时候检测,如果空闲时间大于 timeBetweenEvictionRunsMillis,则执行 validationQuery 检测连接是否有效test-on-borrow: false # 申请连接时执行 validationQuery 检测连接是否有效min-evictable-idle-time-millis: 120000 # 连接保持空闲而不被驱逐的最小时间,单位是毫秒time-between-eviction-runs-millis: 3600000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒filters: stat,log4j,wall # 配置过滤器,stat-监控统计,log4j-日志,wall-防御 SQL 注入connection-properties: 'druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000' # StatFilter配置,打开合并 SQL 功能和慢 SQL 记录web-stat-filter: # WebStatFilter 配置enabled: trueurl-pattern: '/*'exclusions: '*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*'stat-view-servlet: # StatViewServlet 配置enabled: trueurl-pattern: '/druid/*'reset-enable: falselogin-username: druidlogin-password: druidaop-patterns: 'com.fullmoon.study.service.*' # Spring 监控配置
mybatis:type-aliases-package: tk.mybatis.simple.modelmapper-locations: classpath:mapper/*.xmlconfig-location: classpath:mybatis-config.xml
pagehelper:helper-dialect: mysqlreasonable: true # 分页合理化参数offset-as-page-num: true # 将 RowBounds 中的 offset 参数当成 pageNum 使用supportMethodsArguments: true # 支持通过 Mapper 接口参数来传递分页参数
# 测试环境
---
spring:profiles: testdatasource:druid:url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&amp;characterEncoding=utf8username: rootpassword: password

注意上面 mybatis 的相关配置,XML 映射文件是存放于 classpath 下的 mapper 文件夹下面的

添加log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="INFO" monitorInterval="30"><appenders><!-- 参考官方地址:https://logging.apache.org/log4j/2.x/ --><!-- 这个输出控制台的配置  --><Console name="Console" target="SYSTEM_OUT"><!-- 设置输出日志级别(高于 level),匹配才打印 --><ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/><!-- 打印日志的格式 --><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n"/></Console><!-- 定义一个日志输入文件 RollingFile,按天或者超过 100M 分割会进行分割 --><RollingFile name="RollingFile" fileName="logs/trace.log"append="true" filePattern="logs/$${date:yyyy-MM}/trace-%d{yyyy-MM-dd}-%i.log.gz"><!-- 需要接收的日志的级别(高于 level) --><ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/><!-- 日志的格式 --><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile><!-- 定义一个日志输入文件 RollingErrorFile,按天或者超过 100M 分割会进行分割 --><RollingFile name="RollingErrorFile" fileName="logs/error.log"append="true" filePattern="logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz"><!-- 需要接收的日志的级别(高于 level) --><ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/><!-- 日志的格式 --><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile></appenders><loggers><!--过滤掉 Spring 和 Mybatis 的一些无用的 DEBUG 信息 --><logger name="org.springframework" level="INFO"/><logger name="org.mybatis" level="INFO"/><root level="INFO" includeLocation="true"><appender-ref ref="Console"/><appender-ref ref="RollingFile"/><appender-ref ref="RollingErrorFile"/></root></loggers>
</configuration>

开始使用

在Spring Boot项目的启动类上面添加 @MapperScan(“tk.mybatis.simple.mapper”) 注解,指定Mapper接口所在的包路径,启动类如下:

@SpringBootApplication
@EnableTransactionManagement
@MapperScan("tk.mybatis.simple.mapper")
public class Application {public static void main(String[] args){SpringApplication.run(Application.class, args);}
}

然后在 classpath 下的 mapper 文件夹(根据 application.yml 配置文件中的定义)添加 XML 映射文件,即可开始使用 MyBatis了

其中 @EnableTransactionManagement 注解表示开启事务的支持(@SpringBootApplication 注解在加载容器的时候已经开启事务管理的功能了,也可不需要添加该注解)

在需要事务的方法或者类上面添加 @Transactional 注解即可,引入spring-boot-starter-jdbc依赖,注入的是 DataSourceTransactionManager 事务管理器,事务的使用示例如下:

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public int insertFeedback(UserFeedbackInfo requestAddParam) {try {// ... 业务逻辑 } catch (Exception e) {// 事务回滚TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();return 0;}
}

四、SpringBoot配置数据库密码加密?

1.借助Druid数据源

Druid数据源支持数据库密码进行加密,在Spring Boot中配置方式如下:

加密数据库密码,通过Druid的com.alibaba.druid.filter.config.ConfigTools工具类对数据库密码进行加密(RSA 算法),如下:

public static void main(String[] args) throws Exception {ConfigTools.main(new String[]{"you_password"});
}

或者执行以下命令:

java -cp druid-1.0.16.jar com.alibaba.druid.filter.config.ConfigTools you_password

输出:

privateKey:MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEA6+4avFnQKP+O7bu5YnxWoOZjv3no4aFV558HTPDoXs6EGD0HP7RzzhGPOKmpLQ1BbA5viSht+aDdaxXp6SvtMQIDAQABAkAeQt4fBo4SlCTrDUcMANLDtIlax/I87oqsONOg5M2JS0jNSbZuAXDv7/YEGEtMKuIESBZh7pvVG8FV531/fyOZAiEA+POkE+QwVbUfGyeugR6IGvnt4yeOwkC3bUoATScsN98CIQDynBXC8YngDNwZ62QPX+ONpqCel6g8NO9VKC+ETaS87wIhAKRouxZL38PqfqV/WlZ5ZGd0YS9gA360IK8zbOmHEkO/AiEAsES3iuvzQNYXFL3x9Tm2GzT1fkSx9wx+12BbJcVD7AECIQCD3Tv9S+AgRhQoNcuaSDNluVrL/B/wOmJRLqaOVJLQGg==
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOvuGrxZ0Cj/ju27uWJ8VqDmY7956OGhVeefB0zw6F7OhBg9Bz+0c84RjzipqS0NQWwOb4kobfmg3WsV6ekr7TECAwEAAQ==
password:PNak4Yui0+2Ft6JSoKBsgNPl+A033rdLhFw+L0np1o+HDRrCo9VkCuiiXviEMYwUgpHZUFxb2FpE0YmSguuRww==
然后在 application.yml 中添加以下配置:spring:datasource:druid:password: ${password} # 加密后的数据库密码filters: config # 配置 ConfigFilter ,通过它进行解密# 提示需要对数据库密码进行解密connection-properties: 'config.decrypt=true;config.decrypt.key=${publickey}'
publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJvQUB7pExzbzTpaQCCY5qS+86MgYWvRpqPUCzjFwdMgrBjERE5X5oojSe48IGZ6UtCCeaI0PdhkFoNaJednaqMCAwEAAQ==

这样就OK了,主要是在 ConfigFilter过滤器中,会先对密码进行解密,然后再设置到DataSource数据源

2.借助Jasypt加密包

Jasypt是一个Java库,可以让开发人员将基本的加密功能添加到项目中,而无需对加密的工作原理有深入的了解

接下来讲述的在Spring Boot项目中如何使用Jasypt,其他使用方法请参考Jasypt Github地址

引入依赖

<!-- jasypt加密工具,https://github.com/ulisesbocchio/jasypt-spring-boot -->
<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version>
</dependency>

添加注解

在启动类上面添加@EnableEncryptableProperties注解,使整个Spring环境启用Jasypt加密功能,如下:

@SpringBootApplication
@EnableEncryptableProperties
public class Application {public static void main(String[] args){SpringApplication.run(Application.class, args);}
}

获取密文

需要通过Jasypt官方提供的jar包进行加密,如下:

import com.ulisesbocchio.jasyptspringboot.properties.JasyptEncryptorConfigurationProperties;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.PBEConfig;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
/*** @author jingping.liu* @date 2020-11-20* @description Jasypt 安全框架加密类工具包*/
public class JasyptUtils {/*** 生成一个{@link PBEConfig} 配置对象* <p>* 注意!!!* 可查看Jasypt全局配置对象{@link JasyptEncryptorConfigurationProperties}中的默认值* 这里的配置建议与默认值保持一致,否则需要在application.yml中定义这里的配置(也可以通过 JVM 参数的方法)* 注意password和algorithm 配置项,如果不一致在启动时可能会解密失败而报错** @param salt 盐值* @return SimpleStringPBEConfig 加密配置*/private static SimpleStringPBEConfig generatePBEConfig(String salt) {SimpleStringPBEConfig config = new SimpleStringPBEConfig();// 设置salt盐值config.setPassword(salt);// 设置要创建的加密程序池的大小,这里仅临时创建一个,设置 1 即可config.setPoolSize("1");// 设置加密算法, 此算法必须由 JCE 提供程序支持,默认值 PBEWITHHMACSHA512ANDAES_256config.setAlgorithm("PBEWithMD5AndDES");// 设置应用于获取加密密钥的哈希迭代次数config.setKeyObtentionIterations("1000");// 设置要请求加密算法的安全提供程序的名称config.setProviderName("SunJCE");// 设置 salt 盐的生成器config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");// 设置 IV 生成器config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");// 设置字符串输出的编码形式,支持 base64 和 hexadecimalconfig.setStringOutputType("base64");return config;}/*** 通过 {@link PooledPBEStringEncryptor} 进行加密密** @param salt 盐值* @param message 需要加密的内容* @return 加密后的内容*/public static String encrypt(String salt, String message) {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig pbeConfig = generatePBEConfig(salt);// 生成加密配置encryptor.setConfig(pbeConfig);System.out.println("----ARGUMENTS-------------------");System.out.println("message: " + message);System.out.println("salt: " + pbeConfig.getPassword());System.out.println("algorithm: " + pbeConfig.getAlgorithm());System.out.println("stringOutputType: " + pbeConfig.getStringOutputType());// 进行加密String cipherText = encryptor.encrypt(message);System.out.println("----OUTPUT-------------------");System.out.println(cipherText);return cipherText;}public static String decrypt(String salt, String message) {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();// 设置解密配置encryptor.setConfig(generatePBEConfig(salt));// 进行解密return encryptor.decrypt(message);}public static void main(String[] args) {// 随机生成一个 salt 盐值String salt = UUID.randomUUID().toString().replace("-", "");// 进行加密encrypt(salt, "message");}
}

如何使用

直接在application.yml配置文件中添加Jasypt配置和生成的密文

jasypt:encryptor:password:salt#salt盐值,需要和加密时使用的salt一致algorithm:PBEWithMD5AndDES#加密算法,需要和加密时使用的算法一致string-output-type:hexadecimal#密文格式,,需要和加密时使用的输出格式一致
spring:datasource:druid:username:rootpassword:ENC(cipherText)#Jasypt密文格式:ENC(密文)

“salt盐值也可以通过JVM参数进行设置,例如:-Djasypt.encryptor.password=salt”

启动后,Jasypt会先根据配置将ENC(密文)进行解密,然后设置到Spring环境中

最后

我这边整理了:Mybatis常见的一些知识点、MyBatis源码分析图解、MyBtis面试解析、深入浅出MyBatis技术原理与实战PDF272页,Mybatis思维导图(还有Java核心知识点、面试专题和20年最新的互联网真题、电子书等)有需要的朋友可以点击这里获取。

工作3年,竟然还有人不知道使用MyBatis的这4个技巧?相关推荐

  1. 21届毫无工作经验毕业生竟然拿到了阿里的意向书?在此分享一下我的阿里3面+HR面面经

    前言 Timeline: 4.21自主投递 4.23笔试 5.10一面 5.12二面 5.13三面 5.18hr面 5.24意向书 一面 电话面试 48分钟 自我介绍 学过哪些计算机课程?哪一门你觉得 ...

  2. 常用的这5类SpringBoot注解,竟然还有人不知道?

    一.注解(annotations)列表 1.@SpringBootApplication 包含了@ComponentScan.@Configuration和@EnableAutoConfigurati ...

  3. idea本地跑如何看gc日志_不可思议,竟然还有人不会查看GC垃圾回收日志?

    日志的重要性,不需要过多强调了.通过日志,我们可以发现程序可能有内存(泄露)问题.本文从案例出发,具体介绍这些日志信息,以期帮助大家更好地了解垃圾回收的运行情况. 还是先上图,看看本文的主要内容: 我 ...

  4. 3 年大厂工作经验面试竟然要我手写 atoi 函数

    文章目录 前言 我遇到的问题 标准库的实现 适合面试手写的 atoi 实现 参考文献 前言 手写代码是面试过程常见的环节之一,但是一般都是手写算法题,此次面试官要我手写一个基本的 C 语言 atoi, ...

  5. 竟然还有人不知道IfluxDB是干嘛的???

    前言 我们在学习任何新知识的,都应该抱着3个"W"的思想进行学习,即         1.what:界定问题,搞清楚问题到底是什么?: 2.why:分析问题,结构化分析问题的本质原 ...

  6. java的工作原理你知道吗_每天用Mybatis,但是Mybatis的工作原理你真的知道吗?

    近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件:SqlSession Executor Stat ...

  7. exce中让两列数据一一对应_工作中被重复数据所烦恼?学会这几个Excel技巧,少加班...

    工作中,经常被重复的数据所困扰,那就学下这几个关于重复值的技巧,每天5分钟,工作更轻松! 1.快速查找单列重复数据 如果某一列中,有的数据是重复的,我们希望把它找出来,可以在条件格式中突出单元格,然后 ...

  8. python创建工作簿_「总结篇」Python中所有的Excel操作技巧

    Python对于Excel的操作是多种多样的,掌握了相关用法就可以随心所欲的操作数据了! 操作xls文件 xlrd(读操作): import xlrd 1.引入xlrd模块 workbook=xlrd ...

  9. 悲催呀,辞职后,竟然找不到工作了

    两年前大学毕业,找工作时经验比较少,更多的是理论,去小公司面试,笔试很轻易的拿下,面试也一次性通过,尽管是小公司,自己就很满足的就不去下一家面试了,对于固步自封的自己,两年之后终于有了报应! 第一年的 ...

最新文章

  1. 在iOS中安装OpenCV
  2. 想办法解决window刷新的问题
  3. mysql学生选课系统的关系模型_使用PowerDesigner搭建学生选课管理系统(学生老师管理员一体系结构)由基础设计至数据库生成(SQL语句源代码的生成)全过程实例操作...
  4. 【SpringBoot 2】(六)配置文件 web开发相关
  5. JAVA设置按钮无效_JAVA设置的按钮监听没有反应
  6. webworker应用场景_典型应用场景 · OpenResty最佳实践-最新版 · 看云
  7. win10上如何启用或禁用Windows功能
  8. thinkphp3.2 不同域名配置不同分组设置
  9. 环境安装_Python教程 Python环境安装
  10. win7旗舰恢复出厂设置_iphone12怎么恢复出厂设置 iphone12还原所有设置方法介绍
  11. Mysql中Check约束无效的原因以及解决方法
  12. Gulp学习笔记(黑马教程)
  13. ffmpeg实现flv至mp4格式转换的bat脚本
  14. 《A Study on Performance Benefifits of Core Morphing in an Asymmetric Multicore Processor》文献精读1
  15. [电脑驱动向]笔记本键盘失灵,电脑插耳机没反应,不要着急拿去物理维修,可能是bios驱动需要更新
  16. 【原创】VBA学习笔记(306)VBA中关于 exit 的用法
  17. 微信公众号开发--自定义菜单跳转页面并获取用户信息(续)
  18. 编程语言是怎么发展的?
  19. 实时云渲染有哪些优势?
  20. Android不刷机下的app2sd方法(dex cache占空间解决篇)

热门文章

  1. linux防火墙配置80端口,Linux配置防火墙 开启80端口
  2. 2022-4-2 Leetcode 25.K个一组翻转
  3. 电视剧《猎狐》给我们的启示
  4. 美联致美线雕提升术除皱效果怎么样呢
  5. java 生成缩略图并返回字节数组_关于提取后台图片数据时自动生成缩略图程序...
  6. ado.net能访问oracle,利用ADO.NET访问Oracle数据库的实现
  7. codeforces 1399D
  8. cudnn tar 安装包快速获取 | 云盘分享 |【cudnn安装包】
  9. 【无限互联】学员作品:面包旅行APP
  10. java三重des加密_基础才是重中之重~BouncyCastle实现的DES3加密~java通用