集成MyBatis及MyBatisUtils
引入依赖
首先为了提高jar包下载速度,在pom.xml中配置阿里镜像仓库:
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
引入MyBatis相关依赖
<dependencies>
<!--Mybatis 框架-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<!--MySQL 8 JDBC驱动-->
<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.1.14</version>
</dependency>
<!--Junit4单元测试框架-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!--只参与Maven Test,不进行发布-->
<scope>test</scope>
</dependency>
<!--Logback日志输出组件-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
maven默认进行构建时使用JDK编译器级别为1.5,需要用到JDK 1.8新特性(如函数式接口)时需要在pom.xml设置编译插件JDK版本
<build>
<plugins>
<plugin>
<!--利用Maven编译插件将编译级别提高至1.8,解决lambda表达式错误-->
<groupId>org.apache.maven.plugins</groupId>
<!--maven-compiler-plugin是Maven自带的编译插件-->
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<!--检查源码采用1.8规则,默认为1.5-->
<source>1.8</source>
<!--按1.8规则生成字节码-->
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
添加mybatis-config.xml配置文件
在src/main/resources目录下创建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>
<environments default="dev">
<!--开发环境配置-->
<environment id="dev">
<!--事务管理器采用JDBC方式-->
<transactionManager type="JDBC"></transactionManager>
<!--利用Mybatis自带连接池管理连接-->
<dataSource type="POOLED">
<!--JDBC连接属性-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ql-oa?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
创建MyBatisUtils工具类
在com.ql.oa.utils包下创建MyBatisUtils工具类
在学习MyBatis是MyBatisUtils工具逻辑比较简单,关闭连接时还需要调一下关闭方法,如果忘记关闭的话可能会引起数据库连接泄露,长时间积累下来可能会造成程序崩溃,所以需要改良一下。
public class MybatisUtils {
//利用static(静态)属于类不属于对象,且全局唯一
private static SqlSessionFactory sqlSessionFactory = null;
//利用静态块在初始化类时实例化sqlSessionFactory
static{
Reader reader = null;
try{
reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}catch(IOException e){
//初始化错误时,通过抛出异常ExceptionInInitializerError通知调用者
throw new ExceptionInInitializerError(e);
}
}
/**
* 执行SELECT查询SQL
* @param func 要执行查询语句的代码块
* @return 查询结果
*/
public static Object executeQuery(Function<SqlSession,Object> func){
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
Object obj = func.apply(sqlSession);
return obj;
}finally {
sqlSession.close();
}
}
/**
* 执行INSERT/UPDATE/DELETE写操作SQL
* @param func 要执行的写操作代码块
* @return 写操作后返回的结果
*/
public static Object executeUpdate(Function<SqlSession,Object> func){
//openSession(false)中false为修改提交方式为自动提交
SqlSession sqlSession = sqlSessionFactory.openSession(false);
try {
Object obj = func.apply(sqlSession);
sqlSession.commit();
return obj;
}catch (RuntimeException e){
sqlSession.rollback();
throw e;
}finally{
sqlSession.close();
}
}
}
MyBatis整合Druid连接池
在com.ql.oa.datasource目录下创建DruidDataSourceFactory工厂类
public class DruidDataSourceFactory extends UnpooledDataSourceFactory {
public DruidDataSourceFactory(){
this.dataSource = new DruidDataSource();
}
@Override
public DataSource getDataSource() {
try{
((DruidDataSource)this.dataSource).init();//初始化Druid数据源
}catch(SQLException e){
throw new RuntimeException(e);
}
return this.dataSource;
}
}
mybatis-config.xml中配置数据源
<environments default="dev">
<!--开发环境配置-->
<environment id="dev">
<!--事务管理器采用JDBC方式-->
<transactionManager type="JDBC"></transactionManager>
<!--利用Mybatis自带连接池管理连接-->
<!--<dataSource type="POOLED">-->
<!--MyBatis与Druid的整合-->
<dataSource type="com.ql.oa.datasource.DruidDataSourceFactory">
<!--JDBC连接属性-->
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ql-oa?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<!--连接池初始连接数-->
<property name="initialSize" value="10"/>
<!--连接池最大连接数-->
<property name="maxActive" value="20"/>
</dataSource>
</environment>
</environments>
测试过程中可以在Navicat中依次点 工具 -> 服务器监控 -> MySQL 查看连接数量。
整合Freemarker
首先在pom.xml文件中添加依赖
<!--Freemarker依赖-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.29</version>
</dependency>
<!--servlet-api-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!--依赖只参与编译测试,不进行发布-->
<scope>provided</scope>
</dependency>
打开web.xml配置Freemarker
<servlet>
<!--FreemakrerServlet用于读取解析ftl文件-->
<servlet-name>freemakrer</servlet-name>
<servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
<!-- 定义模板的存储路径 -->
<init-param>
<param-name>TemplatePath</param-name>
<param-value>/WEB-INF/ftl</param-value>
</init-param>
<init-param>
<!--default_encoding用于设置读取ftl文件时采用的字符集,进而避免中文乱码的产生-->
<param-name>default_encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>freemakrer</servlet-name>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping>
添加Logback日志组件配置
在src/main/resources目录下添加logback.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!--
日志输出级别(优先级高到低):
error: 错误 - 系统的故障日志
warn: 警告 - 存在风险或使用不当的日志
info: 一般性消息
debug: 程序内部用于调试信息
trace: 程序运行的跟踪信息
-->
<root level="debug">
<appender-ref ref="console"/>
</root>
</configuration>