一、本課目標(全是重點)
- 掌握使用insert完成增加操作
- 掌握使用update完成修改操作
- 掌握使用@param注解實現多參數入參
- 掌握使用delete完成刪除操作
二、insert
image.png
完成增加操作需要使用insert元素映射插入語句。insert元素有兩個屬性:id和parameterType。id和select元素中的id作用是一樣的,是作為命名空間中的唯一標識。parameter其實跟select元素里面的parameterType也是一樣的,都是參數的數據類型,這里因為插入肯定是有參數傳入的,所以這類也有parameteType。
UserMapper.xml配置文件:
<insert id="add" parameterType="User">
insert into smbms_user (userCode,userName,userPassword,
gender,birthday,phone,address,userRole,
createdBy,creationDate) values (
#{userCode},#{userName},#{userPassword},
#{gender},#{birthday},#{phone},
#{address},#{userRole},#{createdBy},
#{creationDate})
</insert>
接口代碼:
public int add(User user);
單元測試代碼:
@Test
public void testAdd() {
logger.debug("testAdd-------------------");
SqlSession sqlSession = null;
int count = 0;
sqlSession = MyBatisUtil.createSqlSession();
User user = new User();
try {
user.setUserCode("001");
user.setUserName("測試用戶001");
user.setAddress("測試地址");
user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2018-8-25"));
user.setGender(1);
user.setUserPassword("123456");
user.setPhone("13526543651");
user.setUserRole(1);
user.setCreatedBy(1);
user.setCreationDate(new Date());
count = sqlSession.getMapper(UserMapper.class).add(user);
sqlSession.commit();
} catch (ParseException e) {
e.printStackTrace();
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
logger.debug(count);
}
最終運行結果正常。
注:insert、update、delete元素均沒有resultType屬性。因為這三個最后的返回結果都是影響的行數,所以也不需要resulttype這個屬性。
三、update
image.png
配置文件;
<update id="modify" parameterType="user">
update smbms_user set userCode=#{userCode},
userName=#{userName},userPassword=#{userPassword},
gender=#{gender},phone=#{phone},address=#{address},
userRole=#{userRole},modifyBy=#{modifyBy},
modifyDate=#{modifyDate} where id=#{id}
</update>
接口方法:
public int modify(User user);
測試代碼:
@Test
public void testModify() {
logger.debug("testAdd-------------------");
SqlSession sqlSession = null;
int count = 0;
sqlSession = MyBatisUtil.createSqlSession();
User user = new User();
try {
user.setId(16);
user.setUserCode("001_M");
user.setUserName("測試用戶001_M");
user.setAddress("測試地址_M");
user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2018-8-25"));
user.setGender(1);
user.setUserPassword("123456");
user.setPhone("13526543651");
user.setUserRole(1);
user.setModifyBy(1);
user.setModifyDate(new Date());
count = sqlSession.getMapper(UserMapper.class).modify(user);
sqlSession.commit();
} catch (ParseException e) {
e.printStackTrace();
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
logger.debug(count);
}
測試結果正常。
注:剛開始沒有寫
sqlSession.commit();
的時候,進行測試時,在控制臺能輸出結果,但是數據庫中的數據并不會發生改變。
mybatis單獨使用時,使用SqlSession來處理事務,打開會話,事務處理開始,增刪改操作時要執行commit操作,事物提交后,關閉會話,事物結束。
四、多參數入參
需求說明:實現超市訂單管理系統—修改個人密碼功能
分析:
- 傳入參數(多個):用戶id和新密碼
- 使用注解@param來傳入多個參數
- 映射SQL中的參數:#{注解名稱}
配置文件:
<update id="updatePwd">
update smbms_user set userPassword=#{pwd}
where id=#{id}
</update>
接口代碼:
public int updatePwd(@Param("id")Integer id, @Param("pwd")String password);
測試代碼:
@Test
public void testUpdatePwd() {
logger.debug("testAdd-------------------");
SqlSession sqlSession = null;
int count = 0;
sqlSession = MyBatisUtil.createSqlSession();
try {
count = sqlSession.getMapper(UserMapper.class).updatePwd(16, "41312019");
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
logger.debug(count);
}
測試結果正常。
注:超過4個以上的參數最好封裝成對象入參,參數固定的業務方法最好直接使用多參數入參。
五、delete
image.png
配置文件;
<delete id="deleteUserById">
delete from smbms_user where id=#{id}
</delete>
接口代碼:
public int deleteUserById(@Param("id")Integer id);
測試代碼:
@Test
public void testDeleteUserById() {
logger.debug("testAdd-------------------");
SqlSession sqlSession = null;
int count = 0;
sqlSession = MyBatisUtil.createSqlSession();
try {
count = sqlSession.getMapper(UserMapper.class).deleteUserById(16);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
logger.debug(count);
}
測試結果正常。
注:基于良好的編程習慣,只要是沒有封裝直接傳入參數就都使用注解。
六、小結
image.png