Java之MyBatis入門詳解
一、三層架構(gòu)
Java中的三層架構(gòu)指
1、界面層(User Interface layer;表示層,視圖層):接受用戶的數(shù)據(jù),顯示請(qǐng)求的處理結(jié)果。使用 web 頁(yè)面或者手機(jī) app和 用戶交互
2、業(yè)務(wù)邏輯層(Business Logic Layer):接收表示傳遞過(guò)來(lái)的數(shù)據(jù),檢查數(shù)據(jù),計(jì)算業(yè)務(wù)邏輯,調(diào)用數(shù)據(jù)訪問(wèn)層獲取數(shù)據(jù)
3、數(shù)據(jù)訪問(wèn)層(Data access layer):與數(shù)據(jù)庫(kù)打交道;主要實(shí)現(xiàn)對(duì)數(shù)據(jù)的增、刪、改、查。將存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)提交 給業(yè)務(wù)層,同時(shí)將業(yè)務(wù)層處理的數(shù)據(jù)保存到數(shù)據(jù)庫(kù)
(1)三層對(duì)應(yīng)的包
界面層: controller包 (servlet)
業(yè)務(wù)邏輯層: service 包(XXService類)
數(shù)據(jù)訪問(wèn)層: dao包(XXDao類)
(2)三層中類的交互
用戶使用界面層----> 業(yè)務(wù)邏輯層----->數(shù)據(jù)訪問(wèn)層(持久層)---->數(shù)據(jù)庫(kù)(MySQL,Oracle等)
(3)三層對(duì)應(yīng)的處理框架
界面層---servlet---springmvc(框架)
業(yè)務(wù)邏輯層---service類--spring(框架)
數(shù)據(jù)訪問(wèn)層---dao類--mybatis(框架)
(4)使用三層架構(gòu)有點(diǎn)
【1】結(jié)構(gòu)清晰、耦合度低, 各層分工明確
【2】可維護(hù)性高,可擴(kuò)展性高
【3】有利于標(biāo)準(zhǔn)化
【4】開發(fā)人員可以只關(guān)注整個(gè)結(jié)構(gòu)中的其中某一層的功能實(shí)現(xiàn)
【5】有利于各層邏輯的復(fù)用
(5)缺點(diǎn)
【1】降低了系統(tǒng)的性能。如果不采用分層式結(jié)構(gòu),很多業(yè)務(wù)可以直接造訪數(shù)據(jù)庫(kù),以此獲取相應(yīng)的數(shù)據(jù),三層架構(gòu)必須通過(guò)中間層來(lái)完成
【2】導(dǎo)致級(jí)聯(lián)的修改。如果在表示層中需要增加一個(gè)功能,為保證其設(shè)計(jì)符合分層式結(jié)構(gòu),可能需要在相應(yīng)的業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層中都增加相應(yīng)的代碼
- 框架( Framework )是構(gòu)成一類特定軟件可復(fù)用設(shè)計(jì)的一組相互協(xié)作的類??蚣芤?guī)定了你的應(yīng)用的體系結(jié)構(gòu)。
- 它定義了整體結(jié)構(gòu),類和對(duì)象的分割,各部分的主要責(zé)任,類和對(duì)象怎么協(xié)作,以及控制流程。
- 框架預(yù)定義了這些設(shè)計(jì)參數(shù),以便于應(yīng)用設(shè)計(jì)者或?qū)崿F(xiàn)者能集中精力于應(yīng)用本身的特定細(xì)節(jié)
二、MyBatis
1、官方簡(jiǎn)介
- MyBatis 是一款優(yōu)秀的持久層框架,它支持自定義 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。
- MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。
- MyBatis 可以通過(guò)簡(jiǎn)單的 XML 或注解來(lái)配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對(duì)象)為數(shù)據(jù)庫(kù)中的記錄
java bean,pojo,vo,entity,domain可參考
2、百度基本信息
- MyBatis 本是 apache 的一個(gè)開源項(xiàng)目 iBatis, 2010 年這個(gè)項(xiàng)目由 apache software foundation 遷 移到了 google code,并且改名為 MyBatis 。
- 2013 年 11 月遷移到 Github。 iBATIS 一詞來(lái)源于“internet”和“abatis”的組合,是一個(gè)基于 Java 的持久層框架。
- iBATIS 提供的 持久層框架包括 SQL Maps 和 Data Access Objects(DAOs)
3、JDBC
JDBC代碼如下
- (1)注冊(cè)驅(qū)動(dòng)
- (2)獲取連接
- (3)獲取數(shù)據(jù)庫(kù)操作對(duì)象
- (4)執(zhí)行SQL語(yǔ)句
- (5)處理查詢結(jié)果集
- (6)釋放資源
這些導(dǎo)致
- (1)代碼比較多,開發(fā)效率低
- (2)需要關(guān)注 Connection ,Statement, ResultSet 對(duì)象創(chuàng)建和銷毀
- (3)對(duì) ResultSet 查詢的結(jié)果,需要自己封裝為 List
- (4)重復(fù)的代碼比較多些
- (5)業(yè)務(wù)代碼和數(shù)據(jù)庫(kù)的操作混在一起
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/mydb";
String user = "root";
String pwd = "123456";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
//1、注冊(cè)驅(qū)動(dòng)(連接的數(shù)據(jù)庫(kù))
Class.forName(driver);
//2、獲取連接
conn = DriverManager.getConnection(url,user,pwd);
//3、獲取數(shù)據(jù)庫(kù)操作對(duì)象(專門執(zhí)行sql語(yǔ)句的對(duì)象)
stmt = conn.createStatement();
//4、執(zhí)行SQL語(yǔ)句(DQL DML....)
String sql = "select empno,empname as name,sal from emp2 where empno=7369";
rs = stmt.executeQuery(sql);
//5、處理查詢結(jié)果集(只有當(dāng)?shù)谒牟綀?zhí)行的是select語(yǔ)句的時(shí)候,才有處理查詢結(jié)果集)
while (rs.next()){
/*
(1)下標(biāo)取值;下標(biāo)從 1 開始
*/
String empno = rs.getString(1);
String empname = rs.getString(2);
String sal = rs.getString(3);
System.out.println(empno + " " + empname + " " + sal);
/*
(2)數(shù)據(jù)類型取值
*/
int empno1 = rs.getInt(1);
String empname1 = rs.getString(2);
Double sal1 = rs.getDouble(3);
System.out.println(empno1 + " " + empname1 + " " + sal1);
/*
(3)字段名取值
*/
String empno2 = rs.getString("empno");
//如果執(zhí)行的SQL語(yǔ)句中有別名,需要使用別名字段取值
String empname2 = rs.getString("name");
String sal2 = rs.getString("sal");
System.out.println(empno2 + " " + empname2 + " " + sal2);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
//6、釋放資源;從小到大關(guān)閉
if (rs != null) {
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}MyBatis 是一個(gè)基于 java 的持久層ORM( Object Relational Mapping,對(duì)象關(guān)系映射)框架,內(nèi)部封裝了 jdbc,開發(fā)者只需要關(guān)注 sql 語(yǔ)句 本身,而不需要處理加載驅(qū)動(dòng)、創(chuàng)建連接、創(chuàng)建 statement、關(guān)閉連接,資源等繁雜的過(guò)程。
MyBatis 通過(guò) xml 或注解兩種方式將要執(zhí)行的各種 sql 語(yǔ)句配置起來(lái),并通過(guò) java 對(duì)象和 sql 的 動(dòng)態(tài)參數(shù)進(jìn)行映射生成最終執(zhí)行的 sql 語(yǔ)句,最后由 mybatis 框架執(zhí)行 sql 并將結(jié)果映射為 java 對(duì)象并返回
mybatis是 MyBatis SQL Mapper Framework for Java (sql映射框架)
(1)sql mapper:sql映射
把數(shù)據(jù)庫(kù)表中的一行數(shù)據(jù) 映射為 一個(gè)java對(duì)象
一行數(shù)據(jù)可以看做是一個(gè)java對(duì)象;操作這個(gè)對(duì)象,就相當(dāng)于操作表中的數(shù)據(jù)
(2)Data Access Objects(DAOs):數(shù)據(jù)訪問(wèn) , 對(duì)數(shù)據(jù)庫(kù)執(zhí)行增刪改查
MyBatis框架
【1】提供了創(chuàng)建和銷毀、關(guān)閉Connection ,Statement, ResultSet等對(duì)象能力
【2】提供了執(zhí)行sql語(yǔ)句的能力
【3】提供了循環(huán)sql, 把sql的結(jié)果轉(zhuǎn)為java對(duì)象, List集合的能力
三、MyBatis入門SqlSession
首先以SqlSession的方式使用mybatis框架
首先我們先設(shè)置一下maven的本地倉(cāng)庫(kù)

1、新建一個(gè)數(shù)據(jù)庫(kù),以及一張表user
CREATE TABLE `user` ( `user_id` int(10) NOT NULL COMMENT '用戶名ID', `user_name` varchar(100) DEFAULT NULL COMMENT '用戶名', `email` varchar(80) DEFAULT NULL COMMENT '用戶郵箱', `age` int(5) DEFAULT NULL COMMENT '年齡', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2、創(chuàng)建maven的普通Java工程,加入maven的mybatis坐標(biāo),mysql驅(qū)動(dòng)坐標(biāo)

其中,pom.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>mybatis-1</artifactId>
<version>1.0.0</version>
<properties>
<!-- 項(xiàng)目構(gòu)建使用的編碼,避免中文亂碼 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 源碼編譯 jdk 版本 -->
<maven.compiler.source>1.8</maven.compiler.source>
<!-- 運(yùn)行代碼的 jdk 版本 -->
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- 單元測(cè)試依賴 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--mybatis依賴-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<!--mysql驅(qū)動(dòng)-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目錄-->
<includes><!--包括目錄下的.properties,.xml 文件都會(huì)掃描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!-- filtering 選項(xiàng) false 不啟用過(guò)濾器, *.property 已經(jīng)起到過(guò)濾的作用了 -->
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>3、創(chuàng)建Java實(shí)體類User--保存表中的一行數(shù)據(jù)
package com.mycompany.domain;
public class User {
private int userId;
private String userName;
private String email;
private int age;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}4、創(chuàng)建持久層的dao接口,定義操作數(shù)據(jù)庫(kù)的方法
package com.mycompany.dao;
import com.mycompany.domain.User;
import java.util.List;
public interface UserDao {
/**
* 查詢user列表
* @param user 單個(gè)user用戶
* @return user的list
*/
List<User> selectUserList(User user);
/**
* 插入user
* @param user
* @return
*/
int insertUser(User user);
}5、創(chuàng)建一個(gè)mybatis使用的配置文件 SQL映射文件
編寫SQL語(yǔ)句,一般一個(gè)表對(duì)應(yīng)一個(gè)SQL映射文件,這個(gè)文件就是xml文件
sql映射文件(sql mapper):編寫SQL語(yǔ)句,mybatis負(fù)責(zé)執(zhí)行這些SQL語(yǔ)句
1.指定約束文件
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ?"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- mybatis-3-mapper.dtd:約束文件名稱
2.約束文件作用:限制,檢查當(dāng)前文件中出現(xiàn)的標(biāo)簽,屬性必須符合mybatis的要求
3.<mapper>:當(dāng)前文件根標(biāo)簽(必須的)
- namesace:命名空間(唯一值,自定義字符串;要求使用dao接口的全限定名稱)
- 全限定類名:就是類名全稱,帶包路徑的用點(diǎn)隔開,如: java.lang.String
- 即全限定名 = 包名 + 類型
- 非限定類名也叫短名,就是我們平時(shí)說(shuō)的類名,不帶包的,如:String
4.數(shù)據(jù)庫(kù)增刪改查特定標(biāo)簽
- <select>:查詢,select語(yǔ)句
- <update>:更新,update語(yǔ)句
- <insert>:插入,insert語(yǔ)句
- <delete>:刪除,delete語(yǔ)句
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
sql映射文件(sql mapper):編寫SQL語(yǔ)句,mybatis負(fù)責(zé)執(zhí)行這些SQL語(yǔ)句
1、指定約束文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
mybatis-3-mapper.dtd:約束文件名稱
2、約束文件作用:限制,檢查當(dāng)前文件中出現(xiàn)的標(biāo)簽,屬性必須符合mybatis的要求
3、<mapper>:當(dāng)前文件根標(biāo)簽(必須的)
namespace:命名空間(唯一值,自定義字符串;要求使用dao接口的全限定名稱)
全限定類名:就是類名全稱,帶包路徑的用點(diǎn)隔開,如: java.lang.String
即全限定名 = 包名 + 類型
非限定類名也叫短名,就是我們平時(shí)說(shuō)的類名,不帶包的,如:String
4、數(shù)據(jù)庫(kù)增刪改查特定標(biāo)簽
<select>:查詢,select語(yǔ)句
<update>:更新,update語(yǔ)句
<insert>:插入,insert語(yǔ)句
<delete>:刪除,delete語(yǔ)句
-->
<mapper namespace="com.mycompany.dao.UserDao">
<!--
<select>標(biāo)簽:查詢操作
id:執(zhí)行SQL語(yǔ)法的唯一標(biāo)識(shí),mybatis會(huì)根據(jù)這個(gè)id的值來(lái)找到要執(zhí)行的SQL語(yǔ)句
可以自定義,一般要求使用接口中的方法名稱
resultType:表示結(jié)果類型,SQL語(yǔ)句執(zhí)行后得到ResultSet結(jié)果集,遍歷這個(gè)結(jié)果集得到的Java對(duì)象類型
值寫Java對(duì)象的全限定名稱
-->
<select id="selectUserList" resultType="com.mycompany.domain.User">
select user_Id,user_Name,email,age
from user
order by user_Id asc
</select>
<!--插入操作,字段名和Java實(shí)體類中字段保持一致-->
<insert id="insertUser">
insert into user values(#{userId},#{userName},#{email},#{age})
</insert>
</mapper>6、創(chuàng)建mybatis的主配置文件 一個(gè)項(xiàng)目一個(gè)主配置文件
主配置文件提供了數(shù)據(jù)庫(kù)的連接信息和SQL映射文件的位置信息
<?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">
<!--
mybatis的主配置文件:主要定義了數(shù)據(jù)庫(kù)的配置信息,SQL映射文件的位置
1、約束文件
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
mybatis-3-config.dtd:約束文件名稱
2、configuration:根標(biāo)簽
-->
<configuration>
<!-- settings:mybatis全局行為 -->
<settings>
<!-- 設(shè)置mybatis輸出日志 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
<!--
環(huán)境配置:數(shù)據(jù)庫(kù)的連接信息
default:必須和某個(gè)environment的id值一樣
告訴mybatis使用哪個(gè)數(shù)據(jù)庫(kù)的連接信息(訪問(wèn)哪個(gè)數(shù)據(jù)庫(kù))
-->
<environments default="development">
<!--
environment:一個(gè)數(shù)據(jù)庫(kù)的配置,環(huán)境
id:一個(gè)唯一值(可自定義,表示環(huán)境的名稱)
-->
<environment id="development">
<!--
transactionManaer:mybatis的事務(wù)類型
type:JDBC(表示使用JDBC中的Connection對(duì)象的commit,rollback做事務(wù)處理)
-->
<transactionManager type="JDBC"/>
<!--
dataSource:表示數(shù)據(jù)源,連接數(shù)據(jù)庫(kù)的
type:表述數(shù)據(jù)源的類型,POOLED表示使用連接池
-->
<dataSource type="POOLED">
<!--
driver, user, username, password 是固定的,不能自定義。
-->
<!-- 數(shù)據(jù)庫(kù)驅(qū)動(dòng)類名 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!-- 連接數(shù)據(jù)庫(kù)的URL字符串 -->
<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
<!-- 訪問(wèn)數(shù)據(jù)庫(kù)的用戶名 -->
<property name="username" value="root"/>
<!-- 訪問(wèn)數(shù)據(jù)庫(kù)的密碼 -->
<property name="password" value="123456"/>
</dataSource>
</environment>
<!--表示線上的數(shù)據(jù)庫(kù),是項(xiàng)目真實(shí)使用的庫(kù)-->
<environment id="online">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/onlinedb"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- sql mapper(SQL映射文件)的位置 -->
<mappers>
<!--
一個(gè)mapper標(biāo)簽指定一個(gè)文件的位置
從類路徑開始的路徑信息(target/classes)類路徑
-->
<mapper resource="com/mycompany/dao/UserDao.xml"/>
</mappers>
</configuration>7、創(chuàng)建使用mybatis測(cè)試類(通過(guò)mybatis訪問(wèn)數(shù)據(jù)庫(kù))
public class TestMyBatis {
/**
* 查詢user列表
*/
@Test
public void testSelectUserList(){
try {
//訪問(wèn)mybatis讀取user數(shù)據(jù)
//1、定義mybatis主配置文件名稱,從類路徑的根開始(target/clasess)
String config = "mybatis-config.xml";
//2、讀取config表示的文件
InputStream in = Resources.getResourceAsStream(config);
//3、創(chuàng)建SqlSessionFactoryBuilder對(duì)象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//4、創(chuàng)建SqlSessionFactory對(duì)象
SqlSessionFactory factory = builder.build(in);
//5、獲取SqlSession對(duì)象,從SqlSessionFactory中獲取SqlSession(非自動(dòng)提交事務(wù),如果增刪改需要手動(dòng)提交事務(wù))
SqlSession sqlSession = factory.openSession();
//6、指定要執(zhí)行的SQL語(yǔ)句標(biāo)識(shí);sql映射文件中的 namespace + "." + 標(biāo)簽的id值
String sqlId = "com.mycompany.dao.UserDao.selectUserList";
//7、執(zhí)行sql語(yǔ)句,通過(guò)sqlId找到語(yǔ)句
List<User> userList = sqlSession.selectList(sqlId);
//8、輸出結(jié)果
for (User user:userList){
System.out.println("查詢用戶="+user);
}
//9、關(guān)閉SQLSession對(duì)象
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 查詢user列表
*/
@Test
public void testMyBatisUtil(){
try {
SqlSession sqlSession = MyBatisUtil.getSqlSession();
String sqlId = "com.mycompany.dao.UserDao.selectUserList";
//7、執(zhí)行sql語(yǔ)句,通過(guò)sqlId找到語(yǔ)句
List<User> userList = sqlSession.selectList(sqlId);
//8、輸出結(jié)果
for (User user:userList){
System.out.println("查詢用戶="+user);
}
//9、關(guān)閉SQLSession對(duì)象
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 插入
*/
@Test
public void testInsertUser(){
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtil.getSqlSession();
String sqlId = "com.mycompany.dao.UserDao.insertUser";
//7、執(zhí)行sql語(yǔ)句,通過(guò)sqlId找到語(yǔ)句
User user = new User();
user.setUserId(5);
user.setUserName("zhangfei");
user.setEmail("zangfei@163.com");
user.setAge(16);
int nums = sqlSession.insert(sqlId,user);
//mybatis默認(rèn)不是自動(dòng)提交事務(wù)的, 所以在insert ,update ,delete后要手工提交事務(wù)
sqlSession.commit();
System.out.println("更新用戶條數(shù)="+nums);
//9、關(guān)閉SQLSession對(duì)象
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}我們將SqlSession提取為工具類MyBatisUtil
public class MyBatisUtil {
public MyBatisUtil() {
}
public static SqlSession getSqlSession() throws IOException {
String config = "mybatis-config.xml";
InputStream ins = Resources.getResourceAsStream(config);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(ins);
SqlSession sqlSession = factory.openSession();
return sqlSession;
}
}(1)Resources
mybatis中的一個(gè)類, 負(fù)責(zé)讀取主配置文件
//1、定義mybatis主配置文件名稱,從類路徑的根開始(target/clasess) String config = "mybatis-config.xml"; //2、讀取config表示的文件 InputStream in = Resources.getResourceAsStream(config);
(2)SqlSessionFactoryBuilder :
創(chuàng)建SqlSessionFactory對(duì)象
//3、創(chuàng)建SqlSessionFactoryBuilder對(duì)象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //4、創(chuàng)建SqlSessionFactory對(duì)象 SqlSessionFactory factory = builder.build(in);
(3)SqlSessionFactory
重量級(jí)對(duì)象, 程序創(chuàng)建一個(gè)對(duì)象耗時(shí)比較長(zhǎng),使用資源比較多;在整個(gè)項(xiàng)目中,有一個(gè)就夠用
SqlSessionFactory:接口 ,接口實(shí)現(xiàn)類: DefaultSqlSessionFactorySqlSessionFactory作用:獲取SqlSession對(duì)象
SqlSession sqlSession = factory.openSession();
openSession()方法
【1】openSession() :無(wú)參數(shù)的, 獲取是非自動(dòng)提交事務(wù)的SqlSession對(duì)象
【2】openSession(boolean):
openSession(true)獲取自動(dòng)提交事務(wù)的SqlSessionopenSession(false)非自動(dòng)提交事務(wù)的SqlSession對(duì)象
(4)SqlSession
SqlSession接口 :定義了操作數(shù)據(jù)的方法
例如 selectOne() ,selectList() ,insert(),update(),delete(),commit(),rollback()
SqlSession接口的實(shí)現(xiàn)類DefaultSqlSession。
使用要求: SqlSession對(duì)象不是線程安全的,需要在方法內(nèi)部使用, 在執(zhí)行sql語(yǔ)句之前,使用openSession()獲取SqlSession對(duì)象。
在執(zhí)行完sql語(yǔ)句后,需要關(guān)閉它,執(zhí)行SqlSession.close();這樣能保證他的使用是線程安全的
9、整個(gè)mybatis框架的maven模塊目錄如下

10、常見報(bào)錯(cuò)問(wèn)題
(1)找不到mybatis-config.xml文件或者對(duì)應(yīng)的dao以及SQL映射文件
有如下三種解決方案
【1】clean一下,然后compile一下,會(huì)重新生成target目錄
【2】Rebuild Project,再重新運(yùn)行,就會(huì)在target目錄下出現(xiàn)mybatis-config.xml文件
【3】以上兩種方式不行,直接手動(dòng)將src/resources/mybatis-config.xml文件拷貝至target/classes目錄下

(2)dao接口的 方法 和 dao.xml映射文件中的 id 要保持一致

(3)數(shù)據(jù)庫(kù)表中的列名,要和Java實(shí)體類中的字段,dao.xml映射文件的屬性字段保持一致

11、 junit : 單元測(cè)試
- junit:?jiǎn)卧獪y(cè)試, 一個(gè)工具類庫(kù),做測(cè)試方法使用的。
- 單元:指定的是方法, 一個(gè)類中有很多方法,一個(gè)方法稱為單元
使用單元測(cè)試
(1)需要加入junit依賴
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>(2)創(chuàng)建測(cè)試類
src/test/java目錄中創(chuàng)建類
(3)創(chuàng)建測(cè)試方法
【1】public 方法
【2】沒(méi)有返回值 void
【3】方法名稱自定義,建議名稱是test + 測(cè)試方法名稱
【4】方法沒(méi)有參數(shù)
【5】方法的上面加入 @Test ,方法可以單獨(dú)執(zhí)行;不用使用main方法
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在Spring Boot中如何使用數(shù)據(jù)緩存
本篇文章主要介紹了在Spring Boot中如何使用數(shù)據(jù)緩存,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-04-04
SpringBoot多模塊打包部署Docker的項(xiàng)目實(shí)戰(zhàn)
本文通過(guò)介紹最常見的Maven管理的Spring Boot項(xiàng)目多模塊打包部署Docker來(lái)介紹一下項(xiàng)目部署過(guò)程中操作流程和幾個(gè)需要注意的點(diǎn),具有一定的參加價(jià)值,感興趣的可以了解一下2023-08-08
java序列化對(duì)象根據(jù)不同配置動(dòng)態(tài)改變屬性名的方法
本文主要介紹了java序列化對(duì)象根據(jù)不同配置動(dòng)態(tài)改變屬性名的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Spring?Boot實(shí)現(xiàn)WebSocket實(shí)時(shí)通信
本文主要介紹了Spring?Boot實(shí)現(xiàn)WebSocket實(shí)時(shí)通信,包含實(shí)現(xiàn)實(shí)時(shí)消息傳遞和群發(fā)消息等功能,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05
使用多種方式實(shí)現(xiàn)遍歷HashMap的方法
下面小編就為大家?guī)?lái)一篇使用多種方式實(shí)現(xiàn)遍歷HashMap的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05

