MyBatis狂神總結筆記
簡介
自學的
GitHub原始碼: https://github.com/Donkequan/Mybatis-Study
分享自寫原始碼和筆記
-
jdk13.0.2 (jdk1.7以上均可)
-
Maven 3.6.3
-
MySQL 5.7 (mysql5.6以上均可)
1. 配置
官網文件: https://mybatis.org/mybatis-3/zh/getting-started.html
pom.xml
src/main/resources
src/main/java
package com.hou.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;
//sqlSessionFactory --> sqlSession
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//使用mybatis第一步:獲取sqlSessionFactory物件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//既然有了 SqlSessionFactory,顧名思義,我們可以從中獲得 SqlSession 的例項。SqlSession 提供了在資料庫執行 SQL 命令所需的所有方法。
// 你可以通過 SqlSession 例項來直接執行已對映的 SQL 語句
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
編寫程式碼
-
實體類
src/main/java
package com.hou.pogo;
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
-
Dao介面
package com.hou.dao;
import com.hou.pogo.User;
import java.util.List;
public interface UserDao {
List<User> getUserList();
}
-
介面實現類
測試
注意點:
org.apache.ibatis.binding.BindingException: Type interface com.hou.dao.UserDao is not known to the MapperRegistry.
mybatis-config.xml
在兩個pom.xml中加入
<!--在build中配置resources,來防止我們資源匯出失敗的問題-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
步驟
-
匯入包
-
配置資料庫
-
建造工具類
SqlSessionFactoryBuilder
這個類可以被例項化、使用和丟棄,一旦建立了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 例項的最佳作用域是方法作用域(也就是區域性方法變數)。 你可以重用 SqlSessionFactoryBuilder 來建立多個 SqlSessionFactory 例項,但最好還是不要一直保留著它,以保證所有的 XML 解析資源可以被釋放給更重要的事情。
SqlSessionFactory
SqlSessionFactory 一旦被建立就應該在應用的執行期間一直存在,沒有任何理由丟棄它或重新建立另一個例項。 使用 SqlSessionFactory 的最佳實踐是在應用執行期間不要重複建立多次,多次重建 SqlSessionFactory 被視為一種程式碼“壞習慣”。因此 SqlSessionFactory 的最佳作用域是應用作用域。 有很多方法可以做到,最簡單的就是使用單例模式或者靜態單例模式。
SqlSession
每個執行緒都應該有它自己的 SqlSession 例項。SqlSession 的例項不是執行緒安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。 絕對不能將 SqlSession 例項的引用放在一個類的靜態域,甚至一個類的例項變數也不行。 也絕不能將 SqlSession 例項的引用放在任何型別的託管作用域中,比如 Servlet 框架中的 HttpSession。 如果你現在正在使用一種 Web 框架,考慮將 SqlSession 放在一個和 HTTP 請求相似的作用域中。 換句話說,每次收到 HTTP 請求,就可以開啟一個 SqlSession,返回一個響應後,就關閉它。 這個關閉操作很重要,為了確保每次都能執行關閉操作,你應該把這個關閉操作放到 finally 塊中。 下面的示例就是一個確保 SqlSession 關閉的標準模式
2. 增刪改查
1. namespace
namespace中的包名要和介面一致
2. select
-
id:就是對應的namespace的方法名
-
resultType:sql語句的返回值!
-
parameterType: 引數型別!
-
編寫介面
-
編寫對應的mapper中的對應語句
-
測試
UserMapper
package com.hou.dao;
import com.hou.pogo.User;
import java.util.List;
public interface UserMapper {
//查詢全部使用者
List<User> getUserList();
//根據id查詢使用者
User getUserById(int id);
//插入使用者
void addUser(User user);
//修改使用者
int updateUser(User user);
//刪除使用者
int deleteUser(int id);
}
UserMapper.xml
Test
package com.hou.dao;
import com.hou.pogo.User;
import com.hou.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserDaoTest {