深入淺出 MyBatis | CRUD 操作、配置解析

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 分析錯誤

  1. xml 文件中注釋不能出現中文報錯,查看自己的是UTF-8還是GBK編碼,改成為相應的就行。
<?xml version="1.0" encoding="UTF-8" ?>
<?xml version="1.0" encoding="GBK" ?>

即可成功測試。

  1. 標簽不要匹配錯!

  2. resource綁定mapper,需要使用路徑!
    在這里插入圖片描述

  3. 程序配置文件必須符合規范!

  4. NullPointerException,沒有注冊到資源!

  5. 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>
  1. 對比之前添加用戶注冊的值,之前沒有 map 參數時,傳入的值 #{id}, #{name}, #{pwd} 必須與實體的屬性一致,而使用 map 后,隨意傳入什么都可以,因為傳遞的是 map 的 key,不需要與數據庫中的表的屬性一致,傳入什么都可以 #{userid}, #{password}
  2. 這里與之前的老方式比較:某個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 中,dataSourcetransactionManager 是兩個重要的概念,分別用于數據庫連接管理和事務控制。

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 類型創建別名:一種是為單個類型設置別名,另一種是為整個包中的所有類創建別名。兩種方式的配置如下:

  1. 單個類型設置別名
<typeAliases><typeAlias alias="User" type="com.example.User"/>
</typeAliases>
  1. 為整個包設置別名

另一種方式是為整個包中的所有類創建別名,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 的配置文件中,標簽的順序通常為:

  1. properties(可選)
  2. settings
  3. typeAliases
  4. typeHandlers(可選)
  5. objectFactory(可選)
  6. plugins(可選)
  7. environments
  8. 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&amp;useUnicode=true&amp;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,就代表一個具體的業務!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64097.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64097.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64097.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端:改變鼠標點擊物體的顏色

需求&#xff1a; 需要改變圖片中某一物體的顏色&#xff0c;該物體是純色&#xff1b; 鼠標點擊哪個物體&#xff0c;哪個物體的顏色變為指定的顏色&#xff0c;利用canvas實現。 演示案例 代碼Demo <!DOCTYPE html> <html lang"en"><head>&l…

遞歸算法常見問題(Java)

問題&#xff1a;斐波那契數列,第1項和第2項都為1&#xff0c;后面每一項都為相鄰的前倆項的和,求第n個數 解法&#xff1a;每一個數都為前倆個數之和&#xff0c;第1項和第2項都為1&#xff0c;所以寫 方法f1(n)即為求第n個數&#xff0c;那么f1(n-1)為求第n-1個數&#xff0…

git自動壓縮提交的腳本

可以將當前未提交的代碼自動執行 git addgit commitgit squash Git 命令安裝指南 1. 創建腳本目錄 如果目錄不存在&#xff0c;創建它&#xff1a; mkdir -p ~/.local/bin2. 創建腳本文件 vim ~/.local/bin/git-squash將完整的腳本代碼復制到此文件中。 3. 設置腳本權限…

C項目 天天酷跑(下篇)

上篇再博客里面有&#xff0c;接下來我們實現我們剩下要實現的功能 文章目錄 碰撞檢測 血條的實現 積分計數器 前言 我們現在要繼續優化我們的程序才可以使這個程序更加的全面 碰撞的檢測 定義全局變量 實現全局變量 void checkHit() {for (int i 0; i < OBSTACLE_C…

論文解讀——掌紋生成網絡 RPG-Palm升級版PCE-Palm

該文章是2023年論文RPG-Palm的升級版 論文&#xff1a;PCE-Palm: Palm Crease Energy Based Two-Stage Realistic Pseudo-Palmprint Generation 作者&#xff1a;Jin, Jianlong and Shen, Lei and Zhang, Ruixin and Zhao, Chenglong and Jin, Ge and Zhang, Jingyun and Ding,…

代碼隨想錄算法【Day2】

Day2 1.掌握滑動窗口法 2.模擬題&#xff0c;堅持循環不變量原則 209 長度最小的子數組 暴力法&#xff1a; class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {//暴力法int i, j; //i代表起始點&#xff0c;j代表終止點int sum; //…

android——屏幕適配

一、屏幕適配的重要性 在 Android 開發中&#xff0c;屏幕適配是非常關鍵的。因為 Android 設備具有各種各樣的屏幕尺寸、分辨率和像素密度。如果沒有進行良好的屏幕適配&#xff0c;應用可能會出現顯示不完整、元素拉伸或壓縮變形、字體大小不合適等問題&#xff0c;極大地影響…

oscp學習之路,Kioptix Level2靶場通關教程

oscp學習之路&#xff0c;Kioptix Level2靶場通關教程 靶場下載&#xff1a;Kioptrix Level 2.zip 鏈接: https://pan.baidu.com/s/1gxVRhrzLW1oI_MhcfWPn0w?pwd1111 提取碼: 1111 搭建好靶場之后輸入ip a看一下攻擊機的IP。 確定好本機IP后&#xff0c;使用nmap掃描網段&…

第二十六周機器學習筆記:PINN求正反解求PDE文獻閱讀——正問題

第二十六周周報 摘要Abstract文獻閱讀《Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations》1. 引言2. 問題的設置3.偏微分方程的數據驅動解3.1 連續時間模型3.1.1 …

【安全編碼】Web平臺如何設計防止重放攻擊

我們先來做一道關于防重放的題&#xff0c;答案在文末 防止重放攻擊最有效的方法是&#xff08; &#xff09;。 A.對用戶密碼進行加密存儲使用 B.使用一次一密的加密方式 C.強制用戶經常修改用戶密碼 D.強制用戶設置復雜度高的密碼 如果這道題目自己拿不準&#xff0c;或者…

中關村科金智能客服機器人如何解決客戶個性化需求與標準化服務之間的矛盾?

客戶服務的個性化和標準化之間的矛盾一直是一個挑戰。一方面&#xff0c;企業需要提供標準化的服務以保持運營效率和成本控制&#xff1b;另一方面&#xff0c;為了提升客戶滿意度和忠誠度&#xff0c;企業又必須滿足客戶的個性化需求。為此&#xff0c;中關村科金推出了智能客…

OPPO Android面試題及參考答案 (上)

性能優化方面,講一下圖片內存占用計算,以及如何避免持有不必要的引用。 在 Android 中,計算圖片內存占用主要與圖片的尺寸和像素格式有關。對于一張位圖(Bitmap),其內存占用大小可以通過以下方式估算:內存占用 = 圖片寬度 圖片高度 每個像素占用字節數。例如,常見的 …

Agent 案例分析:金融場景中的智能體-螞蟻金服案例(10/30)

Agent 案例分析&#xff1a;金融場景中的智能體 —螞蟻金服案例 一、引言 在當今數字化時代&#xff0c;金融行業正經歷著深刻的變革。隨著人工智能技術的飛速發展&#xff0c;智能體&#xff08;Agent&#xff09;在金融場景中的應用越來越廣泛。螞蟻金服作為金融科技領域的…

ElasticSearch 的工作原理

理解 ElasticSearch 的工作原理需要從索引、搜索、以及其背后的核心機制幾個方面來探討。 1. ElasticSearch 是什么&#xff1f; ElasticSearch 是一個分布式搜索和分析引擎&#xff0c;適用于各種類型的數據&#xff0c;例如文本、數值、地理位置、結構化或非結構化數據。它基…

STM32F407 | Embedded IDE01 - vscode搭建Embedded IDE開發環境(支持JLINK、STLINK、DAPLINK)

導言 Embedded IDE官網:https://em-ide.com/docs/intro 我猜肯定有部分人使用SI Keil開發STM32項目&#xff0c;也有vscode Keil開發STM32程序。SI或vscode編寫代碼&#xff0c;然后切換Keil編譯、下載、調試程序。有一段時間&#xff0c;我也是這么干的。但是&#xff0c;程…

光譜相機的工作原理

光譜相機的工作原理主要基于不同物質對不同波長光的吸收、反射和透射特性存在差異&#xff0c;以下是其具體工作過程&#xff1a; 一、光的收集 目標物體在光源照射下&#xff0c;其表面會對光產生吸收、反射和透射等相互作用。光譜相機的光學系統&#xff08;如透鏡、反射鏡…

ThinkPHP接入PayPal支付

ThinkPHP 5接入PayPal 支付&#xff0c;PayPal的流程是服務器請求Paypal的接口下單&#xff08;需要傳訂單id/支付成功的重定向地址/支付失敗的重定向地址&#xff09;&#xff0c;接會返回一個支付地址&#xff0c;項目服務器把地址返給用戶&#xff0c;用戶打開鏈接登錄Paypa…

stream流的toMap

假設有這么一個類: import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors;public class Student {private int id;private String name;public Student(int id, String name) {this.id id;…

html + css 淘寶網實戰

之前有小伙伴說&#xff0c;淘寶那么牛逼你會寫代碼&#xff0c;能幫我做一個一樣的淘寶網站嗎&#xff0c;好呀&#xff0c;看我接下來如何給你做一個淘寶首頁。hahh,開個玩笑。。。學習而已。 在進行html css編寫之前 先了解下網頁的組成和網頁元素的尺寸吧 1.網頁的組成 …

神經網絡、深度學習、卷積神經網絡

好的&#xff01;我會盡量詳細且易懂地為你解釋這些概念&#xff0c;并在最后用簡單直白的語言總結一下。 1. 神經網絡思想 神經網絡是靈感來自于生物大腦神經元的工作原理&#xff0c;是一種模仿人類大腦處理信息的方式來設計的數學模型。我們的大腦由億萬個神經元組成&…