Mybatis 是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。在Java或者Java Web項目中,添加Mybatis必須的核心包,就能對數據表進行增刪改查操作了。下面以MySQL數據庫oa中的數據表userinfo為例,使用Mybatis實現數據的增刪改查。
准備工作
為了方便,我是用IDEA+Maven來解決項目的包管理工作,IDEA配置Maven的方法,參考鏈接,本Demo使用的開發版本如下:
- IDE:IntelliJ IDEA 2019.3.1 x64
- Maven: apache-maven-3.3.9
1、新建項目
File->new->project,選擇左側的maven,設置項目的project SDk:jdk 1.8,勾選Create from archetype,在列表中勾選maven-archetype-quickstart
然后,填寫項目名mybatisDemo,項目位置,配置Maven(此處的User settings file 和 local repository均勾選Override),finish創建項目,初始化目錄結構如下圖a,完整運行的項目目錄結構如下圖b:
2、編寫項目代碼
編寫配置文件pom.xml
,添加依賴項如下,然后IDE出現提示信息,選擇 reimport changes即可,隨后Maven開始下載需要的包到本項目中。
本項目使用的jdbc驅動版本為5.1.18,使用較新的版本,需要注意后面mysql.properties配置文件的編寫,兩者有區別。
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
編寫實體類 UserInfo.java
,同時在MySQL數據庫中創建對應的數據表userinfo,如上圖c
package org.example;
import java.io.Serializable;
public class UserInfo implements Serializable {
private int id;
private String username;
private String password;
public UserInfo(){}
public UserInfo(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "UserInfo{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
在src/main目錄下創建java的同級文件夾resource,並右鍵 Mark Directory as -> Sources Root,在resource下新建mapper包,新建SQL映射的UserInfo.xml文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace設置格式:包名+SQL映射文件名-->
<mapper namespace="com.mybatis.mapper.UserInfoMapper">
<!--根據用戶ID查詢用戶信息-->
<select id="findUserInfoById" parameterType="int" resultType="UserInfo">
select * from userinfo where id = #{id}
</select>
<!--根據用戶名模糊查詢用戶-->
<select id="findUserInfoByUserName" parameterType="String" resultType="UserInfo">
select * from userinfo where username like CONCAT(CONCAT('%',#{username}),'%')
</select>
<!--添加用戶-->
<insert id="addUserInfo" parameterType="UserInfo">
insert into userinfo(id,username,password) values(#{id},#{username},#{password})
</insert>
<!--修改用戶信息-->
<update id="updateUserInfo" parameterType="UserInfo">
update userinfo set password = #{password} where id = #{id}
</update>
<!--刪除用戶信息-->
<delete id="deleteUserInfo" parameterType="int">
delete from userinfo where id = #{id}
</delete>
</mapper>
在resource文件夾下,新建兩個屬性文件:mysql.properties
、log4j.properties
,用於配置MySQL和log4j
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/oa
username=root
password=8636hyh
### 設置Logger輸出級別和輸出目的地 ###
log4j.rootLogger=debug,stdout,logfile
### 把日志信息輸出到控制台 ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
### 把日志信息輸出到文件:jbit.log ###
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=jbit.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %F %p %m%n
### 顯示SQL語句部分
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
最后,添加mybatis的核心配置文件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="mysql.properties"></properties>
<!--給包中的類注冊別名-->
<typeAliases>
<typeAlias type="org.example.UserInfo" alias="UserInfo"/>
</typeAliases>
<!--配置環境-->
<environments default="development">
<!--配置一個id為development的環境-->
<environment id="development">
<!--使用JDBC事務-->
<transactionManager type="JDBC"></transactionManager>
<!--數據庫連接池-->
<!-- mybatis提供了3種數據源類型,分別是:POOLED,UNPOOLED,JNDI -->
<!-- POOLED 表示支持JDBC數據源連接池 -->
<!-- UNPOOLED 表示不支持數據源連接池 -->
<!-- JNDI 表示支持外部數據源連接池 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--引用映射文件-->
<mappers>
<mapper resource="mapper/UserInfo.xml"/>
</mappers>
<!-- Continue going here -->
</configuration>
3、編寫測試文件
編寫測試類AppTest.java
,使用單元測試來逐項檢查“增刪改查”功能,只需要在各方法名上右鍵運行,即可進行測試;
其中注解的含義:在測試類中,每一個用@Test注解修飾的方法稱為測試方法,它們的調用順序為@Before->@Test->@After。因此,每次執行一個單元測試方法,都會先運行init()方法初始化,建立數據庫會話,然后運行測試函數,最后調用destroy()釋放資源。
package org.example;
import static org.junit.Assert.assertTrue;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLOutput;
import java.util.List;
/**
* Unit test for simple App.
*/
public class AppTest {
/**
* Rigorous Test :-)
*/
private SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession;
@Before
public void init() {
//讀取mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream;
try {
//得到配置文件流
inputStream = Resources.getResourceAsStream(resource);
//根據配置文件信息,創建會話工廠
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通過工廠得到Sqlsession
sqlSession = sqlSessionFactory.openSession();
} catch (IOException e) {
e.printStackTrace();
}
}
//根據id查詢用戶
@Test
public void testFindUserInfoById() {
//通過sqlSession執行映射文件中定義的SQL,並返回映射結果
UserInfo ui = sqlSession.selectOne("findUserInfoById", 101);
//打印輸出結果
System.out.println(ui.toString());
}
//根據用戶名模糊查詢用戶
@Test
public void testFindUserInfoByUserName() {
//執行映射文件中定義的SQL,並返回結果集
List<UserInfo> uis = sqlSession.selectList("findUserInfoByUserName", "ang");
for (UserInfo ui : uis) {
System.out.println(ui);
}
}
//添加用戶
@Test
public void testAddUserInfo() {
//創建UserInfo對象ui
UserInfo ui = new UserInfo(104, "xia", "12334");
int res = sqlSession.insert("addUserInfo", ui);
if (res > 0) {
System.out.println("insert successfully!");
} else {
System.out.println("insert failed!");
}
}
//修改用戶
@Test
public void testUpdateUserInfo(){
//加載編號為103的用戶
UserInfo ui = sqlSession.selectOne("findUserInfoById",103);
ui.setPassword("13345");
int res = sqlSession.update("updateUserInfo",ui);
if(res > 0){
System.out.println("update successfully!");
}else{
System.out.println("update failed!");
}
}
@Test
public void testDeleteUserInfo(){
//執行sqlSession的delete方法,返回結果受影響的行數
int res = sqlSession.delete("deleteUserInfo",102);
if(res > 0){
System.out.println("delete successfully!");
}else{
System.out.println("delete failed!");
}
}
@After
public void destroy() {
//提交事務
sqlSession.commit();
//關閉sqlSession
sqlSession.close();
}
}
4、控制台輸出驗證
使用用戶名模糊查詢用戶的結果,結果正確。