1. 程式人生 > >MyBatis資料持久化(三)增刪改查

MyBatis資料持久化(三)增刪改查

上篇文章中我們使用mybatis成功建立資料庫會話,並從表中查詢出相應的資料,本文在此基礎上介紹MyBatis另外幾種操作,即插入、修改、刪除記錄。
1.修改User.xml檔案,增加幾條sql語句:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="User">
    <select id
="queryUserInfoByName" parameterType="string" resultType="com.mybatis.domain.User">
select * from User where username = #{username} </select> <insert id="saveUser" parameterType="com.mybatis.domain.User"> insert into user(username,password,phone) values(#{username},#{password},#{phone}); </insert
>
<update id="updateUser" parameterType="com.mybatis.domain.User"> update user set password=#{password} where username=#{username} </update> <delete id="deleteUser" parameterType="com.mybatis.domain.User"> delete from user where username = #{username} </delete
>
</mapper>

2.新建測試類com.mybatis.exam3.MyBatisCRUD

package com.mybatis.exam3;

import java.io.IOException;
import java.io.Reader;

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.After;
import org.junit.Before;
import org.junit.Test;

import com.mybatis.domain.User;

public class MyBatisCRUD{
    private Reader reader = null;
    private SqlSessionFactory sessionFactory  = null;
    private SqlSession session = null;
    @Before
    public void before()
    {
        try {
            reader = Resources.getResourceAsReader("SqlMapConfig.xml");
            sessionFactory = new SqlSessionFactoryBuilder().build(reader);
            //建立一個數據庫會話
             session = sessionFactory.openSession();  
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Test
    public void testMybatisSelect()
    {           
            User user = (User)session.selectOne("User.queryUserInfoByName","小王");           
            //此處會呼叫user的toString方法
            System.out.println(user);   
    }

    @Test
    public void testMybatisInsert()
    {   
            User user = new User();
            user.setPassword("aaaa");
            user.setPhone("18909568934");
            user.setUsername("Jane");
            session.insert("User.saveUser", user);
            //mybatis事物預設不自動提交
            session.commit();   
    }

    @Test
    public void testMybatisUpdate()
    {   
            User user = new User();
            user.setPassword("bbbbb");
            user.setPhone("18909568934");
            user.setUsername("Jane");
            session.update("User.updateUser",user);
            //mybatis事物預設不自動提交
            session.commit();   
    }

    @Test
    public void testMybatisDelete()
    {   
            User user = new User();
            user.setPassword("bbbbb");
            user.setPhone("18909568934");
            user.setUsername("Jane");
            session.delete("User.deleteUser", user);
            //mybatis事物預設不自動提交
            session.commit();

    }
    @After
    public void after()
    {
        if(null != session)
        {
            session.close();
        }
    }
}

筆者對上節的程式碼進行了重構,把建立資料庫會話的程式碼放到了before方法中,該方法是經過@Before註解修飾過的,會在執行每個測試方法之前自動執行。

1.testMybatisSelect為資料查詢測試方法,和上節相同。

2.testMybatisInsert為資料插入測試方法,我們新建了一條插入sql語句:

<insert id="saveUser" parameterType="com.mybatis.domain.User">
        insert into user(username,password,phone) values(#{username},#{password},#{phone});
</insert>

parameterType屬性指定引數型別為User,因此session.insert方法的第二個引數必須為User類的物件,我們通過下面程式碼新建一個User物件,併為其屬性賦值:

User user = new User();
user.setPassword("aaaa");
user.setPhone("18909568934");
user.setUsername("Jane");

這些屬性的值會自動同步到#{username},#{password},#{phone}佔位符中。需要注意的是,通過sessionFactory.openSession()方法獲取資料庫會話,mybatis事務預設不自動提交,在對資料庫做更新操作後要手動呼叫session.commit()提交事務。如果需要事務自動提交,我們需要呼叫openSession方法的過載形式,指定一個boolean型別變數作為引數:

//事務自動提交
sessionFactory.openSession(true);

3.testMybatisUpdate和testMybatisDelete分別為資料更新和刪除操作測試方法,和資料插入類似,也比較簡單,讀者可以參考上面的程式碼,這裡不做介紹了。