您好,登錄后才能下訂單哦!
怎么在MyBatis中實現(xiàn)增刪改查?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
優(yōu)化測試方法
在測試方法中,讀取配置文件,生產(chǎn) SqlSession,釋放資源等等,在每一測試方法的時候,都是重復(fù)的,所以我們完全可以提出出這一部分,防止大量的重復(fù)代碼
@Before public void init() throws Exception{ //讀取配置文件 inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); //創(chuàng)建SqlSessionFactory工廠 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); //使用工廠生產(chǎn)SqlSession對象 sqlSession= factory.openSession(); //使用SqlSession創(chuàng)建Mapper接口的代理對象 userMapper = sqlSession.getMapper(UserMapper.class); } @After public void destroy() throws Exception{ sqlSession.close(); inputStream.close(); }
在這兩個方法上增加 @Before 和 @Aftrer 注解,就可以保證,init() 和 destory() 這兩個方法,分別在我們真正被測試的方法的前后執(zhí)行
(一) 增添操作 (1) 編寫代碼
首先,在 UserMapper 接口中 增加對應(yīng)的方法
public interface UserMapper { /** * 增加用戶 * @param user */ void addUser(User user); }
接著,在SQL映射文件中,增加新增的映射配置,這些有關(guān)內(nèi)容放在 <insert></insert>
標(biāo)簽對中,具體代碼如下
<insert id="addUser" parameterType="cn.ideal.domain.User"> insert into user(username,telephone,birthday,gender,address)values(#{username},# {telephone},#{birthday},#{gender},#{address}) </insert>
(2) 說明:
1、id 屬性,自然是對應(yīng)的方法名,而由于這里,我們并不需要拿到返回信息,所以這里并沒有返回參數(shù) resultType,而方法中的參數(shù)又為一個 JavaBean 類,也就是User實體類,所以需要在標(biāo)簽屬性中,添加一個 parameterType 屬性,其中需要指定這個實體類
2、在文本中書寫插入的SQL語句,由于實體類中已經(jīng)快捷生成了對應(yīng)的 get set 方法,所一可以使用 #{}
的方式代表對應(yīng)的值
3、提示,數(shù)據(jù)庫中id為自增,所以并不需要設(shè)置 id
(3) 注意:
由于添加是更新類的語句,所以在執(zhí)行插入語句后,需要提交事務(wù),也就是執(zhí)行對應(yīng)的 commit方法,以提交更新操作,若沒有這一句,即使不會報錯,也無法正常存入,會被回滾,且這個id被占用
(4) 測試代碼:
/** * 測試新增用戶 * @throws Exception */ @Test public void testUpdateUser() throws Exception{ User user = new User(); user.setId(17); user.setUsername("修改"); user.setTelephone("18899999999"); user.setBirthday(new Date()); user.setGender("女"); user.setAddress("廣州"); //執(zhí)行方法 userMapper.updateUser(user); }
(5) 執(zhí)行結(jié)果:
控制臺:
(6) 獲取新增用戶的id值
首先對于 MySQL自增主鍵來說,在執(zhí)行 insert語句之前,MySQL 會自動生成一個自增主鍵,insert執(zhí)行后,通過 SELECT LAST_INSERT_ID()
可以獲取這條剛插入記錄的自增主鍵
在 SQL 映射配置文件中,需要借助 <selectKey></selectKey>
標(biāo)簽,有一個屬性比較特殊,order 屬性,它代表著相對于插入操作的執(zhí)行時間,before-之前,after-之后
注:該標(biāo)簽插入到 <select></select>
中
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> SELECT LAST_INSERT_ID(); </selectKey>
測試一下
@Test public void testAddUser() throws Exception{ User user = new User(); user.setUsername("增加"); user.setTelephone("12266660000"); user.setBirthday(new Date()); user.setGender("男"); user.setAddress("珠海"); System.out.println("執(zhí)行插入前" + user); //執(zhí)行方法 userMapper.addUser(user); System.out.println("執(zhí)行插入后" + user); }
執(zhí)行效果
(二) 修改操作 (1) 編寫代碼
在 UserMapper 接口中增加修改方法
public interface UserMapper { /** * 更新用戶 * @param user */ void updateUser(User user); }
在 SQL 映射文件中增加語句,內(nèi)容包括在 <update></update>
中,需要注意的基本與添加操作是一致的
<update id="updateUser" parameterType="cn.ideal.domain.User"> update user set username=#{username},telephone=#{telephone},birthday=#{birthday},gender=#{gender},address=#{address} where id=#{id} </update>
(2) 測試代碼
/** * 測試新增用戶 * @throws Exception */ @Test public void testAddUser() throws Exception{ User user = new User(); user.setUsername("增加"); user.setTelephone("12266668888"); user.setBirthday(new Date()); user.setGender("女"); user.setAddress("成都"); //執(zhí)行方法 userMapper.addUser(user); }
(3) 執(zhí)行效果
(三) 刪除操作 (1) 編寫代碼
接口中增加刪除方法
public interface UserMapper { /** * 刪除用戶 * @param uid */ void deleteUser(Integer uid); }
在SQL映射文件中,使用 <delete></delete>
標(biāo)簽對進(jìn)行內(nèi)容的書寫,需要注意的是,由于我們傳入的參數(shù)是一個 Integer類型的用戶id,所以參數(shù)類型的值為 parameterType
<delete id="deleteUser" parameterType="java.lang.Integer"> delete from user where id=#{id} </delete>
(2) 測試代碼
/** * 測試刪除用戶 * @throws Exception */ @Test public void testDeleteUser() throws Exception{ //執(zhí)行方法 userMapper.deleteUser(17); }
(3) 執(zhí)行效果
(四) 模糊查詢
由于查詢?nèi)糠浅:唵危@里就不展示了,基本流程都是一樣的
(1) 編寫代碼
在 UserMapper 接口中編寫方法
public interface UserMapper { /** * 通過姓名模糊查詢 * @param username * @return */ List<User> findByName(String username); }
在 SQL 映射文件中新增查詢語句
<select id="findByName" parameterType="java.lang.String" resultType="cn.ideal.domain.User"> select * from user where username like #{username} </select>
(2) 測試代碼
/** * 測試模糊查詢 * @throws Exception */ @Test public void testFindByName() throws Exception{ List<User> users = userMapper.findByName("%張%"); for (User user : users){ System.out.println(user); } }
(3) 注意
在使用模糊查詢的時候,我們需要在查詢條件的兩側(cè)拼接兩個 “%” 字符串,這個時候有兩種解決方案,一種就是像在我上述代碼中,在測試時將字符串補充完整,還有一種方式就是 使用 ${}
,它在 SQL配置文件中代表一個 “拼接符號” ,也就是說可以這樣寫 SQL語句
select * from user where username like '%{value}'
可接受的類型有,普通類型(此情況下{}內(nèi)部只能寫value),JavaBean,HashMap
但是使用 %{}
拼接字符串的時候,會引起 SQL注入,所以不是很推薦使用
(4) 執(zhí)行效果
(五) 自定義包裝類作為查詢條件
Mapper 的輸入映射樣例中,我們對于基本數(shù)據(jù)類型和基本數(shù)據(jù)包裝類,都有了一定的了解,而下面我們來聊一聊關(guān)于相對復(fù)雜的一種情況,那就是自定義包裝類
先講一個需求:還是關(guān)于用戶的查詢,但是查詢條件復(fù)雜了一些,不僅僅局限于用戶的信息,而且可能還包括訂單,購物車,或者與用戶一些行為相關(guān)的信息,那么如何實現(xiàn)這樣一種需求呢?
那我們想,可不可以,在 User 類中增加一些我們需要的信息
從代碼的角度來看,在 User 中添加的字段與數(shù)據(jù)庫不一定能對應(yīng)起來,在原來的基礎(chǔ)上做修改,就會影響 User 作為數(shù)據(jù)庫映射對象的功能,所以我們可以創(chuàng)建一個 UserInstance 類,繼承 User類就可以在其中為某些業(yè)務(wù)添加一些不屬于數(shù)據(jù)庫的字段了
(1) 定義包裝類
package cn.ideal.domain; public class QueryUserVo { private UserInstance userInstance; public UserInstance getUserInstance() { return userInstance; } public void setUserInstance(UserInstance userInstance) { this.userInstance = userInstance; } //其他查詢條件,例如訂單,購物車等等 }
(2) 配置 Mapper 文件
我們這里使用用戶的性別以及對姓名的模糊查詢,來寫SQL 當(dāng)然,你也可以自己通過別的信息寫SQL
<select id="findUserByVo" parameterType="cn.ideal.domain.QueryUserVo" resultType="cn.ideal.domain.UserInstance"> select * from user where user.gender=#{userInstance.gender} and user.username like #{userInstance.username} </select>
在QueryUserVo 中,封裝的是查詢信息的各種對象,為什么上述代碼可以直接通過 userInstance.gender 直接取出對應(yīng)的屬性,這種方式叫做 OGNL 表達(dá)式,在類中 我們的寫法通常是 user.getUsername
但在寫法上,OGNL 表達(dá)式將get給省略了
(3) 測試代碼
/** * 包裝對象作為查詢參數(shù) * @throws Exception */ @Test public void testFindUserByVo() throws Exception{ //創(chuàng)建包裝對象,設(shè)置查詢條件 QueryUserVo queryUserVo = new QueryUserVo(); UserInstance userInstance = new UserInstance(); userInstance.setGender("女"); userInstance.setUsername("%張%"); queryUserVo.setUserInstance(userInstance); //調(diào)用 UserMapper 的方法 List<UserInstance> userInstances = userMapper.findUserByVo(queryUserVo); for (UserInstance u : userInstances){ System.out.println(u); } }
(4) 執(zhí)行效果
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。