MyBatis——MyBatis開發流程
- 2020 年 11 月 17 日
- 筆記
- Java SSM框架
創建項目(IDEA中)
在IDEA中創建 MyBatis項目,詳細流程如下:
這裡有一點需要注意,我們創建的是Maven項目,如果大家以前沒有配置過Maven環境的話,在創建完項目之後,需要配置一下Maven環境,否則就無法成功導入相關的依賴包。
創建完成後的項目是這個樣子的:
項目概述:
★ src目錄就是我們項目的開發目錄,裡面有兩個目錄:main和test。
➷ main目錄是我們開發項目的目錄,裡面是項目的幾乎所有資訊,包括Java的類文件、一些properties配置文件和MyBatis配置文件等。
✈ main目錄下有兩個文件夾:Java和resources,顧名思義,Java目錄下肯定就是Java類文件了;resources目錄下放的的是配置文件。
➷ test目錄是我們項目開發的測試目錄,我們在這個目錄下來寫我們的測試類,來測試我們所寫的功能是否能夠正常運作。
✄ 還有一個pom.xml文件,這個文件是我們所創建的Maven項目的依賴導入配置文件,我們在這個配置文件中寫上項目所需要依賴的包的相關資訊,Maven會替我們自動導入項目,不用我們主動下載並添加依賴包,這樣能極大的減輕我們的工作量。
其他文件我們不用過多關注,都是一些項目配置資訊,一般很少用到。
導入依賴(配置pom文件)
我們需要導入的項目依賴主要由以下幾個:
① MyBatis核心依賴
② MySql驅動依賴
③ 日誌依賴:Log4J
④ 測試依賴:junit
⑤ 連接池依賴
這些都是項目基礎的依賴配置,後面根據項目需求可添加其他的依賴項,比如:分頁組件依賴等。
我們是在pom.xml文件中配置的,在pom.xml文件中的project標籤中加入下面的資訊:
<!-- 導入依賴 -->
<dependencies>
<!--MyBatis核心依賴-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--MySql驅動依賴-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.25</version>
</dependency>
<!-- 日誌依賴:Log4J -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- //mvnrepository.com/artifact/junit/junit -->
<!-- 測試依賴:junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- //mvnrepository.com/artifact/com.alibaba/druid -->
<!-- 連接池依賴:阿里的druid(可選其他,目前這個是比較好的) -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
</dependencies>
我這裡選用的連接池是阿里的druid連接池,目前來說應該是比較好的連接池了,大家可根據自己的需求自行調整,更換其他的連接池。
依賴的版本之間可能存在衝突現象,大家可選擇普遍都用的版本,可參考Maven存儲庫。
創建並編寫MyBatis配置文件(mybatis-config.xml)
在resources目錄下創建『mybatis-config.xml』配置文件,這個文件就是我們MyBatis項目的配置文件,之後我們也要通過它來創建SqlSessionFactory對象,因一步來創建SqlSession對象。
『mybatis-config.xml』初始模板:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"//mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--配置標籤的順序:(properties?, settings?, typeAliases?,
typeHandlers?, objectFactory?, objectWrapperFactory?,
reflectorFactory?, plugins?, environments?,
databaseIdProvider?, mappers?)-->
</configuration>
我們是在configuration標籤中添加我們的配置項的,配置項是有順序的,必須依照官方給的順序從上往下依次放置,否則會導致一些問題,比如配置失效等。
資料庫配置資訊(jdbc.properties)
MyBatis要和資料庫打交道,那肯定需要連接資料庫了,所以,我們現在要配置的就是資料庫資訊。
首先,在resources目錄下創建『jdbc.properties』配置文件,這個是資料庫配置文件,在裡面添加如下資訊:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/{資料庫名}?useUnicode=true&characterEncoding=utf-8
jdbc.username={用戶名}
jdbc.password={密碼}
大家根據自己的資訊,替換配置中的{XXX}。上面這個是MySQL的連接配置,如果大家連接的是其他資料庫的話,可更該此配置中的資訊。
然後,我們需要『mybatis-config.xml』的configuration標籤中配置相關資訊:
<configuration>
<!-- 導入外部的參數 -->
<properties resource="jdbc.properties"></properties>
<!--核心配置資訊-->
<environments default="ss_config">
<!--資料庫相關配置-->
<environment id="ss_config">
<!--事務控制類型-->
<transactionManager type="jdbc"></transactionManager>
<!--資料庫連接配置-->
<dataSource type="org.apache.ibatis.datasource.pooled.PooledDataSourceFactory">
<property name="driver" value="${jdbc.driver}"/>
<!-- &轉義& -->
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
</configuration>
我們導入了jdbc的配置文件,然後在environments標籤項中配置相關資訊,default屬性和id屬性可根據自己意願填寫(其實就是個名字而已),我們在這選用的是MyBatis默認的連接池,dataSource 標籤的type屬性就是,之後我們可選擇更改性能更好的連接池。
其他的配置資訊應和上述配置一致。
日誌配置資訊(log4j.properties)
我們之前已經導入了Log4j日誌框架的依賴,這個日誌框架可以幫我們輸出日誌資訊,以便我們更好的調試可開發項目。我們還需要做的是編寫一個日誌配置文件,填寫相關配置資訊。
在resources目錄下創建『log4j.properties』配置文件,注意名稱是全小寫的,在其內添加如下資訊:
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
好了,日誌配置已完成,MyBatis會自動檢索配置資訊。
創建表(資料庫表)
在剛才『jdbc.properties』配置文件中所填的資料庫中創建數據表,我們在這以users表為例:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`password` varchar(50) DEFAULT '12345',
`sex` varchar(1) DEFAULT NULL,
`birthday` datetime DEFAULT NULL,
`registtime` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
)DEFAULT CHARSET=utf8;
創建成功後,在表中添加一些資訊,如:
創建實體映射(entity實體)
好了,我們需要創建一個實體,來對應資料庫中的表中的數據項。
在java目錄下創建com.entity實體類包,在包中創建User實體類:
User實體類的屬性要和數據表的欄位對應,類型和名字要相同,最好使用駝峰命名法,因為當MyBatis從資料庫中得到數據後時進行set注入的,就是調用對應屬性名字的set方法進行賦值,如果屬性名字不一致,MyBatis就無法找到其set方法,其值會為默認值。
當名字不一致時我們的解決方法是:Sql語句加別名 或者 添加關係映射(推薦使用)。
例如下面的User實體的最後一個屬性名就和數據表的最後一個欄位名不一致,我們在後面會進行處理。
User實體類如下:
package com.entity;
import java.util.Date;
public class User {
private Integer id;
private String name;
private String password;
private String sex;
private Date birthday;
private Date registTime;
public User() {}
public User(Integer id, String name, String password, String sex, Date birthday, Date registTime) {
this.id = id;
this.name = name;
this.password = password;
this.sex = sex;
this.birthday = birthday;
this.registTime = registTime;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", sex='" + sex + '\'' +
", birthday=" + birthday +
", registTime=" + registTime +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Date getRegistTime() {
return registTime;
}
public void setRegistTime(Date registTime) {
this.registTime = registTime;
}
}
定義別名
我們還需要在MyBatis配置文件『mybatis-config.xml』中為我們的實體類定義別名,這樣我們就不用總帶著包名一起來書寫了,可以提高我們的書寫效率。
定義別名有兩種方式,一般我們選擇第二種:
<!-- 實體類別名 --> <typeAliases> <!-- 方式一:單獨定義--> <!--<typeAlias type="com.entity.User" alias="user_shine"/>--> <!-- 方式二:定義實體類所在的package,每個實體類都會自動註冊一個別名=類名 --> <package name="com.entity"/> </typeAliases>
在『mybatis-config.xml』的configuration標籤內的properties標籤後面添加上述配置資訊。
創建Dao層
接下來我們要編寫數據訪問層了,也就是DAO層。
在java目錄下創建一個包:com.Dao。
創建xxDao介面文件
在剛才所創建的包內創建User實體類所對應的Dao介面文件:UserDao.java。
在這個介面文件中,定義我們要對數據進行的操作方法,如:
package com.Dao;
import com.entity.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserDao {
// 查詢全部
public List<User> queryAll();
// 通過id查詢
public User selectUserById(@Param("id") Integer id);
// 模糊查詢
public List<User> selectUserByKeyword(@Param("keyword") String keyword);
// 插入
public Integer insertUser(User user);
// 刪除
public Integer deleteUser(@Param("id") Integer id);
// 修改
public Integer updateUser(User user);
}
在上面的方法中涉及到參數的傳遞,也就是參數綁定方式,常見的參數綁定方式有:
➷ 序號參數綁定
➷ 註解參數綁定(推薦)
➷ Map參數綁定
➷ 對象參數綁定
我們上面所用的就是註解參數綁定,因為篇幅考慮,就不做過多闡述了。
創建xxDaoMapper.xml配置文件
創建了上面的這些方法,如何去實現它們呢?
這就要靠我們的Mapper配置文件了,一個Dao介面文件對應一個Mapper配置文件。MyBatis替我們封裝了數據訪問的其他操作,我們只需要關注Sql語句本身就可以了,而Sql語句寫在哪呢?就是Mappe配置文件中。
在com.Dao包中創建Mapper配置:UserDaoMapper.xml。
配置xxDaoMapper.xml
下面是Mapper文件的初始模板:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"//mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.UserDao">
</mapper>
mapper標籤中的namespace屬性是我們這個Mapper文件所對應的Dao介面文件,mapper標籤中書寫Dao介面中每個方法所對應的Sql語句。
上面的Dao介面所對應的完整Mapper配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"//mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.Dao.UserDao">
<resultMap id="UserResultMap" type="com.entity.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="password" column="password"/>
<result property="sex" column="sex"/>
<result property="birthday" column="birthday" />
<result property="registTime" column="registtime" />
</resultMap>
<sql id="user_field">
select id, name, password,sex,birthday,registtime
from s_user where
</sql>
<select id="queryAll" resultType="User">
select * from s_user
</select>
<select id="selectUserById" resultMap="UserResultMap">
<include refid="user_field"/>
id = #{id}
</select>
<select id="selectUserByKeyword" resultMap="UserResultMap">
<include refid="user_field"/>
name like concat('%',#{keyword},'%')
</select>
<insert id="insertUser" parameterType="User">
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
insert into s_user
values(#{id},#{name},#{password},#{sex},#{birthday},#{registTime})
</insert>
<delete id="deleteUser" parameterType="int">
delete from s_user
where id=#{id}
</delete>
<update id="updateUser" parameterType="User">
update s_user set name=#{name},password=#{password},sex=#{sex},birthday=#{birthday},
registtime=#{registTime} where id=#{id}
</update>
</mapper>
resultMap 標籤就是我們上面提到的屬性關係映射,來解決欄位名不一致的問題,當我們需要用的時候,將select標籤的resultType屬性改為resultMap就可以了。
每種操作有對應的標籤,id就是其方法名,後面是傳遞的值類型。
註冊Mapper
寫完Mapper後,是需要註冊的,在『mybatis-config.xml』的configuration標籤內添加如下資訊:
<!-- 註冊mapper文件 -->
<mappers>
<mapper resource="com/Dao/UserDaoMapper.xml"/>
</mappers>
註冊成功後,MyBatis才會去尋找這個配置文件。
配置編譯路徑
此時這個配置文件,MyBatis是找不到的,為什麼呢?因為MyBatis只會自動查找resources目錄下的配置文件,而我們的Mapper配置文件並不在resources目錄下。那如何解決呢?
我們需要在pom.xml文件的project標籤中添加如下資訊:
<build>
<!-- 更改maven編譯規則 -->
<resources>
<resource>
<!-- 資源目錄 -->
<directory>src/main/java</directory>
<includes>
<include>*.xml</include><!-- 默認(新添加自定義則失效) -->
<include>**/*.xml</include><!-- 新添加 */代表1級目錄 **/代表多級目錄 -->
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
自此,Mapper配置才會生效。
編寫工具類
MyBatis的核心是SqlSessionFactoryBuider、SqlSessionFactory和SqlSession對象,三者依次為創建關係,最終我們要得到的是SqlSession對象,通過SqlSession對象來進項數據的訪問,但每次訪問時都需要編寫創建SqlSession對象的這一系列過程,完成後又要反向依次關閉,使得程式碼有很多的重複。
因此,我們可以編寫一個工具類,幫我們同一來完成這些操作,每次訪問數據時調用工具類來獲取SqlSession對象,完成後用工具類統一來關閉對象。
在java目錄下創建一個工具包:com.Utils。
在包中創建工具類:MyBatisUtils.java。
MyBatisUtils.java 詳細資訊如下:
package com.Utils;
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 java.io.IOException;
import java.io.InputStream;
/**
* 1. 載入配置
* 2. 創建SqlSessionFactory
* 3. 創建Session
* 4. 事務管理
* 5. Mapper獲取
*/
public class MyBatisUtils {
// 獲取SqlSessionFactory
private static SqlSessionFactory factory;
//創建ThreadLocal綁定當前執行緒中的SqlSession對象
private static final ThreadLocal<SqlSession> t1 = new ThreadLocal<SqlSession>();
//載入配置資訊,並構建session工廠
static{
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
factory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
// 獲取連接(從 t1 中獲取當前執行緒SqlSession)
private static SqlSession openSession(){
SqlSession session = t1.get();
if (session == null){
session = factory.openSession();
t1.set(session);
}
return session;
}
// 獲取連接(新創建的)
public static SqlSession getSession(){
return factory.openSession();
}
// 釋放連接(釋放當前執行緒中的SqlSession)
public static void closeSession(){
SqlSession sqlSession = t1.get();
sqlSession.close();
}
// 提交事務(提交當前執行緒中的SqlSession所管理的事務)
public static void commit(){
SqlSession sqlSession = openSession();
sqlSession.commit();
closeSession();
}
// 回滾事務(回滾當前執行緒中SqlSession所管理的事務)
public static void rollback(){
SqlSession sqlSession = openSession();
sqlSession.rollback();
closeSession();
}
// 獲取介面實現類對象
public static <T> T getMapper(Class<T> mapper){
SqlSession sqlSession = openSession();
return sqlSession.getMapper(mapper);
}
}
編寫測試類
在test目錄下的java目錄下創建測試類包:com.Test,並創建測試類test.java。
編寫測試類:
package com.Test;
import com.Utils.MyBatisUtils;
import com.Dao.UserDao;
import com.entity.User;
import org.junit.Before;
import java.util.Date;
import java.util.List;
public class Test {
UserDao userDao;
@Before
public void init(){
userDao = MyBatisUtils.getMapper(UserDao.class);
}
// 測試查詢全部
@org.junit.Test
public void TestQueryAll(){
List<User> users = userDao.queryAll();
for (User user : users) {
System.out.println(user);
}
}
// 測試通過id查詢
@org.junit.Test
public void TestselectUserById(){
User user = userDao.selectUserById(2);
System.out.println(user);
}
// 測試模糊查詢
@org.junit.Test
public void TestselectUserByKeyword(){
List<User> users = userDao.selectUserByKeyword("明");
for (User user : users) {
System.out.println(user);
}
}
// 測試插入
@org.junit.Test
public void TestinsertUser(){
User user = new User(null, "辰東", "123472", "男", new Date(), new Date());
userDao.insertUser(user);
MyBatisUtils.commit();
System.out.println("剛插入的用戶id為:" + user.getId());
}
// 測試刪除
@org.junit.Test
public void TestdeleteUser(){
userDao.deleteUser(15);
MyBatisUtils.commit();
}
// 測試修改
@org.junit.Test
public void TestupdateUser(){
User user = new User(14, "辰南", "888888", "男", new Date(), new Date());
userDao.updateUser(user);
MyBatisUtils.commit();
}
}
運行TestQueryAll方法,結果如下:
一個簡單的MyBatis項目搭建完畢。除了上述的這些點之外,還有許多的知識點,如快取、動態SQL、註解、級聯等等,後面有時間了,我會進一步整理。
感謝大家的耐心閱讀,如有不足,請多多指教!☺