如何通過Mybatis實現資料的增刪改查(CRUD)操作?
在上一篇文章中,我們應該算是簡單的進入了MyBatis的世界,在這篇文章中,我們從簡單的增刪改查說起,畢竟對於資料庫操作來說,這幾種操作是肯定逃不掉的。
在這篇文章中,我們不在對所有需要的東西全部列舉出來,而是在上一篇文章的基礎上進行修改。
首先,我們需要修改的就是介面類,提供增刪改查的方法,如下所示:
package com.majing.learning.mybatis.dao;
import com.majing.learning.mybatis.entity.User;
public interface UserDao {
/**
* 查詢
* @param userId
* @return
*/
User findUserById (int userId);
/**
* 增加
* @param user
*/
void addUser(User user);
/**
* 刪除
* @param userId
*/
void deleteUser(int userId);
/**
* 更新
* @param user
*/
void updateUser(User user);
}
緊接著,當然我們需要修改UserDaoMapper.xml檔案,畢竟我們要為每個方法提供對應的sql實現。下面給出調整後的配置檔案:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.majing.learning.mybatis.dao.UserDao">
<select id="findUserById" resultType="com.majing.learning.mybatis.entity.User">
select * from user where id = #{id}
</select>
<insert id="addUser" parameterType="com.majing.learning.mybatis.entity.User" useGeneratedKeys="true" keyProperty="id">
insert into user(name,password,age) values(#{name},#{password},#{age})
</insert>
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
<update id="updateUser" parameterType="com.majing.learning.mybatis.entity.User">
update user set name = #{name}, password = #{password}, age = #{age} where id = #{id}
</update>
</mapper>
至此,我們所需要修改的東西應該就沒了,下面我們來寫測試用例,先插入一條記錄,然後更新這條記錄,然後再查詢之前的記錄,最後刪除這條記錄。測試程式碼如下:
package com.majing.learning.mybatis;
import java.io.IOException;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.majing.learning.mybatis.dao.UserDao;
import com.majing.learning.mybatis.entity.User;
public class UserDaoTest {
@Test
public void findUserById(){
SqlSession sqlSession = getSessionFactory().openSession();
UserDao userMapper = sqlSession.getMapper(UserDao.class);
//增加一條新記錄
User user = new User();
user.setName("majing");
user.setPassword("19880101");
user.setAge(29);
userMapper.addUser(user);
//更新該記錄
user.setName("new_majing");
userMapper.updateUser(user);
//查詢該記錄
int id = user.getId();
user = null;
user = userMapper.findUserById(id);
System.out.println("更新後記錄為:"+user);
//刪除記錄
System.out.println("嘗試刪除該記錄...");
userMapper.deleteUser(id);
user = userMapper.findUserById(id);
if(user==null){
System.out.println("該記錄已刪除!");
}else{
System.out.println("該記錄未被成功刪除!");
}
}
// Mybatis 通過SqlSessionFactory獲取SqlSession, 然後才能通過SqlSession與資料庫進行互動
private static SqlSessionFactory getSessionFactory() {
SqlSessionFactory sessionFactory = null;
String resource = "configuration.xml";
try {
sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));
} catch (IOException e) {
e.printStackTrace();
}
return sessionFactory;
}
}
如果我們執行這個單元測試類,會得到如下的輸出,一切都是這麼正常,So easy:
但是,細心的讀者如果按照我說的步驟自己一步步操作的話,那麼很有可能就會發現問題!!!
什麼問題呢???
如果單步除錯的話,我們會發現雖然每一步都按照我們的意願進行了操作(增刪改查),但是目標資料庫中卻始終一條記錄都沒有!!!資料根本沒有插入到資料庫中。Oh my God!
有人知道為什麼了嗎?這裡就不賣關子了,其實我們在獲取資料庫連線的時候採用了MyBatis的預設配置,即不會自動提交。所以這裡我們需要設定一下,在獲取連線時設定sql語句是自動提交的。如下所示:
SqlSession sqlSession = getSessionFactory().openSession(true);
這下就一切正常了,不信的可以試試。這也告訴我們一個道理,其實看別人寫的東西都很簡單,但是其實往往看到的和自己動手操作的往往自己得到的並不一樣,只有自己動手寫過才能更清晰的知道其中的知識,也掌握的更牢固。這也是我為什麼學什麼都自己嘗試一遍的原因。