MyBatis常规CURD详解及拓展~
目錄
- 1. insert(增)
- 2. delete(刪)
- 3. update(改)
- 4. select(查)
- SQL優化:Map傳參
- 示例:插入一個用戶
- map傳參優點
- 各種傳參對比
 
- 補充:模糊查詢
本文的實驗環境基于上篇博客 第一個MyBatis程序
Mapper.xml配置文件
- 配置文件中namespace中的名稱為對應Mapper接口的完整包名,必須一致!
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.UserMapper"><!--SQL語句-->
</mapper>
注意:增刪改需要提交事務
1. insert(增)
- insert– 映射插入語句
- insert語句兩個常見屬性,更多屬性查看中文文檔 - id:對應namespace中的方法名
- parameterType:參數類型
 
步驟:
-  編寫Mapper接口,在UserMapper中添加插入一個用戶的方法 返回值為受影響的行數,所以為int類型 
//insert一個用戶
int addUser(User user);
- 編寫Mapper.xml對應配置文件,在UserMapper.xml中添加insert語句
<insert id="addUser" parameterType="pojo.User">insert into mybatis.user(id,name,pwd) values (#{id},#{name},#{pwd});
</insert>
- 在測試類UserMapperTest中添加對應的測試方法進行測試
//需要提交事務
@Test
public void addUser() {//獲取sqlSession對象SqlSession sqlSession = MyBatisUtils.getSqlSession();//執行SQLUserMapper mapper = sqlSession.getMapper(UserMapper.class);mapper.addUser(new User(4, "zyx", "111111"));//提交事務sqlSession.commit();//關閉sqlSessionsqlSession.close();
}
2. delete(刪)
- delete– 映射刪除語句
- delete語句兩個常見屬性,更多屬性查看中文文檔 - id:對應namespace中的方法名
- parameterType:參數類型
 
步驟:
-  編寫Mapper接口,在UserMapper中添加刪除一個用戶的方法 返回值為受影響的行數,所以為int類型 
//刪除一個用戶
int deleteUser(int id);
- 編寫Mapper.xml對應配置文件,在UserMapper.xml中添加delete語句
<delete id="deleteUser" parameterType="int">delete from mybatis.user where id=#{id};
</delete>
- 在測試類UserMapperTest中添加對應的測試方法進行測試
//需要提交事務
@Test
public void addUser() {//獲取sqlSession對象SqlSession sqlSession = MyBatisUtils.getSqlSession();//執行SQLUserMapper mapper = sqlSession.getMapper(UserMapper.class);mapper.deleteUser(4);//提交事務sqlSession.commit();//關閉sqlSessionsqlSession.close();
}
3. update(改)
- update– 映射更新語句
- update語句兩個常見屬性,更多屬性查看中文文檔 - id:對應namespace中的方法名
- parameterType:參數類型
 
步驟:
-  編寫Mapper接口,在UserMapper中添加刪除一個修改用戶信息的方法 返回值為受影響的行數,所以為int類型 
//修改用戶
int updateUser(User user);
- 編寫Mapper.xml對應配置文件,在UserMapper.xml中添加update語句
<update id="updateUser" parameterType="pojo.User">update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id} ;
</update>
- 在測試類UserMapperTest中添加對應的測試方法進行測試
//需要提交事務
@Test
public void addUser() {//獲取sqlSession對象SqlSession sqlSession = MyBatisUtils.getSqlSession();//執行SQLUserMapper mapper = sqlSession.getMapper(UserMapper.class);mapper.updateUser(new User(4, "zyx", "222222"));//提交事務sqlSession.commit();//關閉sqlSessionsqlSession.close();
}
4. select(查)
- select– 映射查詢語句
- select語句有很多屬性可以詳細配置每一條SQL語句,這里是三個常見屬性,更多屬性查看中文文檔 - id:對應namespace中的方法名
- parameterType:參數類型
- resultType:SQL語句執行的返回值
 
步驟:
-  編寫Mapper接口,在UserMapper中添加刪除一個根據ID查詢用戶的方法 返回值為 
//根據ID查詢用戶
User getUserByID(int id);
- 編寫Mapper.xml對應配置文件,在UserMapper.xml中添加select語句
<select id="getUserByID" parameterType="int" resultType="pojo.User">select * from mybatis.user where id= #{id};
</select>
- 在測試類UserMapperTest中添加對應的測試方法進行測試
@Test
public void getUserByID() {//獲取sqlSession對象SqlSession sqlSession = MyBatisUtils.getSqlSession();//執行SQLUserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = mapper.getUserByID(1);System.out.println(user);//關閉sqlSessionsqlSession.close();
}
SQL優化:Map傳參
假設,我們的實體類或者數據庫中的表,字段或者參數過多,應該考慮使用Map
示例:插入一個用戶
1、在接口方法中,參數直接傳遞Map;
//增加一個用戶
int addUser2(Map<String, Object> map);
2、編寫sql語句的時候,需要傳遞參數類型,參數類型為map
<insert id="addUser2" parameterType="Map">insert into mybatis.user(id,name,pwd) values (#{userid},#{username},#{userpwd});
</insert>
3、編寫測試方法:在使用方法的時候,Map的 key 為 sql中取的值即可,沒有順序要求!
@Test
public void addUser2() {//獲取sqlSession對象SqlSession sqlSession = MyBatisUtils.getSqlSession();//執行SQLUserMapper mapper = sqlSession.getMapper(UserMapper.class);Map<String, Object> map = new HashMap<String, Object>();map.put("userid",5);map.put("username","hello");map.put("userpwd",333333);mapper.addUser2(map);//提交事務sqlSession.commit();//關閉sqlSessionsqlSession.close();
}
map傳參優點
對比上述方法:
 
- 在編寫sql語句的時候,參數名(map的key)可以任意,只要一一對應即可,不同于通過User對象傳參,參數名必須于字段名相同
id-->userid
name-->username
pwd-->userpwd
假設只需要修改一個密碼,通過一整個對象傳參必須new出一整個對象,其他屬性都必須實例化出來,而使用map傳參的時候,只需要傳一個密碼即可;
- 所以,當我們的實體類或者數據庫中的表,字段或者參數過多時,建議使用map傳參,可以針對單一字段,而不是以整體為單位
各種傳參對比
- Map傳遞參數,直接在sql中取出key即可 parameterType="Map"
- 對象傳遞參數,直接在sql中取對象的屬性即可 parameterType="Object"
- 只有一個基本類型參數的情況下,直接在sql中取到 parameterType="int"(一個參數可以省略parameterType)
補充:模糊查詢
模糊查詢的實現有兩種方法,我們以一個示例進行講解~
首先在接口中添加對應方法,這里進行name的模糊查詢
//模糊查詢
List<User> getUserLike(String value);
第1種:在Java代碼中添加sql通配符。
<select id="getUserLike" resultType="pojo.User">select * from mybatis.user where name like #{value}
</select>
@Testpublic void getUserLike() {//獲取sqlSession對象SqlSession sqlSession = MyBatisUtils.getSqlSession();//執行SQLUserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> userList = mapper.getUserLike("%z%");//添加sql通配符for (User user : userList) {System.out.println(user);}//關閉sqlSessionsqlSession.close();}
第2種:在sql語句中拼接通配符,可能會引起sql注入
<select id="getUserLike" resultType="pojo.User">select * from mybatis.user where name like "%"#{value}"%"
</select>
@Testpublic void getUserLike() {//獲取sqlSession對象SqlSession sqlSession = MyBatisUtils.getSqlSession();//執行SQLUserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> userList = mapper.getUserLike("z");for (User user : userList) {System.out.println(user);}//關閉sqlSessionsqlSession.close();}
總結:
-  對于模糊查詢的兩種方式,建議使用第一種方式,第二種方式存在sql注入的問題 
-  為了防止sql注入,所以參數盡量寫死,讓用戶傳入的是一個正確的參數 
總結
以上是生活随笔為你收集整理的MyBatis常规CURD详解及拓展~的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 万事开头难!最新MyBatis程序配置教
- 下一篇: MyBatis——XML配置解析
