目錄
- 1、MyBatis概述
- 1.1 MyBatis概述
- 1.2 JDBC缺點
- 1.3 MyBatis優化
- 2、MyBatis快速入門
- 3、Mapper代理開發
- 3.1 Mapper代理開發概述
- 3.2 使用Mapper代理要求
- 3.3 案例代碼實作
- 4、核心組態檔
- 4.1 多環境配置
- 4.2 型別別名
- 5、組態檔實作CRUD
- 5.1 環境準備
- 5.2 查詢所有資料
- 5.3 查詢
- 5.4 多條件查詢
- 5.6 添加資料與MyBatis事務
- 5.7 修改
- 5.8 洗掉資料
- 5.9 MyBatis引數傳遞
- 6、通過注解實作CRUD
閱讀提示:
本文默認已經預裝預裝maven
1、MyBatis概述
1.1 MyBatis概述
-
持久層框架,用于簡化JDBC開發,是對JDBC的封裝
持久層:
- 負責將資料保存到資料庫的代碼部分
- Java EE三層架構:表現層、業務層、持久層
1.2 JDBC缺點
- 硬編碼,不利于維護
- 注冊驅動、獲取連接
- SQL陳述句
- 操作繁瑣
- 手動設定引數
- 手動封裝結果集
1.3 MyBatis優化
- 硬編碼 --> 組態檔
- 繁瑣慚怍 --> 框架封裝自動完成
2、MyBatis快速入門
-
需求:查詢user表中的所有資料
-
SQL
create database mybatis; use mybatis; drop table if exists tb_user; create table tb_user( id int primary key auto_increment, username varchar(20), password varchar(20), gender char(1), addr varchar(30) ); INSERT INTO tb_user VALUES (1, 'zhangsan', '123', '男', '北京'); INSERT INTO tb_user VALUES (2, '李四', '234', '女', '天津'); INSERT INTO tb_user VALUES (3, '王五', '11', '男', '西安'); -
代碼實作
-
創建模塊,匯入坐標
在pom.xml中組態檔中添加依賴的坐標
注意:需要在專案的resources目錄下創建logback的組態檔
<dependencies> <!--mybatis 依賴--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <!--mysql 驅動--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <!--junit 單元測驗--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency> <!-- 添加slf4j日志api --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.20</version> </dependency> <!-- 添加logback-classic依賴 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <!-- 添加logback-core依賴 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency> </dependencies> -
撰寫MyBatis核心檔案
核心檔案用于替換資訊,解決硬編碼問題
在模塊下的resources目錄下創建mybatis的組態檔
mybatis-config.xml<?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"> <configuration> <environments default="development"> <environment id="development"> <!-- 采用JDBC的事務管理方式 --> <transactionManager type="JDBC"/> <!-- 資料庫連接資訊 --> <dataSource type="POOLED"> <property name="driver" value="https://www.cnblogs.com/dandelion-000-blog/archive/2022/08/29/com.mysql.jdbc.Driver"/> <property name="url" value="https://www.cnblogs.com/dandelion-000-blog/archive/2022/08/29/jdbc:mysql:///mybatis?useSSL=false"/> <property name="username" value="https://www.cnblogs.com/dandelion-000-blog/archive/2022/08/29/root"/> <property name="password" value="https://www.cnblogs.com/dandelion-000-blog/archive/2022/08/29/123456"/> </dataSource> </environment> </environments> <!-- 加載SQL映射檔案 --> <mappers> <mapper resource="UserMapper.xml"/> </mappers> </configuration> -
撰寫SQL映射檔案
SQL映射檔案用于統一管理SQL陳述句,解決硬編碼問題
在模塊的resources目錄下創建映射組態檔
UserMaooer.xml<?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"> <!-- namespace:命名空間 --> <mapper namespace="test"> <!-- statement --> <select id="selectAll" resultType="priv.dandelion.entity.User"> select * from tb_user; </select> </mapper> -
編碼
-
物體類
package priv.dandelion.entity; public class User { private Integer id; private String username; private String password; private String gender; private String address; public User() { } public User(Integer id, String username, String password, String gender, String address) { this.id = id; this.username = username; this.password = password; this.gender = gender; this.address = address; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + ", gender='" + gender + '\'' + ", address='" + address + '\'' + '}'; } } -
測驗類
public static void main(String[] args) throws IOException { // 加載mybatis的核心組態檔,獲取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 獲取Session物件,執行SQL陳述句 SqlSession sqlSession = sqlSessionFactory.openSession(); // 執行SQL,處理結果 List<User> users = sqlSession.selectList("test.selectAll"); System.out.println(users); // 釋放資源 sqlSession.close(); }
-
-
3、Mapper代理開發
3.1 Mapper代理開發概述
解決形如上述測驗類中
List<User> users = sqlSession.selectList("test.selectAll");的硬編碼問題
- 解決原生方式中的硬編碼
- 簡化后期的SQL執行
3.2 使用Mapper代理要求
-
定義與SQL映射檔案同名的Mapper介面,并且將Mapper介面和SQL映射檔案放置在同一目錄下
maven專案開發時要求code和resources分開,可在resources中創建相同包檔案來是實作上述效果
-
設定SQL映射檔案的
namespace屬性未Mapper介面的全限定名 -
在Mapper介面中定義方法,方法名就是SQL映射檔案中SQL陳述句的
id,并且引數型別和回傳值型別一致
3.3 案例代碼實作
-
修改SQL映射檔案
UserMapper.xml同時還要修改其路徑
<?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"> <!-- namespace:命名空間 --> <mapper namespace="priv.dandelion.mapper.UserMapper"> <select id="selectAll" resultType="priv.dandelion.entity.User"> select * from tb_user; </select> </mapper> -
創建對應的Mapper介面
UserMapper.interfacepublic interface UserMapper { List<User> selectAll(); } -
修改mybatis核心組態檔中加載SQL映射的
<mapper></mapper>的路徑<mappers> <mapper resource="priv/dandelion/mapper/UserMapper.xml"/> </mappers> -
測驗代碼
public static void main(String[] args) throws IOException { // 加載mybatis的核心組態檔,獲取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 獲取Session物件,執行SQL陳述句 SqlSession sqlSession = sqlSessionFactory.openSession(); // 執行SQL,處理結果 // 獲取UserMapper介面的代理物件 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> users = userMapper.selectAll(); System.out.println(users); // 釋放資源 sqlSession.close(); } -
改進
如果Mapper介面名稱和SQL映射檔案名稱相同,并在同一目錄下,則可以使用包掃描的方式簡化SQL映射檔案的加載,簡化mybatis核心組態檔
<mappers> <!--加載sql映射檔案--> <!-- <mapper resource="priv/dandelion/mapper/UserMapper.xml"/>--> <!--Mapper代理方式--> <package name="priv.dandelion.mapper"/> </mappers>
4、核心組態檔
4.1 多環境配置
在核心組態檔的
environments標簽中其實是可以配置多個environment,使用id給每段環境起名,在environments中使用default='環境id'來指定使用哪兒段配置,我們一般就配置一個environment即可
<?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">
<configuration>
<typeAliases>
<package name="priv.dandelion.entity"/>
</typeAliases>
<environments default="development">
<environment id="development">
<!-- 采用JDBC的事務管理方式 -->
<transactionManager type="JDBC"/>
<!-- 資料庫連接資訊 -->
<dataSource type="POOLED">
<property name="driver" value="https://www.cnblogs.com/dandelion-000-blog/archive/2022/08/29/com.mysql.jdbc.Driver"/>
<!-- JDBC連接資料庫,SSL,Unicode字符集,UTF-8編碼 -->
<property name="url" value="https://www.cnblogs.com/dandelion-000-blog/archive/2022/08/29/jdbc:mysql:///mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="https://www.cnblogs.com/dandelion-000-blog/archive/2022/08/29/root"/>
<property name="password" value="https://www.cnblogs.com/dandelion-000-blog/archive/2022/08/29/123456"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<!-- 資料庫連接資訊 -->
<dataSource type="POOLED">
<property name="driver" value="https://www.cnblogs.com/dandelion-000-blog/archive/2022/08/29/com.mysql.jdbc.Driver"/>
<property name="url" value="https://www.cnblogs.com/dandelion-000-blog/archive/2022/08/29/jdbc:mysql:///mybatis?useSSL=false"/>
<property name="username" value="https://www.cnblogs.com/dandelion-000-blog/archive/2022/08/29/root"/>
<property name="password" value="https://www.cnblogs.com/dandelion-000-blog/archive/2022/08/29/123456"/>
</dataSource>
</environment>
</environments>
<!-- 加載SQL映射檔案 -->
<mappers>
<!-- <mapper resource="priv/dandelion/mapper/UserMapper.xml"/>-->
<package name="priv.dandelion.mapper"/>
</mappers>
</configuration>
4.2 型別別名
映射組態檔中的
resultType屬性需要配置資料封裝的型別(類的全限定名),繁瑣Mybatis 提供了
型別別名(typeAliases) 可以簡化這部分的書寫
<configuration>
<!-- name屬性未物體類所在的包 -->
<typeAliases>
<package name="priv.dandelion.entity"/>
</typeAliases>
</configuration>
<mapper namespace="priv.dandelion.mapper.UserMapper">
<!-- resultType的值不區分大小寫 -->
<select id="selectAll" resultType="user">
select * from tb_user;
</select>
</mapper>
5、組態檔實作CRUD
5.1 環境準備
-
SQL
-- 洗掉tb_brand表 drop table if exists tb_brand; -- 創建tb_brand表 create table tb_brand ( -- id 主鍵 id int primary key auto_increment, -- 品牌名稱 brand_name varchar(20), -- 企業名稱 company_name varchar(20), -- 排序欄位 ordered int, -- 描述資訊 description varchar(100), -- 狀態:0:禁用 1:啟用 status int ); -- 添加資料 insert into tb_brand (brand_name, company_name, ordered, description, status) values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0), ('華為', '華為技術有限公司', 100, '華為致力于把數字世界帶入每個人、每個家庭、每個組織,構建萬物互聯的智能世界', 1), ('小米', '小米科技有限公司', 50, 'are you ok', 1); SELECT * FROM tb_brand; -
物體類
public class Brand { private Integer id; private String brand_name; private String company_name; private Integer ordered; private String description; private Integer status; public Brand() { } public Brand( Integer id, String brand_name, String company_name, Integer ordered, String description, Integer status ) { this.id = id; this.brand_name = brand_name; this.company_name = company_name; this.ordered = ordered; this.description = description; this.status = status; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getBrand_name() { return brand_name; } public void setBrand_name(String brand_name) { this.brand_name = brand_name; } public String getCompany_name() { return company_name; } public void setCompany_name(String company_name) { this.company_name = company_name; } public Integer getOrdered() { return ordered; } public void setOrdered(Integer ordered) { this.ordered = ordered; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } @Override public String toString() { return "Brand{" + "id=" + id + ", brand_name='" + brand_name + '\'' + ", company_name='" + company_name + '\'' + ", ordered=" + ordered + ", description='" + description + '\'' + ", status=" + status + '}'; } } -
安裝插件MyBatisX
-
步驟
- 撰寫介面方法
Mapper介面- 引數
- 回傳值
- 在SQL映射檔案中撰寫SQL陳述句
- MyBatisX插件自動補全
- 撰寫SQL
- 若資料庫欄位名和物體類欄位名不同,則需要解決該問題(見 5.2 SQL映射檔案)
- 撰寫執行測驗
- 獲取SqlSessionFactory
- 獲取sqlSession物件
- 獲取mapper介面的代理物件
- 執行方法
- 釋放資源
- 撰寫介面方法
5.2 查詢所有資料
本節要點:
- 測驗類的撰寫方式
- 解決資料庫欄位和物體類欄位名不同的問題
-
撰寫介面方法
public interface BrandMapper { public List<Brand> selectAll(); } -
撰寫SQL映射檔案
<?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"> <!-- namespace:命名空間 --> <mapper namespace="priv.dandelion.mapper.BrandMapper"> <!-- 起別名解決資料庫和物體類欄位名不同問題 <sql id="brand_column"> id, brand_name as brandName, company_name as companyName, ordered, description, status </sql> <select id="selectAll" resultType="priv.dandelion.entity.Brand"> select * from tb_brand; select <include refid="brand_column"/> from tb_brand; </select> --> <!-- resultMap解決資料庫和物體類欄位不同問題 --> <resultMap id="brandResultMap" type="brand"> <result column="brand_name" property="brandName" /> <result column="company_name" property="companyName" /> </resultMap> <!-- 不使用resultType, 使用resultMap --> <select id="selectAll" resultMap="brandResultMap"> select * from tb_brand; </select> </mapper> -
撰寫測驗方法
@Test public void testSelectAll() throws IOException { // 獲取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 獲取sqlSession物件 SqlSession sqlSession = sqlSessionFactory.openSession(); // 獲取mapper介面的代理物件 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); // 執行方法 List<Brand> brands = brandMapper.selectAll(); System.out.println(brands); // 釋放資源 sqlSession.close(); }
5.3 查詢
本節要點:
- MyBatis的SQL映射檔案中,SQL陳述句如何接收對應引數
-
使用占位符進行引數傳遞
-
占位符名稱和引數保持一致
-
占位符
#{占位符名}:會替換為?,防止SQL注入,一般用于替換欄位值${占位符名}:存在SQL注入問題,一般用于執行動態SQL陳述句,如表名列名不固定的情況(見)
-
-
撰寫介面方法
void update(Brand brand); -
SQL映射檔案查詢代碼標簽
<resultMap id="brandResultMap" type="brand"> <result column="brand_name" property="brandName" /> <result column="company_name" property="companyName" /> </resultMap> <select id="selectById" resultMap="brandResultMap"> select * from tb_brand where id = #{id}; </select> -
測驗方法
@Test public void testSelectByCondition() throws IOException { // 接收引數 int status = 1; String companyName = "華為"; String brandName = "華為"; // 獲取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 獲取sqlSession物件 SqlSession sqlSession = sqlSessionFactory.openSession(); // 獲取mapper介面的代理物件 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); // 執行方法 companyName = "%" + companyName + "%"; brandName = "%" + brandName + "%"; List<Brand> brands = brandMapper.selectByCondition(status, companyName, brandName); System.out.println(brands); // 釋放資源 sqlSession.close(); }
5.4 多條件查詢
本節要點:
- 多條件查詢:如果有多個引數,需要使用
@Paran("SQL引數占位符名稱")注解- 多條件的動態條件查詢:物件屬性名稱要和引數占位符名稱一致
(詳見5-2解決資料庫欄位和物體類欄位名不同的問題)- 單條件的動態條件查詢:保證key要和引數占位符名稱一致
-
多條件查詢
-
SQL映射檔案
<!-- resultMap解決資料庫和物體類欄位不同問題 --> <resultMap id="brandResultMap" type="brand"> <result column="brand_name" property="brandName"/> <result column="company_name" property="companyName"/> </resultMap> <!-- 條件查詢 --> <select id="selectByCondition" resultMap="brandResultMap"> select * from tb_brand where status = #{status} and company_name like #{companyName} and brand_name like #{brandName} </select> -
散裝引數
-
介面
// 散裝引數 List<Brand> selectByCondition( @Param("status")int status, @Param("companyName")String companyName, @Param("brandName")String brandName ); -
測驗方法
@Test public void testSelectByCondition() throws IOException { // 接收引數 int status = 1; String companyName = "華為"; String brandName = "華為"; // 獲取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 獲取sqlSession物件 SqlSession sqlSession = sqlSessionFactory.openSession(); // 獲取mapper介面的代理物件 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); // 執行方法 companyName = "%" + companyName + "%"; brandName = "%" + brandName + "%"; List<Brand> brands = brandMapper.selectByCondition( status, companyName, brandName); System.out.println(brands); // 釋放資源 sqlSession.close(); }
-
-
物件引數
-
介面
// 物件引數 List<Brand> selectByCondition(Brand brand); -
測驗方法
// 細節不表,僅展示執行方法 // 執行方法 Brand brand = new Brand(); brand.setStatus(status); brand.setCompanyName("%" + companyName + "%"); brand.setBrandName("%" + brandName + "%"); List<Brand> brands = brandMapper.selectByCondition(brand); System.out.println(brands);
-
-
map集合引數
-
介面
// 集合引數 List<Brand> selectByCondition(Map map); -
測驗方法
// 細節不表,僅展示執行方法 // 執行方法 Map map = new HashMap(); map.put("status", status); map.put("companyName", "%" + companyName + "%"); map.put("brandName", "%" + brandName + "%"); List<Brand> brands = brandMapper.selectByCondition(map); System.out.println(brands);
-
-
-
多條件動態條件查詢
優化條件查詢,如頁面上表單存在多個條件選項,但實際填寫表單僅使用部分條件篩選的情況
-
SQL映射檔案
<!-- resultMap解決資料庫和物體類欄位不同問題 --> <resultMap id="brandResultMap" type="brand"> <result column="brand_name" property="brandName"/> <result column="company_name" property="companyName"/> </resultMap> <!-- 動態條件查詢 --> <select id="selectByCondition" resultMap="brandResultMap"> select * from tb_brand <where> <if test="status != null"> status = #{status} </if> <if test="companyName != null"> and company_name like #{companyName} </if> <if test="brandName != null"> and brand_name like #{brandName} </if> </where> </select>注:
-
if標簽的test屬性中可以包含邏輯或等邏輯判斷,使用and、or進行連接 -
若條件SQL中同時包含
AND等連接符- 對所有的條件前都加
AND,并在WHERE后加任意真判斷,即WHERE 1=1 AND ... AND ... - 加入
<if></if>判斷標簽造輪子,自行決定添加AND的條件 - 使用
<where></where>標簽替換原SQL中的WHERE關鍵字,MyBatis將自動進行語法修正,如示例所示
- 對所有的條件前都加
-
-
-
單條件的動態條件查詢
優化條件查詢:如表單中存在多個條件篩選,但僅有其中一個生效的情況
- 使用
標簽 choose標簽類似于Java中的switchwhen標簽類似于Java中的caseotherwise標簽類似于Java中的default
-
SQL映射檔案
<!-- resultMap解決資料庫和物體類欄位不同問題 --> <resultMap id="brandResultMap" type="brand"> <result column="brand_name" property="brandName"/> <result column="company_name" property="companyName"/> </resultMap> <!-- 單條件動態查詢 --> <select id="selectByConditionSingle" resultMap="brandResultMap"> select * from tb_brand <where> <choose> <when test="status != null"> status = #{status} </when> <when test="companyName != null and companyName != ''"> company_name like #{companyName} </when> <when test="brandName != null and brandName != ''"> brand_name like #{brandName} </when> </choose> </where> </select>
- 使用
5.6 添加資料與MyBatis事務
-
添加
-
介面
// 添加 void add(Brand brand); -
SQL映射檔案
<insert id="add"> insert into tb_brand (brand_name, company_name, ordered, description, status) values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status}); </insert> -
測驗方法
@Test public void testAdd() throws IOException { // 接收引數 int status = 1; String companyName = "aaa"; String brandName = "xxx"; String description = "這是一段介紹"; int ordered = 100; // 獲取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 獲取sqlSession物件 // SqlSession sqlSession = sqlSessionFactory.openSession(); SqlSession sqlSession = sqlSessionFactory.openSession(true); // 獲取mapper介面的代理物件 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); // 執行方法 Brand brand = new Brand(); brand.setStatus(1); brand.setBrandName(brandName); brand.setCompanyName(companyName); brand.setDescription(description); brand.setOrdered(ordered); brandMapper.add(brand); System.out.println("添加成功"); // 提交事務 // sqlSession.commit(); // 釋放資源 sqlSession.close(); }
-
-
Mybatis事務
MyBatis默認手動事務,執行添加等操作時會自動回滾
-
MyBayis事務處理的方法
// 方法一:在獲取sqlSession物件時設定引數,開啟自動事務 SqlSession sqlSession = sqlSessionFactory.openSession(true); sqlSession.close(); // 方法二:手動提交事務 SqlSession sqlSession = sqlSessionFactory.openSession(); sqlSession.commit(); sqlSession.close();
-
-
添加 - 主鍵回傳
傳入物體類物件進行資料添加,在資料添加完成后,會將
id資訊寫回該物體類物件-
SQL映射檔案
<insert id="add" useGeneratedKeys="true" keyProperty="id"> insert into tb_brand (brand_name, company_name, ordered, description, status) values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status}); </insert> -
獲取寫回資訊
Integer id = brand.getId();
-
5.7 修改
-
修改整條資料
-
介面
// 修改,可使用int回傳值,回傳受影響行數 void update(Brand brand); -
SQL映射檔案
<update id="update"> update tb_brand set brand_name = #{brandName}, set company_name = #{companyName}, set ordered = #{ordered}, set description = #{description}, set status = #{status} where id = #{id}; </update>
-
-
修改部分欄位
優化上述代碼應對僅修改部分屬性導致其他屬性資料丟失問題
使用
<set></set>標簽替換set關鍵字串列,區別于<where></where>標簽,注意語法-
SQL映射檔案
<update id="update"> update tb_brand <set> <if test="brandName != null and brandName != ''"> brand_name = #{brandName}, </if> <if test="companyName != null and companyName != ''"> company_name = #{companyName}, </if> <if test="ordered != null"> ordered = #{ordered}, </if> <if test="description != null and description != ''"> description = #{description}, </if> <if test="status != null"> status = #{status}, </if> </set> where id = #{id}; </update> -
測驗代碼
@Test public void testUpdate() throws IOException { // 接收引數 int id = 5; int status = 0; String companyName = "AAA"; String brandName = "XXX"; int ordered = 300; // 獲取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 獲取sqlSession物件 SqlSession sqlSession = sqlSessionFactory.openSession(true); // 獲取mapper介面的代理物件 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); // 執行方法 Brand brand = new Brand(); brand.setId(id); brand.setStatus(status); brand.setBrandName(brandName); brand.setCompanyName(companyName); brand.setOrdered(ordered); brandMapper.update(brand); System.out.println("修改成功"); // 釋放資源 sqlSession.close(); }
-
5.8 洗掉資料
-
洗掉一條資料
-
介面
// 洗掉一條資料 void deleteById(int id); -
SQL映射檔案
<delete id="deleteById"> delete from tb_brand where id = #{id}; </delete> -
測驗
@Test public void testDeleteById() throws IOException { // 接收引數 int id = 5; // 獲取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 獲取sqlSession物件 SqlSession sqlSession = sqlSessionFactory.openSession(true); // 獲取mapper介面的代理物件 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); // 執行方法 brandMapper.deleteById(id); System.out.println("洗掉成功"); // 釋放資源 sqlSession.close(); }
-
-
批量洗掉資料
用于解決洗掉時傳入引數為陣列的情況
- 使用
<foreach></foreach>標簽代替SQL陳述句中的id in (?, ?, ..., ?)collection屬性為MyBatis封裝后陣列對應的key,封裝后屬性值應為array(見注釋)MyBatis默認會將陣列引數封裝為Map集合,其key為array,即array = ids- 可在介面中對引數陣列使用
@Param注解,將封裝后的key手動命名,則可在映射檔案中使用
separator屬性為分隔符open和close屬性分別為在<foreach></foreach>前后拼接字符,主要用于代碼規范,示例中未展示
-
介面
// 洗掉多個資料 void deleteByIds(@Param("ids")int[] ids); -
SQL映射檔案
<delete id="deleteByIds"> delete from tb_brand where id in ( <!-- <foreach collection="array" item="id"> --> <foreach collection="ids" item="id" separator=","> #{id} </foreach> ); </delete> -
測驗
@Test public void testDeleteByIds() throws IOException { // 接收引數 int[] ids = {6, 7}; // 獲取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 獲取sqlSession物件 SqlSession sqlSession = sqlSessionFactory.openSession(true); // 獲取mapper介面的代理物件 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); // 執行方法 brandMapper.deleteByIds(ids); System.out.println("洗掉成功"); // 釋放資源 sqlSession.close(); }
- 使用
5.9 MyBatis引數傳遞
-
概述
-
多個引數
設有如下代碼:
User select(@Param("username") String username,@Param("password") String password);MyBatis會將散裝的多個引數封裝為Map集合
-
若不使用
@Param注解,則會使用以下命名規則:map.put("arg0",引數值1); map.put("arg1",引數值2); map.put("param1",引數值1); map.put("param2",引數值2);即Map集合中的引數的key分別為
arg0, arg1, param1, param2 -
使用
@Param注解會將Map集合中的引數的arg替換為指定內容,增強其可讀性
-
-
單個引數
-
POJO型別:直接使用,要求屬性名和引數占位符名稱一致(見 5.2 SQL映射檔案)
-
Map集合型別:直接使用,要求key和引數占位符名稱一致(見 5.2 SQL映射檔案)
-
Collection集合型別:封裝Map集合,可以使用@Param注解替換Map集合中默認arg鍵名
map.put("arg0",collection集合); map.put("collection",collection集合; -
List集合型別:封裝為Map集合,可以使用@Param注解,替換Map集合中默認的arg鍵名
map.put("arg0",list集合); map.put("collection",list集合); map.put("list",list集合); -
Array型別:封裝為Map集合,可以使用@Param注解,替換Map集合中默認的arg鍵名
map.put("arg0",陣列); map.put("array",陣列); -
其他型別:直接使用,與引數占位符無關,但盡量見名知意
-
6、通過注解實作CRUD
-
概述
- 用于簡化開發,可以對簡單的查詢使用注解進行操作,以替換
xml中的statement - 對于復雜的查詢,仍然建議使用
xml組態檔,否則代碼會十分混亂
- 用于簡化開發,可以對簡單的查詢使用注解進行操作,以替換
-
使用方法
-
注解(部分)
- 查詢 :
@Select - 添加 :
@Insert - 修改 :
@Update - 洗掉 :
@Delete
- 查詢 :
-
示例
-
使用注解簡化查詢
-
原介面
Brand selectById(int id); -
原SQL映射檔案
<!-- resultMap解決資料庫和物體類欄位不同問題 --> <resultMap id="brandResultMap" type="brand"> <result column="brand_name" property="brandName"/> <result column="company_name" property="companyName"/> </resultMap> <select id="selectById" resultMap="brandResultMap"> select * from tb_brand where id = #{id}; </select>
-
使用注解進行開發
-
介面
@ResultMap("brandResultMap") // 解決資料庫和物體類欄位名稱不同 @Select("select * from tb_brand where id = #{id}") // 查詢陳述句 Brand selectById(int id); -
SQL映射檔案:不再需要原先的
statement<!-- resultMap解決資料庫和物體類欄位不同問題 --> <resultMap id="brandResultMap" type="brand"> <result column="brand_name" property="brandName"/> <result column="company_name" property="companyName"/> </resultMap> <!-- <select id="selectById" resultMap="brandResultMap"> select * from tb_brand where id = #{id}; </select> -->
-
-
-
-
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/503077.html
標籤:其他
