3、CRUD
3.1 namespace
namespace 中的包名要和 Dao/Mapper 接口的包名一致!
比如將 UserDao 改名為 UserMapper
運行發現抱錯,這是因為 UserMapper.xml 中沒有同步更改 namespace
成功運行
給出 UserMapper 中的所有接口,接下來一一對這些接口實現 CRUD 操作
pojo 下對應的數據庫表的實體類 User
說明:下述的 sql 語句中的如:
select * from mybatis.user
,其中 mybatis.user 的 mybatis 是我定義的數據庫的名,如果你的數據庫名為 xxx,因為為select * from xxx.user
3.2 select
選擇,查詢語句;
- id:就是對應的 namespace 中的方法名;、
- resultType:Sql 語句執行的返回值!
- parameterType:參數類型!
<!--namespace綁定一個對應的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper"><select id="getUserList" resultType="com.uestc.pojo.User">select * from mybatis.user</select>
</mapper>
接下來實現根據 ID 查詢用戶
在 UserMapper 接口中加入方法
// 根據 ID 查詢用戶
User getUserById(int id);
在 UserMapper.xml 中配置
<!--namespace綁定一個對應的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper"><select id="getUserById" parameterType="int" resultType="com.uestc.pojo.User">select * from mybatis.user where id = #{id}</select></mapper>
- id=“getUserById” 對應 UserMapper 接口中 getUserById 方法
- parameterType 為傳入的參數 int id;
- resultType 為返回的類型 User
- select * from mybatis.user where id = #{id},其中 #{} 表示取值,傳入 id 這個參數,然后 #{id} 取出即可,注意是花括號,不是圓括號
在 test 中進行測試
@Test
public void getUserByIdTest() {//第一步:獲得SqlSession對象SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = mapper.getUserById(1); // 查詢 id = 1 的用戶System.out.println(user);//關閉SqlSessionsqlSession.close();
}
3.3 Insert(增)
在 UserMapper 接口中加入方法 addUser
//插入一個用戶
int addUser(User user);
在 UserMapper.xml 中配置(插入操作的 sql 語句為:INSERT INTO students (id, name, age) VALUES (1, 'Alice', 20);
)
<!--namespace綁定一個對應的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper"><!-- 對象中的屬性可以直接取出--><insert id="addUser" parameterType="com.uestc.pojo.User">insert into mybatis.user (id, name, pwd) values (#{id},#{name},#{pwd})</insert></mapper>
- insert 標簽用于插入,其中實體類 User 中的屬性可以直接通過屬性名獲取:
#{id}, #{name}, #{pwd}
在 test 中進行測試
@Test
public void addUserTest() {SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);mapper.addUser(new User(4, "哈哈", "123456"));sqlSession.close();
}
執行
刷新數據庫,沒有看到
那是因為數據庫增刪改一定要提交事務 sqlSession.commit();
@Test
public void addUserTest() {SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);int res = mapper.addUser(new User(4, "哈哈", "123456"));if (res > 0) {System.out.println("插入成功!");}// 提交事務sqlSession.commit();sqlSession.close();
}
成功插入!
3.4 Update(改)
在 UserMapper 接口中加入方法 updateUser
int updateUser(User user);
在 UserMapper.xml 中配置
<!--namespace綁定一個對應的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper"><update id="updateUser" parameterType="com.uestc.pojo.User">update mybatis.user set name=#{name},pwd=#{pwd} where id = #{id}</update></mapper>
- update mybatis.user set name=#{name},pwd=#{pwd} where id = #{id},之前 sql 中是直接 set 賦值,在這里,直接將 User 實例中的屬性賦過去即可,即 name=#{name},pwd=#{pwd} where id = #{id}
測試:注意一定要提交事務
@Test
public void updateUserTest() {SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);int res = mapper.updateUser(new User(4, "啊啊", "12345678"));// 提交事務sqlSession.commit();sqlSession.close();
}
3.5 Delete(刪)
在 UserMapper 接口中加入方法 deleteUser
int deleteUser(int id);
在 UserMapper.xml 中配置
<!--namespace綁定一個對應的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper"><delete id="deleteUser" parameterType="int">delete from mybatis.user where id = #{id}</delete></mapper>
測試:
@Testpublic void deleteUserTest() {SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);int res = mapper.deleteUser(4);// 提交事務sqlSession.commit();sqlSession.close();}
注意點:
- 增刪改需要提交事務!
3.6 分析錯誤
- xml 文件中注釋不能出現中文報錯,查看自己的是UTF-8還是GBK編碼,改成為相應的就行。
<?xml version="1.0" encoding="UTF-8" ?>
<?xml version="1.0" encoding="GBK" ?>
即可成功測試。
-
標簽不要匹配錯!
-
resource綁定mapper,需要使用路徑!
-
程序配置文件必須符合規范!
-
NullPointerException,沒有注冊到資源!
-
maven資源沒有導出問題!
3.7 萬能 Map(企業中常用)
假設,實體類,或者數據庫中的表,字段或者參數過多,我們應當考慮使用Map!
比如在 UserMapper 接口中加入方法 addUser2。用 Map 作為參數來傳,不需要知道數據庫內有什么
// 萬能的Map
int addUser2(Map<String,Object> map); // 同 int addUser(User user); 功能
在 UserMapper.xml 中配置
<!--namespace綁定一個對應的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper"><!--對象中的屬性,可以直接取出來 傳遞map的key--><insert id="addUser2" parameterType="map">insert into mybatis.user (id, pwd) values (#{userid},#{password})</insert></mapper>
老方式:
<!--namespace綁定一個對應的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper"><!-- 對象中的屬性可以直接取出--><insert id="addUser" parameterType="com.uestc.pojo.User">insert into mybatis.user (id, name, pwd) values (#{id},#{name},#{pwd})</insert></mapper>
- 對比之前添加用戶注冊的值,之前沒有 map 參數時,傳入的值
#{id}, #{name}, #{pwd}
必須與實體的屬性一致,而使用 map 后,隨意傳入什么都可以,因為傳遞的是 map 的 key,不需要與數據庫中的表的屬性一致,傳入什么都可以#{userid}, #{password}
- 這里與之前的老方式比較:某個key省去都不影響,比如 #{userid},#{password},沒有 name 了。這就可以應付參數過多的情況,并不需要寫出所有參數
測試
@Test
public void addUser2Test() {SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);Map<String,Object> map = new HashMap<String, Object>();map.put("userid", 4);map.put("password","123321");mapper.addUser2(map);// 提交事務sqlSession.commit();sqlSession.close();
}
再來看對上面 User getUserById(int id); 用 map 作為參數傳遞
User getUserById2(Map<String,Object> map);
在 UserMapper.xml 中配置
<!--namespace綁定一個對應的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper"><select id="getUserById2" parameterType="map" resultType="com.uestc.pojo.User">select * from mybatis.user where id = #{helloid} and name = #{helloname}</select></mapper>
- id = #{helloid} and name = #{helloname} 這里 helloid 和 helloname 都可以任意,但是用之前的方式,這里就限制死了,必須要實體類和數據庫屬性一致
測試
@Test
public void getUserById2Test() {SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);Map<String,Object> map = new HashMap<String, Object>();map.put("helloid", 1);map.put("helloname", "洪");User user = mapper.getUserById2(map);System.out.println(user);// 提交事務sqlSession.commit();sqlSession.close();
}
Map傳遞參數,直接在sql中取出key即可!【parameterType=“map”】
對象傳遞參數,直接在sql中取對象的屬性即可!【parameterType=“Object”】
只有一個基本類型參數的情況下,可以直接在sql中取到!
多個參數用Map,或者注解!
3.8 思考題
模糊查詢怎么寫?
1. java 代碼執行的時候,傳遞通配符% %
UserMapper 接口中加入方法 getUserLike
List<User> getUserLike(String value);
在 UserMapper.xml 中配置
<!--namespace綁定一個對應的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper"><select id="getUserLike">select * from mybatis.user where name like "%"#{value}"%"</select></mapper>
"%"#{value}"%"
,其中 value 就是要傳入的值,這樣傳入可能導致 SQL 注入問題
測試
@Test
public void getUserLikeTest() {//第一步:獲得SqlSession對象SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> userList = mapper.getUserLike("%李%");for (User user : userList) {System.out.println(user);}//關閉SqlSessionsqlSession.close();
}
4、配置解析
4.1 核心配置文件
- mybatis-config.xml
- MyBatis 的配置文件包含了會深深影響 MyBatis 行為的設置和屬性信息。
configuration(配置)
properties(屬性)
settings(設置)
typeAliases(類型別名)
typeHandlers(類型處理器)
objectFactory(對象工廠)
plugins(插件)
environments(環境配置)
environment(環境變量)
transactionManager(事務管理器)
dataSource(數據源)
databaseIdProvider(數據庫廠商標識)
mappers(映射器)
只需掌握紅色圈起來的即可,其他了解
4.2 環境配置(environments)
-
Mybatis 可以配置成適應多種環境
-
不過要記住:盡管可以配置多個環境,但每個 SqlSessionFactory 實例只能選擇一種環境。
-
學會使用配置多套運行環境!
-
Mybatis默認的事務管理器就是 JDBC, 連接池:POOLED
了解事物管理器,不只有 JDBC 還有 MANAGED
了解什么是數據源(dataSource),作用只有一個:連接數據庫
在 MyBatis 中,dataSource
和 transactionManager
是兩個重要的概念,分別用于數據庫連接管理和事務控制。
1. DataSource(數據源)
DataSource
是指數據庫連接池的配置和管理組件,它負責提供數據庫連接。使用數據源可以提高應用程序對數據庫連接的管理效率,避免每次操作都重新創建數據庫連接。
在 MyBatis 中,DataSource
主要用于管理與數據庫的連接。常見的數據源類型有:
- DriverManagerDataSource:最簡單的數據源,直接使用 JDBC 驅動來建立數據庫連接。
- BasicDataSource(來自 Apache Commons DBCP)和 HikariCP:更常用的連接池實現,通過池化技術來提高性能。
MyBatis 通過配置 dataSource
來指定如何連接到數據庫。通常會在 mybatis-config.xml
或 Spring 配置文件中進行配置。例如:
<dataSource type="org.apache.ibatis.datasource.pooled.PooledDataSource"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/><property name="username" value="root"/><property name="password" value="password"/>
</dataSource>
2. TransactionManager(事務管理器)
TransactionManager
是 MyBatis 中的事務控制組件,用于管理數據庫事務的開始、提交和回滾。它幫助開發者處理事務的生命周期,并確保事務在正確的時機進行提交或回滾。
在 MyBatis 中,TransactionManager
有兩種常見的實現:
- JDBCTransaction:通過 JDBC 來管理事務,適用于不使用 Spring 等容器的簡單項目。
- ManagedTransaction:通過外部容器(如 Spring)來管理事務,適用于集成到 Spring 框架的應用。
如果使用 Spring 框架,MyBatis 通常會與 Spring 的事務管理器集成,使用 SpringManagedTransaction
來管理事務。在 Spring 環境中,事務管理器可以通過 @Transactional
注解來控制事務的提交和回滾。
示例配置:
<transactionManager type="JDBC"><!-- JDBC事務管理器配置 -->
</transactionManager>
或在 Spring 中:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean>
小結:
- DataSource:用于數據庫連接池的管理,提供數據庫連接。
- TransactionManager:用于事務的管理,控制事務的開啟、提交和回滾。
這兩個組件在 MyBatis 中共同工作,以保證應用程序能夠高效且安全地與數據庫進行交互,同時確保事務的一致性。
標簽順序
在 MyBatis 配置文件中,XML 標簽的順序通常是固定的,遵循一定的邏輯結構,確保各個組件按正確的順序初始化。下面是常見的 mybatis-config.xml
配置文件中的標簽順序及其含義:
1. <?xml version="1.0" encoding="UTF-8"?>
這是 XML 文件的聲明部分,通常位于文件的開頭。
2. <configuration>
<configuration>
是 MyBatis 配置文件的根標簽,所有其他標簽都在這個標簽內。
<configuration><!-- 配置內容 -->
</configuration>
3. <properties>
(可選)
在配置文件的開始部分,可以定義一些外部屬性,這些屬性可以在整個配置文件中引用。通常用于配置數據庫連接信息等。
<properties><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/><property name="username" value="root"/><property name="password" value="password"/>
</properties>
4. <settings>
<settings>
標簽用于配置 MyBatis 的全局設置,例如緩存開關、懶加載等。
<settings><setting name="cacheEnabled" value="true"/><setting name="lazyLoadingEnabled" value="false"/><setting name="multipleResultSetsEnabled" value="true"/>
</settings>
5. <typeAliases>
<typeAliases>
標簽用于定義類型別名,可以為 Java 類創建簡化的別名。
在 MyBatis 中,<typeAliases>
標簽可以通過兩種方式為 Java 類型創建別名:一種是為單個類型設置別名,另一種是為整個包中的所有類創建別名。兩種方式的配置如下:
- 單個類型設置別名
<typeAliases><typeAlias alias="User" type="com.example.User"/>
</typeAliases>
- 為整個包設置別名
另一種方式是為整個包中的所有類創建別名,MyBatis 會自動為該包中的每個類生成別名。默認情況下,MyBatis 會使用類名的首字母小寫作為別名(但你也可以通過 <typeAlias>
標簽自定義別名)。
<typeAliases><package name="com.uestc.pojo"/>
</typeAliases>
- name:指定了要掃描的包路徑,這里是
com.uestc.pojo
包。
此配置告訴 MyBatis 掃描 com.uestc.pojo
包中的所有類,并自動為每個類創建別名。默認情況下,MyBatis 會將每個類名的首字母轉換為小寫,并將其作為別名。例如:
com.uestc.pojo.User
類的別名將自動生成為user
。com.uestc.pojo.Order
類的別名將自動生成為order
。
6. <typeHandlers>
(可選)
<typeHandlers>
標簽用于配置自定義的類型處理器。類型處理器用于在 Java 類型與 JDBC 類型之間轉換。
<typeHandlers><typeHandler handler="com.example.CustomTypeHandler"/>
</typeHandlers>
7. <objectFactory>
(可選)
<objectFactory>
標簽用于指定自定義的對象工廠,用于 MyBatis 實例化對象。
<objectFactory type="com.example.CustomObjectFactory"/>
8. <plugins>
(可選)
<plugins>
標簽用于配置 MyBatis 插件,例如分頁插件、性能分析插件等。
<plugins><plugin interceptor="org.mybatis.example.PluginExample"/>
</plugins>
9. <environments>
<environments>
標簽用于定義多個環境(例如開發環境、生產環境),每個環境可以指定不同的數據源和事務管理器。
<environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/><property name="username" value="root"/><property name="password" value="password"/></dataSource></environment>
</environments>
10. <mappers>
<mappers>
標簽用于指定映射器(Mapper)的配置,可以是 .xml
文件的路徑,也可以是 Mapper 接口的類名。
<mappers><mapper resource="com/example/mapper/UserMapper.xml"/><mapper class="com.example.mapper.ProductMapper"/>
</mappers>
總體結構
根據上述內容,MyBatis 的配置文件通常遵循以下順序:
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 可選的外部屬性 --><properties><!-- 配置項 --></properties><!-- 全局設置 --><settings><!-- 設置項 --></settings><!-- 類型別名 --><typeAliases><!-- 別名配置 --></typeAliases><!-- 類型處理器 --><typeHandlers><!-- 自定義類型處理器 --></typeHandlers><!-- 對象工廠 --><objectFactory><!-- 自定義對象工廠 --></objectFactory><!-- 插件 --><plugins><!-- 插件配置 --></plugins><!-- 環境設置 --><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 數據源配置 --></dataSource></environment></environments><!-- 映射器配置 --><mappers><mapper resource="com/example/mapper/UserMapper.xml"/><mapper class="com.example.mapper.ProductMapper"/></mappers></configuration>
小結:
在 MyBatis 的配置文件中,標簽的順序通常為:
properties
(可選)settings
typeAliases
typeHandlers
(可選)objectFactory
(可選)plugins
(可選)environments
mappers
標簽順序通常沒有嚴格的約束,但遵循這個順序可以使配置文件更加清晰易懂。
新建項目 Mybatis-02
將 Mybatis-01 中所有的環境都打包過來,然后刪除掉部分內容,使其簡潔
UserMapper 只保留這幾個基本方法,并刪除相應的 UserMapper.xml 中的配置
測試 UserDaoTest 只留一個
4.3 屬性(properties)
我們可以通過properties屬性來實現引用配置文件
這些屬性都是可外部配置且可動態替換的,既可以在典型的Java屬性文件中配置,亦可通過properties元素的子元素來傳遞。【db.properties】
編寫一個配置文件 db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://112.124.60.179:3310/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8
username=root
password=123456
在核心配置文件中映入
<!--引入外部配置文件-->
<properties resource="db.properties"><property name="username" value="root"/><property name="pwd" value="123123"/>
</properties>
- 可以直接引入外部文件
- 可以在其中增加一些屬性配置
- 如果兩個文件有同一個字段,優先使用外部配置文件的!
標簽是有放的順序的,必須保證這個順序,所以 properties 是放在最上面
mybatis-config.xml 更改如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration core file-->
<configuration><!--引入外部配置文件--><properties resource="db.properties">
<!-- <property name="username" value="root"/>-->
<!-- <property name="pwd" value="123456"/>--></properties><environments default="development"><environment id="development"><!--事務管理--><transactionManager type="JDBC"/><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><!--每一個 Mapper.xml 都需要在 Mybatis 核心配置文件(mybatis-config.xml) 中注冊!--><mappers><mapper resource="com/uestc/dao/UserMapper.xml"/></mappers></configuration>
運行測試,成功
同時可以 properties 中寫一部分 db.properties 中寫一部分
mybatis-config.xml 更改如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration core file-->
<configuration><!--引入外部配置文件--><properties resource="db.properties"><property name="username" value="root"/><property name="pwd" value="123456"/></properties><environments default="development"><environment id="development"><!--事務管理--><transactionManager type="JDBC"/><dataSource type="POOLED"><!--數據庫相關配置--><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${pwd}"/></dataSource></environment></environments><!--每一個 Mapper.xml 都需要在 Mybatis 核心配置文件(mybatis-config.xml) 中注冊!--><mappers><mapper resource="com/uestc/dao/UserMapper.xml"/></mappers></configuration>
properties 和 db.properties 如果都有相同的字段,比如 username 和 password,就存在優先級的問題
測試成功出結果,說明優先使用的是 db.properties 里面的
- 可以直接引入外部文件
- 可以在其中增加一些屬性配置
- 如果兩個文件有同一個字段,優先使用外部配置文件的 !
4.4 類型別名(typeAliases)[?e?li?s?z] 別名
- 類型別名是為Java類型設置一個短的名字。
- 存在的意義僅在于用來減少類完全限定名的冗余。
mybatis-config.xml 中取別名
<!--可以給實體類起別名-->
<typeAliases><typeAlias type="com.uestc.pojo.User" alias="User" />
</typeAliases>
注意 typeAliases 標簽放置得位置順序
UserMapper.xml 中使用
<!--namespace綁定一個對應的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper"><!--sql查詢語句,getUserList 以前需要放到 UserDaoImpl實現類中重寫,現在只需要標簽即可--><select id="getUserList" resultType="User">select * from mybatis.user</select></mapper>
執行測試
也可以指定一個包名,MyBatis會在包名下面搜索需要的 JavaBean,比如:
掃描實體類的包,它的默認別名就為這個類的類名,首字母小寫!(比如類名為 User,替換時用 user 也可以跑出來)
<!--可以給實體類起別名-->
<typeAliases><package name="com.uestc.pojo"/>
</typeAliases>
下面大寫小寫首字母都可以運行成功,推薦使用首字母小寫
在實體類比較少的時候,使用第一種方式。
如果實體類十分多,建議使用第二種。
第一種可以DIY別名,第二種則不行,如果非要改,需要在實體上增加注解,見下:(即在第二種方式的基礎上,增加注解)
@Alias("user")
//實體類
public class User {xxx}
測試
原因是通過注解更改了別名,所以要用 hello
4.5 設置
這是 MyBatis 中極為重要的調整設置,它們會改變 MyBatis 的運行時行為。
4.6 其他配置
- typeHandlers(類型處理器)
- objectFactory(對象工廠)
- plugins(插件)
- mybatis-generator-core
- mybatis-plus
- 通用mapper
4.7 映射器(mappers)
MapperRegistry:注冊綁定我們的 Mapper 文件;
方式一:【推薦使用】 在 mybatis-config.xml 中加入如下:
<!--每一個 Mapper.xml 都需要在 Mybatis 核心配置文件(mybatis-config.xml) 中注冊!-->
<mappers><mapper resource="com/uestc/dao/UserMapper.xml"/>
</mappers>
將 UserMapper.xml 文件放入到其他地方,同時更改 mapper 標簽下路徑,可以正常運行
方式二:使用 class 文件綁定注冊
<!--每一個Mapper.xml都需要在Mybatis核心配置文件中注冊!-->
<mappers><mapper class="com.uestc.dao.UserMapper"/>
</mappers>
將 UserMapper.xml 文件放入到其他地方,同時更改 mapper 標簽下路徑,運行失敗
將 UserMapper.xml 與其綁定得接口 UserMapper 放在同一個包下,運行成功
因此第二個方式注意點:
- 接口和它的Mapper配置文件必須同名!
- 接口和它的Mapper配置文件必須在同一個包下!
方式三:使用掃描包進行注入綁定
<!--每一個Mapper.xml都需要在Mybatis核心配置文件中注冊!-->
<mappers><package name="com.uestc.dao"/>
</mappers>
方式三注意點:
- 接口和它的Mapper配置文件必須同名!
- 接口和它的Mapper配置文件必須在同一個包下!
4.8 生命周期和作用域
生命周期和作用域是至關重要的,因為錯誤的使用會導致非常嚴重的并發問題。
SqlSessionFactoryBuilder:
- 一旦創建了 SqlSessionFactory,就不再需要它了。
- 局部變量
SqlSessionFactory:
- 說白就是可以想象為:數據庫連接池。
- SqlSessionFactory 一旦被創建就應該在應用的運行期間一直存在,沒有任何理由丟棄它或重新創建另一個實例。
- SqlSessionFactory 的最佳作用域是應用作用域。
- 最簡單的就是使用單例模式或者靜態單例模式。
SqlSession:
- 連接到連接池的一個請求!
- SqlSession 的實例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。
- 用完后需要趕緊關閉,否則資源被占用!
這里的每一個Mapper,就代表一個具體的業務!