MyBatis 入門(簡明淺入易懂)

jopen 12年前發布 | 72K 次閱讀 MyBatis MyBatis3 持久層框架

一、MyBatis的簡介

    MyBatis的前身就是iBatis。它是一個數據持久層框架。支持普通SQL查詢、存儲過程和高級映射的優秀持久層框架。消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis使用簡單的XML或注解用于配置和原始映射,將接口和JavaPOJOs(Plain Old Java Objects,普通的Java對象)映射成數據庫中的記錄。

   2010616日,原iBatis開源項目由apache移到了google code,并改名為MyBatis。官方網址為:http://www.mybatis.org/。 目前的下載地址可以直接從google中下載了,下載地址:http://code.google.com/p/mybatis/downloads/list。    個人建議下載:mybatis-3.1.1-bundle.zip

二、快速的入門 開發步驟:

  1. 下載mybatis,解壓將mybatis-3.1.1.jar拷到工程lib中。若是web應用,請拷到web-inf/lib中。

  2. 編寫mybatis的配置文件mybatis-config.xml(名稱可以任意,但個人建議用mybatis-config.xml)。

  3. 開發POJOs對象、創建數據庫中的表、編寫相應POJO類的Mapping.xml文件。

  4. 用mybatis實現的dao層,具體核對對象是SqlSession。

下面就以上步驟詳細說明:

1 )  拷jar包到工程中就不用說了吧。直接截圖下吧。

     MyBatis 入門(簡明淺入易懂)

2 ) 編寫mybatis的配置文件mybatis-config.xml

具體示例代碼如下:

<?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">   <!-- dtd約束,一定要拷過去啊。下面的根據具體應用,改改就可以了 -->
<configuration>
    <!--  指定與數據庫相關的配置資源文件名,若下面的dataSource所需要的url等直接配置編碼在此文件,那么此properties也可以去掉 -->
    <properties resource="db.properties"/>  
    <!-- 給指定的類定義別名,這樣在后面的Mapping映射文件中,可以直接寫別名,可以不用寫完整限定類名了 -->
    <typeAliases>
        <typeAlias alias="Person" type="com.test.domain.Person" />  <!-- 指定com.test.domain.Person用Person別名替代 -->
    </typeAliases>
    <environments default="default">
        <environment id="default">
            <transactionManager type="JDBC" />    <!-- JDBC事務管理 -->
            <dataSource type="POOLED">  <!-- 數據源 連接池相關 所需要數據庫連接的相關配置信息,在db.properties有指定 -->
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>
    <!-- 映射文件 將sql、POJO、dao層映射連接在一起,以可配置的方式來組織。從此SQL的寫法與dao層無關了。 -->
    <mappers>
        <mapper resource="com/test/domain/PersonMapper.xml" />
    </mappers>
</configuration>

db.properties文件編寫:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=chen

 

3) 開發POJOs對象、創建數據庫中的表、編寫相應POJO類的Mapping.xml文件。

3.1 javabean及創建數據庫的表如下:

package com.test.domain;

import java.io.Serializable;
import java.util.Date;
/**
 編碼POJO Person,再根據此Person創建表,在數據庫創建表的SQL語句如下:
 use test;
 create table if not exists person(
    id int primary key ,
    name varchar(20),
    birthday date
 )
 * 
 * @author 陳淑飛
 * @time Oct 6, 2012
 */
public class Person implements Serializable {

    private Integer id ;//id 自己維護,也可以讓數據庫來維護,若用mysql可利用mysql的auto_increment來維護id
    private String name;
    private Date birthday;

    @Override
    public String toString() {
        return id + "," + name+","+birthday.toLocaleString(); //沒有什么特別意義,純粹為測試打印輸出方便看。
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        return super.equals(obj);
    }
    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return super.hashCode();
    }
}

3.2  PersonMapper.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="p1">
    <!-- 查詢一個對象 -->
    <select id="selectOnePerson" parameterType="int" resultType="Person"><!-- Person 使用了別名,也可直接用類完全限定名替換。個人建議用別名更靈活 -->
        SELECT id,name,birthday FROM person WHERE id=#{id}
    </select>
    <!-- 查詢多個對象 -->
    <select id="selectAllPersons" resultType="Person">
        SELECT id,name,birthday FROM person
    </select>
    <!-- 增加一條記錄 -->
    <insert id="insertPerson" parameterType="Person" flushCache="true" statementType="PREPARED">
        INSERT INTO person (id,name,birthday) VALUES (#{id},#{name},#{birthday})
    </insert>
    <!-- 更新 -->
    <update id="updatePerson" parameterType="Person">
        UPDATE person set name=#{name},birthday=#{birthday} WHERE id=#{id}
    </update>
    <!-- 刪除 -->
    <delete id="deletePerson" parameterType="int">
        delete from person where id=#{id}
    </delete>
    <!-- 從上面的可以看對,對數據庫表的CRUD操作,映射文件中分別用了四個標簽insert、select、update、delete來指定sql語句、傳入參數類型和結果集類型 -->
</mapper>

4). 用mybatis實現的dao層,具體核對對象是SqlSession。
  由于dao層依賴于SqlSession。而SqlSession的創建過程需要SqlSessionFactory對象,此對象對于多次的CRUD操作只需要一個對象,所以這里引用另一個自定義的MyBatisUtils工具類。具體代碼如下:

package com.test.util;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/**
 mybatis工具類,提供openSesison,對外提供SqlSession對象。
 將此對象的構造過程隱藏起來,SqlSessionFactory對象,只需要在類加載時創建出來就OK了。
 需要指定mybatis的配置文件xml的路徑或相應的字節流或字符流。

 這里用字節流InputStream,采用類加載器的方式來獲取輸入字節流。
 * @author 陳淑飛
 * @time Oct 6, 2012
 */
public class MyBatisUtils {

    private static SqlSessionFactory factory ;

    static{
        InputStream in = MyBatisUtils.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
        factory = new SqlSessionFactoryBuilder().build(in);
    }

    public static SqlSessionFactory getSqlSessionFactory(){
        return factory;
    }

    /**
     返回一個SqlSession對象(每次返回一個新的SqlSession對象)
     若涉及多個表的操作,涉及事務的,要做到操作失敗時回滾,那么建議自定義一個TransactionUtils的工具類
     用ThreadLocal類來保存SqlSession類,這樣跨多個dao操作時,確保獲取的都是同一SqlSession對象。然后在service層中捕獲異常,再catch上用session的回滾。
     * @return
     */
    public static SqlSession openSession(){
        return factory.openSession();
    }

}

dao層的實現類:

package com.test.dao.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.test.dao.PersonDao;
import com.test.domain.Person;
import com.test.util.MyBatisUtils;

/**
 * 用MyBatis完全可以脫離JDBC的相關雍腫的對象,而且可以將sql語句與程序解耦了。
 * sql有需要變時只需要將相應的映射文件,.xml中SQL語句改下即可。
 * @author 陳淑飛
 * @time Oct 6, 2012
 */
public class PersonDaoImplForMyBatis implements PersonDao {

    /**
     * 添加一個Person
     */
    public void addPerson(Person person){
        //獲取一個SqlSession對象
        SqlSession session = MyBatisUtils.openSession();
        //添加操作,用insert方法,第一個參數必須是mapping中唯一的id的值。
        session.insert("insertPerson", person);
        //涉及insert、update、delete的DML,要手動的commit呢,注意close方法是不會監測有木有commit,幻想close方法去commit會讓你死的很慘滴。
        session.commit();
        //session也是相當于緩沖池技術一樣的,所以用完也要記得close哦。
        session.close(); 
    }

    /**
     * 根據id查找Person,返回與id值匹配的Person對象。
     */
    public Person findPerson(Integer id){
        SqlSession session = MyBatisUtils.openSession();
        Person person = (Person)session.selectOne("selectOnePerson", id);
        session.commit();
        session.close();
        return person;
    }

    /**
     * 查找所有的Person對象,以List的形式返回結果
     */
    public List<Person> findPerson(){
        SqlSession session = MyBatisUtils.openSession();
        List<Person> list = session.selectList("selectAllPersons");
        session.commit();
        session.close();
        return list;
    }

    /**
     * 根據Person對象的ID來更新Person對象。
     */
    public void updatePerson(Person person){
        SqlSession session = MyBatisUtils.openSession();
        session.update("updatePerson", person);
        session.commit();
        session.close();
    }

    /**
     * 根據id,刪除與id值匹配的Person對象
     */
    public void deletePerson(Integer id){
        SqlSession session = MyBatisUtils.openSession();
        session.delete("deletePerson", id);
        session.commit();
        session.close();
    }
}



三、測試Junit單元測試,對上面的dao實現進行測試。

package com.test;

import static org.junit.Assert.fail;

import java.util.Date;
import java.util.List;

import org.junit.Test;

import com.test.dao.PersonDao;
import com.test.dao.impl.PersonDaoImplForMyBatis;
import com.test.domain.Person;
/**
 * dao層的單元測試
 * @author 陳淑飛
 * @time Oct 6, 2012
 */
public class PersonDaoImplForMyBatisTest {

    private PersonDao dao = new PersonDaoImplForMyBatis();

    @Test
    public void testAddPerson() {
        Person person = new Person();
        person.setId(15);
        person.setName("lansheng");
        person.setBirthday(new Date());

        dao.addPerson(person);
    }

    @Test
    public void testFindPersonInteger() {
        Person person = dao.findPerson(10);
        System.out.println(person);
    }

    @Test
    public void testFindPerson() {
        List<Person> list = dao.findPerson();
        for(Person person : list){
            System.out.println(person);
        }
    }

    @Test
    public void testUpdatePerson() {
        Person person = dao.findPerson(9);
        System.out.println("用find找出來,改前的數據為::"+person);
        person.setName("改后的名");
        dao.updatePerson(person);
        person = dao.findPerson(9);
        System.out.println("用find找出來,修改后的數據為::"+person);
    }

    @Test
    public void testDeletePerson() {
        Person person = dao.findPerson(9);
        System.out.println(person);
        dao.deletePerson(9);
        person = dao.findPerson(9);
        System.out.println(person);
    }

}

 

測試結果一切OK,全部綠條,查看數據庫有相關記錄。

MyBatis 入門(簡明淺入易懂)

來自:http://blog.csdn.net/chenshufei2/article/details/8043225

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!