MyBatis入門

一個月沒更新我的博客了,今天有興致來寫一篇!

MyBatis是一個優秀的數據持久層框架,在實體類和SQL語句之間建立映射關係,是一種半自動化的ORM實現。其封裝性要低於Hibernate,性能優越,並且小巧、簡單易學,應用也越來越廣泛。

什麼是數據持久化

數據持久化是將內存中的數據模型轉換爲存儲模型,以及將存儲模型轉換爲內存中的數據模型的統稱。例如,文件的存儲、數據的讀取等都是數據持久化操作。數據模型可以是任何數據結構或對象模型,存儲模型可以是關係模型、XML、二進制流等。

MyBatis框架簡介

MyBatis是一個開源的數據持久層框架。它內部封裝了通過JDBC訪問數據庫的操作,支持普通的SQL查詢、存儲過程和高級映射,幾乎消除了所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis作爲持久層框架,其主要思想是將程序的大量SQL語句剝離出來,配置在配置文件中,實現SQL的靈活配置。這樣做能將SQL與程序代碼分離,可以在不修改程序代碼的情況下,直接在配置文件中修改SQL。

ORM

對象/關係映射是一種數據持久化操作。它在對象模型和關係模型數據庫之間建立對應關係,並且提供了一種機制,通過JavaBean對象去操作數據庫表中的數據。

 

下面用實例來入門:

第一步:創建一個數據庫名字叫mydb01,在mydb01下建一張表t_person,表結構如下:

第二步:在Eplise中創建一個Java Project,並把相應的jar包加入到Java Project中,如下所示

第三步:創建Pojo類,person,代碼如下:

package com.kgc.mybatis.pojo;

public class Person {
	private int pid ;
	private String pname ;
	private int age ;
	private String address ;
	
	public Person(){}

	public Person(String pname, int age, String address) {
		super();
		this.pname = pname;
		this.age = age;
		this.address = address;
	}

	public Person(int pid, String pname, int age, String address) {
		super();
		this.pid = pid;
		this.pname = pname;
		this.age = age;
		this.address = address;
	}

	public int getPid() {
		return pid;
	}

	public void setPid(int pid) {
		this.pid = pid;
	}

	public String getPname() {
		return pname;
	}

	public void setPname(String pname) {
		this.pname = pname;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	@Override
	public String toString() {
		return "Person [pid=" + pid + ", pname=" + pname + ", age=" + age
				+ ", address=" + address + "]";
	}
	
}

 第四步:創建Mybatis核心配置文件sqlMapConfig.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">
<configuration>
	<environments default="hello_mysql">
		<environment id="hello_mysql">
			<transactionManager type="jdbc"/>
			<dataSource type="pooled">
				<property name="driver" value="org.gjt.mm.mysql.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/mydb01"/>
				<property name="username" value="root"/>
				<property name="password" value="123456"/>
			</dataSource>
		</environment>
	</environments>
	
	<mappers>
		<mapper resource="com/kgc/mybatis/pojo/PersonMapper.xml"/>
	</mappers>
	
</configuration>

幾個常用元素的作用如下:

  • configuration:配置文件的根元素節點
  • properties:通過resource屬性從外部指定properties屬性文件(database.properties),該屬性文件描述數據庫連接的相關配置(數據庫驅動、連接數據庫的url、數據庫用戶名、數據庫密碼),其位置也是在/resources目錄下。
  • environments:表示配置MyBatis的多套運行環境,將SQL映射到多個不同的數據庫上,該元素節點下可以配置多個environment子元素節點,但是必須指定其中一個爲默認運行環境(通過default指定)。
  • mappers:作用是告訴MyBatis去哪裏找到SQL映射文件(該文件內容是開發者定義的映射SQL語句),整個項目中可以有一個或多個SQL映射文件。
  • mapper:mappers的子元素節點,具體指定SQL映射文件的路徑,其中resource屬性的值描述了SQL映射文件的路徑(類資源路徑)。

第五步:創建SQL映射文件,完成與POJO(實體類)的映射,該文件也是一個XML文件,名爲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="com.kgc.mybatis.pojo">
	<insert id="addPerson" parameterType="com.kgc.mybatis.pojo.Person" useGeneratedKeys="true" keyProperty="pid">
		insert into t_person values(null,#{pname},#{age},#{address})
	</insert>
	<select id="getPersonList" resultType="com.kgc.mybatis.pojo.Person">
		select * from t_person
	</select>
	<update id="updatePesron" parameterType="com.kgc.mybatis.pojo.Person">
		update t_person set pname = #{pname} , age = #{age} , address = #{address} where pid = #{pid}
	</update>
	<delete id="deletePerson" parameterType="int">
		delete from t_person where pid = #{pid}
	</delete>
	<select id="getPersonByPid" parameterType="int" resultType="com.kgc.mybatis.pojo.Person">
		select * from t_person where pid = #{pid}
	</select>
</mapper>

其中各元素的含義如下:

  • mapper:映射文件的根元素節點,只有一個屬性namespace。
  • namespace:用於區分不同的mapper,全局唯一。
  • select:表示查詢語句,是MyBatis最常用的元素之一,常用屬性如下。
  • id:該命名空間下唯一標識符
  • resultType屬性:表示SQL語句返回值類型,此處通過SQL語句返回的是int數據類型。
  • update:表示更新語句
  • insert:表示插入語句
  • delete:表示刪除語句

第六步:創建測試類

package com.kgc.mybatis.test;

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

import com.kgc.mybatis.pojo.Person;

public class PersonDAOTest {
	
	SqlSession session = null ;

	@Before
	public void setup(){
		InputStream is;
		try {
			//1.加載sqlMapConfig.xml
			is = Resources.getResourceAsStream("sqlMapConfig.xml");
			//2.解析sqlMapConfig.xml,創建SqlSessionFactory對象
			SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
			//3.通過factory創建session對象
			session = factory.openSession();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@Test
	public void addPersonTest(){
		Person person = new Person("hameimei",29,"Beijing");
		//4.執行插入操作,返回影響行數
		int count = session.insert("com.kgc.mybatis.pojo.addPerson", person);
		System.out.println(count>0?"insert succ!" : "insert fail!");
	}
	
	@Test
	public void getPersonListTest(){
		List<Person> personList = session.selectList("com.kgc.mybatis.pojo.getPersonList");
		for(Person person : personList){
			System.out.println(person);
		}
	}
	
	@Test
	public void updatePersonTest(){
		Person person = new Person(3,"lina",30,"KGC");
		int count = session.update("com.kgc.mybatis.pojo.updatePesron", person);
		System.out.println(count>0?"update succ!" : "update fail!");
	}
	
	@Test
	public void delPersonTest(){
		int count = session.delete("com.kgc.mybatis.pojo.deletePerson", 2);
		System.out.println(count>0?"delete succ!" : "delete fail!");
	}
	
	@Test
	public void getPersonByPidTest(){
		Person person = session.selectOne("com.kgc.mybatis.pojo.getPersonByPid", 3);
		System.out.println(person);
	}
	
	@After
	public void teardown(){
		if(session!=null){
			//5.提交或回滾事務
			session.commit();
			//6.關閉session
			session.close();
		}
	}
	
}




運行結果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章