鍍金池/ 教程/ Java/ Mybatis增刪改查(CURD)
Mybatis表關(guān)聯(lián)多對一
MyBatis打印輸出SQL語句
Mybatis表關(guān)聯(lián)一對多
mybaits if標(biāo)簽語句
MyBatis整合Spring MVC
MyBatis動態(tài)SQL語句
MyBatis教程
MyBatis choose(when, otherwise)標(biāo)簽
Mybatis與Spring集成
MyBatis分頁
MyBatis SqlSessionDaoSupport實例
MyBatis where標(biāo)簽語句
Mybatis增刪改查(CURD)
Mybatis接口注解
Mybatis trim標(biāo)簽
Mybatis set標(biāo)簽
Mybatis 多對多
MyBatis環(huán)境配置及入門

Mybatis增刪改查(CURD)

前面的小節(jié)我們已經(jīng)講到用接口的方式編程。使用這種方式,需要注意的一個地方就是,在User.xml 配置文件中,mapper namespace="com.yiibai.mybatis.inter.IUser" ,命名空間對應(yīng)非常重要,名稱不能有錯,必須與我們定義的 package 和 接口一致。如果不一致就會出錯,這一章主要在上一講基于接口編程的基礎(chǔ)上完成如下操作:

  1. 使用 mybatis 查詢用戶數(shù)據(jù)(讀取用戶列表)
  2. 使用 mybatis 增加用戶數(shù)據(jù)
  3. 使用 mybatis 更新用戶數(shù)據(jù)
  4. 使用 mybatis 刪除用戶數(shù)據(jù)

查詢數(shù)據(jù),前面已經(jīng)講過簡單的查詢單個用戶數(shù)據(jù),在這里將查詢出用戶列表,
要查詢出列表,也就是返回 List, 在我們這個例子中也就是List<User> , 要以這種方式返回數(shù)據(jù),需要在User.xml里面配置返回的類型 resultMap, 注意不是 resultType, 而這個resultMap 所對應(yīng)的應(yīng)該是我們自己配置。

在此示例中,我們需要使用到以下表:

接下我們創(chuàng)建一個表:user,并插入一條記錄信息,其結(jié)構(gòu)如下所示:

CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(64) NOT NULL DEFAULT '',
  `dept` varchar(254) NOT NULL DEFAULT '',
  `website` varchar(254) DEFAULT '',
  `phone` varchar(16) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'yiibai', 'Tech', 'http://www.yiibai.com', '13800009988');

1、創(chuàng)建工程并配置所需環(huán)境

我們首先來創(chuàng)建一個工程:mybatis-curd-03,與第一節(jié)中介紹的環(huán)境配置一樣,加入所需的 jar 包:mysql-connectormybatis3.jar。配置 src/config/Configure.xml,其文件內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <typeAlias alias="User" type="com.yiibai.mybatis.models.User" />
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/testdb" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!-- // power by http://www.yiibai.com -->
        <mapper resource="com/yiibai/mybatis/models/User.xml" />
    </mappers>
</configuration>

2、創(chuàng)建 Java 類和接口

在這里需要創(chuàng)建一個類和一個接口:User.java類和IUser.java接口,User.java類位于包 com.yiibai.mybatis.models 下,User.java類代碼內(nèi)容如下:

package com.yiibai.mybatis.models;

public class User {
    private int id;
    private String name;
    private String dept;
    private String phone;
    private String website;

    public String getWebsite() {
        return website;
    }
    public void setWebsite(String website) {
        this.website = website;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDept() {
        return dept;
    }
    public void setDept(String dept) {
        this.dept = dept;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }

}

IUser.java接口位于包com.yiibai.mybatis.dao 下,IUser.java接口代碼內(nèi)容如下:

package com.yiibai.mybatis.dao;

import java.util.List;

import org.apache.ibatis.annotations.Select;

import com.yiibai.mybatis.models.User;
/**
 * 
 * @author yiibai
 *
 */
public interface IUser {
    //@Select("select * from user where id= #{id}")
    //public User getUserByID(int id);
    public List<User> getUserList();

    public void insertUser(User user);

    public void updateUser(User user);

    public void deleteUser(int userId);

    public User getUser(int id);
}

這里還需要一個XML文件,與前一小節(jié)中一樣,使用的是 User.xml,在這我們分別對應(yīng)了增刪改查的操作(每一個操作的 ID 對應(yīng)于IUser接口的方法),其內(nèi)容如下:

User.xml

<?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="com.yiibai.mybatis.dao.IUser">

    <select id="getUser" parameterType="int"
        resultType="com.yiibai.mybatis.models.User">
        SELECT *
        FROM USER
        WHERE id = #{userId}
    </select>


    <insert id="insertUser" parameterType="User">
        INSERT INTO USER(name,
        dept, website,phone)
        VALUES(#{name}, #{dept}, #{website}, #{phone})
    </insert>

    <select id="getUserList" resultType="com.yiibai.mybatis.models.User">
        SELECT * FROM USER
    </select>

    <update id="updateUser" parameterType="User">
        UPDATE USER
        SET
        name=
        #{name},
        dept = #{dept},
        website = #{website},
        phone = #{phone}
        WHERE
        id =
        #{id}
    </update>

    <delete id="deleteUser" parameterType="int">
        DELETE FROM USER WHERE id = #{id}
    </delete>

</mapper>

測試程序主類:

import java.io.Reader;
import java.text.MessageFormat;
import java.util.List;

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 com.yiibai.mybatis.dao.IUser;
import com.yiibai.mybatis.models.User;

public class Main {
    private static SqlSessionFactory sqlSessionFactory;
    private static Reader reader;

    static {
        try {
            reader = Resources.getResourceAsReader("config/Configure.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static SqlSessionFactory getSession() {
        return sqlSessionFactory;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SqlSession session = sqlSessionFactory.openSession();
        try {
            //sqlSessionFactory.getConfiguration().addMapper(IUser.class);
            //User user = (User) session.selectOne( "com.yiibai.mybatis.models.UserMapper.getUserByID", 1);

            // 用戶數(shù)據(jù)列表
            getUserList();
            // 插入數(shù)據(jù)
            // testInsert();

            // 更新用戶
            //testUpdate();

            // 刪除數(shù)據(jù)
            //testDelete();

        } finally {
            session.close();
        }
    }

    //
    public static void testInsert()
    {
        try
        {
            // 獲取Session連接
            SqlSession session = sqlSessionFactory.openSession();
            // 獲取Mapper
            IUser userMapper = session.getMapper(IUser.class);
            System.out.println("Test insert start...");
            // 執(zhí)行插入
            User user = new User();
            user.setId(0);
            user.setName("Google");
            user.setDept("Tech");
            user.setWebsite("http://www.google.com");
            user.setPhone("120");
            userMapper.insertUser(user);
            // 提交事務(wù)
            session.commit();

            // 顯示插入之后User信息
            System.out.println("After insert");
            getUserList();
            System.out.println("Test insert finished...");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    // 獲取用戶列表
    public static void getUserList() {
        try {
            SqlSession session = sqlSessionFactory.openSession();
            IUser iuser = session.getMapper(IUser.class);
            // 顯示User信息
            System.out.println("Test Get start...");
            printUsers(iuser.getUserList());
            System.out.println("Test Get finished...");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void testUpdate()
    {
        try
        {
            SqlSession session = sqlSessionFactory.openSession();
            IUser iuser = session.getMapper(IUser.class);
            System.out.println("Test update start...");
            printUsers(iuser.getUserList());
            // 執(zhí)行更新
            User user = iuser.getUser(1);
            user.setName("New name");
            iuser.updateUser(user);
            // 提交事務(wù)
            session.commit();
            // 顯示更新之后User信息
            System.out.println("After update");
            printUsers(iuser.getUserList());
            System.out.println("Test update finished...");
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    // 刪除用戶信息
    public static void testDelete()
    {
        try
        {
            SqlSession session = sqlSessionFactory.openSession();
            IUser iuser = session.getMapper(IUser.class);
            System.out.println("Test delete start...");
            // 顯示刪除之前User信息
            System.out.println("Before delete");
            printUsers(iuser.getUserList());
            // 執(zhí)行刪除
            iuser.deleteUser(2);
            // 提交事務(wù)
            session.commit();
            // 顯示刪除之后User信息
            System.out.println("After delete");
            printUsers(iuser.getUserList());
            System.out.println("Test delete finished...");
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    /**
     * 
     * 打印用戶信息到控制臺
     * 
     * @param users
     */
    private static void printUsers(final List<User> users) {
        int count = 0;

        for (User user : users) {
            System.out.println(MessageFormat.format(
                    "============= User[{0}]=================", ++count));
            System.out.println("User Id: " + user.getId());
            System.out.println("User Name: " + user.getName());
            System.out.println("User Dept: " + user.getDept());
            System.out.println("User Website: " + user.getWebsite());
        }
    }
}

測試運行

執(zhí)行以上程序,如果沒有問題,應(yīng)該能正確輸出。那么這里所有增刪改查都完成了,需要注意的是在增加,更改,刪除的時候需要調(diào)用 session.commit() 來提交事務(wù),這樣才會真正對數(shù)據(jù)庫進(jìn)行操作提交保存,否則操作沒有提交到數(shù)據(jù)中。
到此為止,簡單的單表操作已經(jīng)完成了,接下來在下一節(jié)中將會講解多表聯(lián)合查詢,以及結(jié)果集的選取。 如遇到不明白的問題,請留言評論。

最后,附上項目結(jié)構(gòu)圖,如下: