目錄
1.??MyBatis添加數據
1.1.?持久層接口添加方法
1.2.?映射文件添加標簽
1.3.?編寫測試方法
2.???MyBatis修改數據
2.1. 代碼的優化
2.2.?持久層接口添加方法
2.3.?映射文件添加標簽
2.4. 編寫測試方法
3.?🗑?MyBatis刪除數據與根據Id查詢
3.1. 刪除用戶
3.2.?根據ID查詢用戶?
4.?🌫?MyBatis模糊查詢
4.1.?使用 # 定義參數
?4.2.?使用$定義參數
?4.3.?使用 定義參數
?
5. 總結
💡【開發哲學共勉】
在 MyBatis 的世界里,事務提交是對數據變更的鄭重承諾,參數綁定藏著對安全的敬畏,資源閉環是對系統的溫柔守護,而接口與映射的一 一對應,恰是規范賦予效率的禮物
🎉 前言
本節來講解一下如何使用MyBatis來對數據庫做一個基本的增刪改查操作,希望能夠幫助到你(??????)??
個人主頁:藝杯羹🌿
系列專欄:MyBatis🚀
1.??MyBatis添加數據
現在來演示一下如何添加用戶
1.1.?持久層接口添加方法
// 寫在UserMapper接口里
void add(User user);
1.2.?映射文件添加標簽
// 寫在UserMapper.xml配置文件中
<insert id="add" parameterType="com.itbaizhan.pojo.User">insert into user(username,sex,address) values(#{username},#{sex},#{address})
</insert>
1.3.?編寫測試方法
// 在測試包下的測試類里進行測試
@Test
public void testAdd() throws Exception{InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();SqlSessionFactory factory = builder.build(is);SqlSession session = factory.openSession();UserMapper mapper = session.getMapper(UserMapper.class);User user = new User("羅陽", "男", "北京");mapper.add(user);// 提交事務,默認手動提交事務// 所以要先提交事務,然后再關閉資源// 如果沒有提交事務,雖然不會報錯,但是數據不會寫到表當中session.commit();session.close();is.close();}
接口如圖:
注意:
- 當接口方法的參數類型為POJO類型時,SQL語句中綁定參數時使用 #{POJO的屬性名} ?即可
- MyBatis事務默認手動提交,所以在執行完增刪改方法后,需要手動調用SqlSession對象的事務提交方法,否則數據庫將不發生改變
查詢不改變數據庫,所以不用提交事務
2.???MyBatis修改數據
因為在操作數據庫的時候,像前面的配置獲取SqlSession的代碼,是可以復用的,所以這里先將這個配置獲取SqlSession的代碼提取出來
2.1. 代碼的優化
MyBatis的測試方法在操作數據庫前都需要獲取代理對象,操作數據庫后都需要釋放資源,可以利用Junit的前置后置方法,優化測試類代碼
InputStream is = null;
SqlSession session = null;
UserMapper userMapper = null;@Before
public void before() throws IOException {// (1)讀取核心配置文件is = Resources.getResourceAsStream("SqlMapConfig.xml");// (2)創建SqlSessionFactoryBuilder對象SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();// (3)SqlSessionFactoryBuilder對象獲取SqlSessionFactory對象SqlSessionFactory factory = builder.build(is);// (4)SqlSessionFactory對象獲取SqlSession對象session = factory.openSession();// (5)獲取代理對象userMapper = session.getMapper(UserMapper.class);
}@After
public void after() throws IOException {// 釋放資源session.close();is.close();
}
現在來修改一下用戶
2.2.?持久層接口添加方法
void update(User user);
2.3.?映射文件添加標簽
<update id="update" parameterType="com.yibeigen.pojo.User">update Userset username = #{username}, sex = #{sex}, address=#{address}where id = #{id}
</update>
2.4. 編寫測試方法
// 這里直接使用Mapper動態代理就可以了(??????)??
@Test
public void testUpdate(){User user = new User(6, "老王", "男", "溆浦");userMapper.update(user);sqlSession.commit();
}
3.?🗑?MyBatis刪除數據與根據Id查詢
因為刪除和查詢都和上面操作差不多,所以這里就兩個一起講了
3.1. 刪除用戶
1. 持久層接口添加方法
void delete(int userId);
2. 映射文件添加標簽
<delete id="delete" parameterType="int">delete from user where id = #{id}
</delete>
注:當方法的參數類型是簡單數據類型時,#{}中可以寫任意名稱
簡單數據類型:基本數據類型、字符串等
3. 編寫測試方法
@Test
public void testDelete(){userMapper.delete(8);session.commit();
}
3.2.?根據ID查詢用戶?
1. 持久層接口添加方法
User findById( int userId );
2. 映射文件添加標簽
<select id="findById" parameterType="int" resultType="com.yibeigen.pojo.User">select * from user where id = #{userId}
</select>
3.?編寫測試方法
@Test
public void testFindById(){User user = userMapper.findById(1);System.out.println(user);
}
4.?🌫?MyBatis模糊查詢
模糊查詢一共有三個寫法:#, $, <bind>
4.1.?使用 # 定義參數
1.?持久層接口添加方法
List<User> findByNameLike(String username);
2.?映射文件添加標簽
<select id="findByUsernameLike" parameterType="String" resultType="com.yibeigen.pojo.User">select * from user where username like #{name}</select>
3.?編寫測試方法
@Test
public void testFindByNameLike(){List<User> users = userMapper.findByNameLike("%王%");for (User user:users){System.out.println(user);}
}
這里使用 # 和上面寫的#是一個意思,像這里的第2步映射文件中的 #{name} 就相當于是這個類中的name值
然后我們在測試類中傳值的時候,要注意加上 %?
我們看到在映射文件中,parameterType 的值為 string? 而沒有寫 java.lang.String?
這是因為,系統已經給 java.lang.String?取了別名 string,所以直接用就可以了
那么現在看看都給普通數據類型取了什么別名
數據類型 | 別名 | 數據類型 | 別名 |
---|---|---|---|
byte | _byte | Byte | byte |
long | _long | Long | long |
short | _short | Short | short |
int | _int | Integer | int/integer |
int | _integer | Double | double |
double | _double | Float | float |
float | _float | Boolean | boolean |
boolean | _boolean | Date | date |
String | string | BigDecimal | decimal/bigdecimal |
Object | object | Map | map |
HashMap | hashmap | List | list |
ArrayList | arraylist | Collection | collection |
Iterator | iterator |
?4.2.?使用$定義參數
模糊查詢如果不想在調用方法時參數加%,可以使用拼接參數的方式設置
Sql:
<select id="findByUsernameLike" parameterType="string" resultType="com.yibeigen.pojo.User">select * from user where username like '%${value}%'
</select>%${value}%:必須這么寫
測試方法寫法如下:
@Test
public void testFindByNameLike(){List<User> users = userMapper.findByUsernameLike("金");users.forEach(System.out::println);
}
#和$的區別:
- #表示sql模板的占位符,$表示將字符串拼接到sql模板中。
- #可以防止sql注入,一般能用就不用$。
- ${}內部的參數名必須寫value。?
?4.3.?使用 <bind> 定義參數
如果使用 #? 還不想在調用方法的參數中添加 %?
可以使用 <bind>?,<bind>? 允許我們在 Sql語句以外創建一個變量
并可以將其綁定到當前的Sql語句中。用法如下:
<select id="findByUsernameLike" parameterType="string" resultType="com.yibeigen.pojo.User"><bind name="likeName" value="'%'+username+'%'"/>select * from user where username like #{likeName}
</select>
測試方法寫法如下:
@Test
public void testFindByNameLike(){List<User> users = userMapper.findByUsernameLike("金");users.forEach(System.out::println);
}
5. 總結
到此,文章就告一段落,希望能夠幫助到你🙂?