1. 程式人生 > >如何通過Mybatis實現資料的增刪改查(CRUD)操作?

如何通過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);  

這下就一切正常了,不信的可以試試。這也告訴我們一個道理,其實看別人寫的東西都很簡單,但是其實往往看到的和自己動手操作的往往自己得到的並不一樣,只有自己動手寫過才能更清晰的知道其中的知識,也掌握的更牢固。這也是我為什麼學什麼都自己嘗試一遍的原因。