一個月沒更新我的博客了,今天有興致來寫一篇!
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();
}
}
}
運行結果如下: