什麼是tk-mybatis
通用 Mapper4(tk-mybatis) 是一個可以實現任意 MyBatis 通用方法的框架,項目提供了常規的增刪改查操作以及Example 相關的單表操作。通用 Mapper 是爲了解決 MyBatis 使用中 90% 的基本操作,使用它可以很方便的進行開發,可以節省開發人員大量的時間。
項目WiKi地址:https://gitee.com/free/Mapper/wikis/Home
如何在Maven項目中使用tk-mybatis
第一步,添加依賴
首先創建一個Maven項目,然後在pom.xml
文件中加入以下依賴項:
- 添加mybatis3.x依賴和tk-mybatis4.x依賴以及mysql數據庫連接驅動
<!-- 添加tk-mybatis數據庫工具 -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/tk.mybatis/mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.1.5</version>
</dependency>
<!-- mysql數據庫連接驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
- 添加dbcp數據庫連接池(後面創建數據源會用到)
<!--注意:在linux環境下,commons-logging1.2好像無法找到裏面的/LogFactory,但commons-logging1.1.3可以-->
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.5.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
- 添加log4j2日誌工具(也可使用其他日誌框架,不強求)
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.1</version>
</dependency>
第二步,創建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>
<!-- 引入外部資源文件 -->
<!--<properties resource="jdbc.properties"/>-->
<settings>
<!-- log4j.properties的配置,用於打印SQL語句及結果到控制檯,便於調試 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<setting name="callSettersOnNulls" value="true"/>
<!--將數據庫字段字段映射成java對象的駝峯命名-->
<setting name= "mapUnderscoreToCamelCase" value="true" />
</settings>
<typeAliases>
</typeAliases>
<!-- 配置環境:可以配置多個環境,default:配置某一個環境的唯一標識,表示默認使用哪個環境 -->
<environments default="phm">
<environment id="phm">
<transactionManager type="JDBC"/>
<dataSource type="com.yj.config.DBCPDataSourceFactory">
<!-- 配置連接信息 -->
<!--<property name="driver" value="${jdbc.driverClass}"/>-->
<!--<property name="url" value="${jdbc.connectionURL}"/>-->
<!--<property name="username" value="${jdbc.username}"/>-->
<!--<property name="password" value="${jdbc.password}"/>-->
</dataSource>
</environment>
</environments>
<!-- 映射map -->
<mappers>
<!--mapper的方式是配置mapper.xml文件-->
<mapper resource="mapper/DeviceInfoMapper.xml"/>
<!--package是執行mapper接口的包的路徑-->
<!--<package name="com.mlamp.htcrrc.mapper"/>-->
</mappers>
</configuration>
mybatis-config.xml
文件是mybatis的核心配置文件,它用來設置mybatis的日誌輸出、數據源信息、實體類別名、數據表映射文件的位置等,這些設置項都是初始化mybatis的必備條件。
- 創建
DBCPDataSourceFactory
類,加載dbcp連接池:
public class DBCPDataSourceFactory extends UnpooledDataSourceFactory {
public DBCPDataSourceFactory() {
try {
InputStreamReader isr = new InputStreamReader(DBCPDataSourceFactory.class.getResourceAsStream("/jdbc.properties"), "UTF-8");
Properties prop = new Properties();
prop.load(new BufferedReader(isr));
this.dataSource = BasicDataSourceFactory.createDataSource(prop);
LOGINFO.info("初始化數據庫連接池成功");
} catch (Exception e) {
e.printStackTrace();
LOGERROR.error(e.getLocalizedMessage());
LOGINFO.info(e.getLocalizedMessage());
//如果這裏連不上數據庫就退出程序
System.exit(0);
}
}
這個類,就是上面mybatis-config.xml
配置文件中datasource標籤使用的數據庫連接池創建類。
- 在
src/main/resources
路徑下創建jdbc.properties
文件,用來配置數據庫連接的相關信息:
#數據庫的連接參數
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/demo?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
username=root
password=123456
#初始資源
initialSize=5
#活動資源
maxActive=10
#最大空閒資源
maxIdle=6
#最小空閒資源
minIdle=2
#從數據庫連接池獲得一個連接時,最大的等待時間,單位爲毫秒
maxWait=60000
characterEncoding=UTF-8
#自動提交事務,這個必須設置,否則setAutoCommit無效
defaultAutoCommit=true
#設定數據庫連接池可回收利用
#標記是否刪除超過removeAbandonedTimout所指定時間的被遺棄的連接
removeAbandoned=true
#一個被拋棄連接可以被移除的超時時間,單位爲秒
removeAbandonedTimeout=120
#標誌是否爲應用程序中遺棄語句或連接的代碼開啓日誌堆棧追蹤
logAbandoned=true
#對connection進行有效性檢測
testOnBorrow=true
#測試連接可用性
validationQuery=select 1
第三步,初始化mybatis,集成tk-mybatis
- 使用
MybatisConfig
類初始化mybatis,加載mybatis-config.xml
配置文件:
/**
* Mybati配置類,獲取sqlSessionFactory
*/
public class MybatisConfig {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
sqlSessionFactory應該使用單例模式,作用域爲應用區域,即在整個程序運行期間,它都應該存在,且只存在一個。
- 創建
SqlSessionUtil
類,用於創建SqlSession
,並集成tk-mybatis
:
public class SqlSessionUtil {
public static SqlSession openSqlSession() {
//從剛剛創建的 sqlSessionFactory 中獲取 session
SqlSession sqlSession = MybatisConfig.getSqlSessionFactory().openSession();
//創建一個MapperHelper
MapperHelper mapperHelper = new MapperHelper();
//特殊配置
Config config = new Config();
//主鍵自增回寫方法,默認值MYSQL,詳細說明請看文檔
config.setIDENTITY("MYSQL");
//支持getter和setter方法上的註解
config.setEnableMethodAnnotation(true);
//設置 insert 和 update 中,是否判斷字符串類型!=''
config.setNotEmpty(true);
//校驗Example中的類型和最終調用時Mapper的泛型是否一致
config.setCheckExampleEntityClass(true);
//啓用簡單類型
config.setUseSimpleType(true);
//枚舉按簡單類型處理
config.setEnumAsSimpleType(true);
//自動處理關鍵字 - mysql
config.setWrapKeyword("`{0}`");
//設置配置
mapperHelper.setConfig(config);
//註冊通用接口,和其他集成方式中的 mappers 參數作用相同
//4.0 之後的版本,如果類似 Mapper.class 這樣的基礎接口帶有 @RegisterMapper 註解,就不必在這裏註冊
mapperHelper.registerMapper(MyMapper.class);
//配置 mapperHelper 後,執行下面的操作
mapperHelper.processConfiguration(sqlSession.getConfiguration());
return sqlSession;
}
public static void closeSqlSession(SqlSession sqlSession){
sqlSession.commit();
sqlSession.close();
sqlSession=null;
}
- 在
src/main/java
路徑下加入packagetk.mybatis.mapper
,並在該包下創建MyMapper
類:
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
}
第四步,開始使用tk-mybatis操作數據庫
以下是使用通用Mapper(tk-mybatis)查詢數據的推薦寫法:
public class DeviceInfoDao {
public List<DeviceInfo> getAllDeviceInfoList(){
List<DeviceInfo> list=null;
try {
SqlSession sqlSession=SqlSessionUtil.openSqlSession();
DeviceInfoMapper mapper=sqlSession.getMapper(DeviceInfoMapper.class);
list=mapper.selectAll();
SqlSessionUtil.closeSqlSession(sqlSession);
}catch (Exception e){
LOGINFO.error("查詢錯誤:",e);
LOGERROR.error("查詢錯誤:",e);
}
return list;
}
}
注意,從openSqlSession
那一行到closeSqlSession
結束,應該放入try-catch
語句中,並且每次使用mapper操作數據庫時,都應該是先openSqlSession
,再closeSqlSession
。重要!使用完後,一定要調用closeSqlSession
。
使用mybatis代碼自動生成插件,生成實體類、mapper接口、映射文件
第一步,在pom.xml文件中加入mybatis-generator插件
<properties>
<mysql.version>5.1.44</mysql.version>
<tk-mybatis-mapper.version>4.1.5</tk-mybatis-mapper.version>
<!-- Maven Settings -->
<mybatis-generator-maven-plugin.version>1.3.7</mybatis-generator-maven-plugin.version>
</properties>
<build>
<plugins>
<!--mybatis代碼自動生成插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>${mybatis-generator-maven-plugin.version}</version>
<configuration>
<!--配置文件的位置-->
<configurationFile>
${basedir}/src/main/resources/generator/generatorConfig.xml
</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>${tk-mybatis-mapper.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
</build>
第二步,創建generatorConfig.xml配置文件
- 在
src/main/resources
下創建generator文件夾,在generator下創建generatorConfig.xml
,內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 引入數據庫連接配置 -->
<properties resource="generator/jdbc.properties"/>
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 自帶插件,實體類序列化 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
<!-- 配置 tk.mybatis 插件 -->
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="tk.mybatis.mapper.MyMapper"/>
<property name="caseSensitive" value="true"/>
<!--<property name="lombok" value="Data"/>-->
<!--<property name="swagger" value="true"/>-->
</plugin>
<!-- 配置數據庫連接 -->
<jdbcConnection driverClass="${jdbc.driverClass}"
connectionURL="${jdbc.connectionURL}"
userId="${jdbc.username}"
password="${jdbc.password}">
<!--解決mysql驅動升級到8.0後不生成指定數據庫代碼的問題-->
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>
<!-- 配置實體類存放路徑 -->
<javaModelGenerator targetPackage="com.yj.bean" targetProject="src/main/java"/>
<!-- 配置 XML 存放路徑 -->
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/>
<!-- 配置 DAO 存放路徑 -->
<javaClientGenerator targetPackage="com.yj.dao.mapper"
targetProject="src/main/java"
type="XMLMAPPER"/>
<!-- 配置需要指定生成的數據表,% 代表所有表 -->
<table tableName="%">
<!-- mysql 配置 -->
<generatedKey column="id" sqlStatement="Mysql" identity="true"/>
</table>
</context>
</generatorConfiguration>
- 創建
jdbc.properties
數據庫連接配置文件:
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://localhost:3306/demo?nullCatalogMeansCurrent=true
jdbc.username=root
jdbc.password=123456
第三步,使用mybatis-generator插件生成代碼
在idea的maven project面板中,找到mybatis-generator
插件,點擊mybatis-generator:generate
即可自動生成實體類、dao層的mapper接口、數據表映射文件,如下圖所示: