使用MyBatis框架進行持久層開發
- MyBatis是支援普通SQL查詢,儲存過程和高階對映的優秀持久層框架。
- MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及對結果集的檢索。
- MyBatis可以使用簡單的XML或註解用於配置和原始對映,將介面和Java的POJO(Plain Old Java Objects,普通的Java物件)對映成資料庫中的記錄。
你需要了解的知識點
1、什麼是SqlSessionFactory?
SqlSessionFactory
是MyBatis框架中十分重要的物件,它是單個資料庫對映關係經過編譯後的記憶體映象,其主要作用是建立SqlSession。
SqlSessionFactory
物件的例項可以通過SqlSessionFactoryBuilder物件來構建,而SqlSessionFactoryBuilder則可以通過XML配置檔案或一個預先定義好的Configuration例項構建出SqlSessionFactory的例項
SqlSessionFactory物件是執行緒安全的,它一旦被建立,在整個應用執行期間都會存在。如果我們多次的建立同一個資料庫的SqlSessionFactory,那麼此資料庫的資源將很容易被耗盡。為此,通常每一個資料庫都會只對應一個SqlSessionFactory,所以在構建SqlSessionFactory例項時,建議使用單列模式。
2、MyBatis框架的核心配置檔案
在MyBatis框架的核心配置檔案中,
3、mapper對映檔案
在對映檔案中,
使用
1、MyBatis下載
在Java或Java Web專案中新增MyBatis框架後,就能對資料表進行CRUD操作了。
方法一:可以從官方網站: https://github.com/mybatis下載所需要的MyBatis版本。
方法二:使用maven的直接加入依賴,需要MySQL的驅動包、mybatis的驅動包
<!-- 資料庫 start-->
<!-- 引入jdbc與mysql依賴-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<!-- mybatis-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- 資料庫 end-->
注意這裡的mysql的驅動包,根據你自己安裝的mysql版本,使用mysql -V
查詢,例如我的是8版本,所以用8版本的驅動包
2、建立實體類
在src目錄下新建com.lomtom.mybatis.entity
包,並在其中建立實體類UserInfo(對應資料表user_info)。UserInfo類包含一些屬性(對應資料表user_info的部分欄位),以及與之對應的getXXX()和setXXX()方法,還可新增構造方法 。
當然你如果使用lombok可以不寫他的getter、setter以及constructor。
/**
* @Author: LOMTOM
* @Date: 2020/4/20
* @Time: 15:12
* @Email: lomtom@qq.com
*/
@Data
public class UserInfo {
private Integer id;
private String userName;
private String passWord;
private Date regDate;
}
3、建立屬性檔案jdbc.properties
在resources目錄下建立屬性檔案jdbc.properties,儲存資料庫的連線資訊。
<properties>
是一個配置屬性的元素,該元素通常用來將內部的配置外在化,即通過外部的配置來動態的替換內部定義的屬性。例如,資料庫的連線等屬性,就可以通過典型的Java屬性檔案中的配置來替換,
請根據自己mysql版本,確認之後再食用
1、mysql for version 8
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/javaweb2?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456
2、mysql for version 5
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/javaweb2?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456
4、建立XML對映配置檔案
在resources
目錄下建立MyBatis的XML配置檔案mybatis-config.xml
,用於載入mysql的連線配置。
<configuration>
<!--載入屬性檔案-->
<properties resource="jdbc.properties"></properties>
<!--給包中的類註冊別名,註冊後可以直接使用類名,而不用使用全限定的類名就是不用包含包名)。-->
<typeAliases>
<package name="com.lomtom.mybatis"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/lomtom/mybatis/mapper/UserInfoMapper.xml"/>
</mappers>
</configuration>
-
<typeAliases>
元素用於為配置檔案中的Java型別設定一個簡短的名字,即設定別名。別名的設定與XML配置相關,其使用的意義在於減少全限定類名的冗餘。
當POJO類過多時可以指定一個包名,MyBatis 會在包名下面搜尋需要的 Java Bean。每一個在包 中的 Java Bean,在沒有註解的情況下,會使用 Bean 的首字母小寫的非限定類名來作為它的別名。若有註解,則別名為其註解值 -
<environments>
元素用於對環境進行配置。MyBatis的環境配置實際上就是資料來源的配置,我們可以通過<environments>
元素配置多種資料來源,即配置多種資料庫。
5、建立SQL對映的XML檔案
在resources
包中建立SQL對映的XML檔案userInfoMapper.xml。
<mapper namespace="com.lomtom.mybatis.mapper.UserInfoMapper">
<!--資料表 user_info的CRUD操作-->
<insert id="addUserInfo" parameterType="com.lomtom.mybatis.entity.UserInfo">
insert into user_info(userName, passWord, regDate)
values(#{userName},#{passWord}, #{regDate})
</insert>
<delete id="deleteUserInfo" parameterType="int">
delete from user_info where id = #{id}
</delete>
<update id="updateUserInfo" parameterType="com.lomtom.mybatis.entity.UserInfo">
update user_info set userName = #{userName}, passWord = #{passWord}, regDate = #{regDate} where id = #{id}
</update>
<select id="getUserInfoById" parameterType="int" resultType="com.lomtom.mybatis.entity.UserInfo">
select * from user_info where id = #{id}
</select>
<select id="getALLUserInfo" resultType="com.lomtom.mybatis.entity.UserInfo">
select * from user_info
</select>
</mapper>
在上述SQL對映檔案中,
<insert>
元素用於對映插入語句,<delete>
元素用於對映刪除語句,<update>
元素用於對映更新語句,<select>
元素用於對映查詢語句。
在這些元素中,id屬性設定在名稱空間中唯一的識別符號,用於引用這條語句。
- parameterType屬性指定傳入這條語句的引數類的完全限定名或別名。
- resultType屬性指定從這條語句中返回的期望型別的類的完全限定名或別名,若查詢結果是集合,則resultType的值應該是集合所包含的元素型別,而不能是集合本身。
6、建立Mapper介面
在com.lomtom.mybatis.mapper
包中建立UserInfoMapper.java介面,並且加入
- testAddUserInfo()方法
- testGetUserInfoById()方法
- testGetAllUserInfo()方法
- testUpdateUserInfo()方法
- testDeleteUserInfo()方法
/**
* @Author: LOMTOM
* @Date: 2020/4/20
* @Time: 15:24
* @Email: lomtom@qq.com
*/
public interface UserInfoMapper {
/**
* 插入
* @param userInfo
* @return
*/
int addUserInfo(UserInfo userInfo);
/**
* 刪除
* @param id
* @return
*/
int deleteUserInfo(Integer id);
/**
* 獲取
* @param id
* @return
*/
UserInfo getUserInfoById(Integer id);
/**
* 獲取全部
* @return
*/
List<UserInfo> getALLUserInfo();
/**
* 更新
* @param userInfo
* @return
*/
void updateUserInfo(UserInfo userInfo);
}
7、編寫mybatis工具類
/**
* @Author: LOMTOM
* @Date: 2020/4/20
* @Time: 15:49
* @Email: lomtom@qq.com
*/
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;
static {
try {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSession getSession() {
return sqlSessionFactory.openSession();
}
}
8、編寫測試類
首先,需要加入必不可少的依賴
<!-- 測試-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
新建Test.java
/**
* @Author: LOMTOM
* @Date: 2020/4/20
* @Time: 15:44
* @Email: lomtom@qq.com
*/
public class MybatisTest {
@Test
public void testAddUserInfo(){
SqlSession sqlSession= MybatisUtils.getSession();
UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. class);
UserInfo userInfo= new UserInfo();
userInfo.setUserName("qq小冰");
userInfo.setPassWord("123");
userInfo.setRegDate(new Date());
int i= userInfoMapper.addUserInfo(userInfo);
System. out. println (i+ " record has inserted !");
sqlSession.commit();
sqlSession.close();
}
@Test
public void testGetUserInfoById(){
SqlSession sqlSession= MybatisUtils.getSession();
UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. class);
System.out.println(userInfoMapper.getUserInfoById(1));
System. out. println ("record has got !");
sqlSession.commit();
sqlSession.close();
}
@Test
public void testGetAllUserInfo(){
SqlSession sqlSession= MybatisUtils.getSession();
UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. class);
System.out.println(userInfoMapper.getALLUserInfo());
System. out. println ("record has got !");
sqlSession.commit();
sqlSession.close();
}
@Test
public void testUpdateUserInfo(){
SqlSession sqlSession= MybatisUtils.getSession();
UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. class);
UserInfo userInfo= new UserInfo();
userInfo.setId(1);
userInfo.setUserName("qq大冰");
userInfo.setPassWord("123456");
userInfo.setRegDate(new Date());
try {
userInfoMapper.updateUserInfo(userInfo);
System. out. println ("record has updated !");
}catch (Exception e){
e.printStackTrace();
}
sqlSession.commit();
sqlSession.close();
}
@Test
public void testDeleteUserInfo(){
SqlSession sqlSession= MybatisUtils.getSession();
UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. class);
int i= userInfoMapper.deleteUserInfo(1);
System. out. println (i+ " record has deleted !");
sqlSession.commit();
sqlSession.close();
}
}
你可能會出現的問題
問題一:找不到mapper對映檔案
描述:
### The error may exist in com/lomtom/mybatis/mapper/UserInfoMapper.xml
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/lomtom/mybatis/mapper/UserInfoMapper.xml
分析: idea對目錄結構裡的存放的檔案型別有要求,mapper檔案必須放入到resources目錄裡
解決: 在pom.xml中加入資源解析,**/*.xml 代表src/main/java底下全部目錄下的全部xml檔案
<build>
<!-- 解決讀取不到main裡面的xml-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
問題二:mysql客戶端版本過低
描述:
MySQLNonTransientConnectionException: Client does not support authentication protocol requested by server; consider upgrading MySQL client
分析: 這是前面一直強調的mysql驅動包的,一定要根據自己的mysql版本匯入相應的mysql驅動包
解決: 我的是 version 8,而我用的是5的驅動包,更改驅動包後解決
問題三:提示找不到UserInfo
描述:
### The error may exist in com/lomtom/mybatis/mapper/UserInfoMapper.xml
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'com/lomtom/mybatis/mapper/UserInfoMapper.xml'. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'UserInfo'. Cause: java.lang.ClassNotFoundException: Cannot find class: UserInfo
分析: 這是因為找不到UserInfo類導致的,如果parameterType是UserInfo
,原則上使用小寫開頭的就不會報錯,如果報錯的話需要將其路徑寫完整,即包名加類名com.lomtom.mybatis.entity.UserInfo
<insert id="addUserInfo" parameterType="UserInfo">
insert into user_info(userName, passWord, regDate)
values(#{userName},#{passWord}, #{regDate})
</insert>
解決:修改parameterType引數
<insert id="addUserInfo" parameterType="com.lomtom.mybatis.entity.UserInfo">
insert into user_info(userName, passWord, regDate)
values(#{userName},#{passWord}, #{regDate})
</insert>
寫在最後
你的支援是作者最大的動力
關注公眾號:博奧思園 ,精彩內容不錯失