天天看點

MyBatis學習(一)- 搭建MyBatis項目

最近要學習使用MyBatis,參照網上的資料和官方的教程,根據自己的了解,記錄一下。

MyBatisJar包下載下傳位址:http://download.csdn.net/detail/jolingogo/5220163

官方教程:http://mybatis.github.com/mybatis-3/zh/index.htm

一.什麼是MyBatis

       MyBatis 是支援普通 SQL 查詢,存儲過程和進階映射的優秀持久層架構。MyBatis 消除 了幾乎所有的 JDBC 代碼和參數的手工設定以及結果集的檢索。MyBatis 使用簡單的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plan Old Java Objects,普通的 Java 對象)映射成資料庫中的記錄。 

     以前學習過Hibernate,在網上查了一下,說MyBatis是半自動化的,需要自己寫SQL語句,這樣就可以根據需要自己優化SQL了。

     Hibernate可以根據配置檔案或者注解自動生成表,省去了自己寫建表語句,在網上找了一下,MyBatis好像不可以。Google提供了generator,可以根據表結構生成實體類和映射檔案,試了一下,還不錯,以後會寫一下。

二.配置檔案

     這些架構什麼的,基本上都需要配置檔案。MyBatis的XML 配置檔案包含對 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">
  
<configuration>
	<!-- 資料庫相關屬性檔案,這裡不寫的話,也會自動加載 -->
	<properties resource="config.properties"></properties>
	
	<!-- 環境配置 -->
  	<environments default="development">
    	<environment id="development">
      		<transactionManager type="JDBC"/>
      		<!-- 資料庫連接配接相關配置 ,這裡動态擷取config.properties檔案中的内容-->
	      	<dataSource type="POOLED">
		        <property name="driver" value="${driver}"/>
		        <property name="url" value="${url}"/>
		        <property name="username" value="${username}"/>
		        <property name="password" value="${password}"/>
	      	</dataSource>
	    </environment>
	</environments>
  
	<!-- 映射檔案 ,我們還沒有,這裡什麼都不寫-->
	<mappers>
	</mappers>
  
</configuration>
           

config.properties

MyBatis學習(一)- 搭建MyBatis項目

三.從 XML 中建構 SqlSessionFactory

        每 一 個 MyBatis 的 應 用 程 序 都 以 一 個 SqlSessionFactory 對 象 的 實 例 為 核 心 。 SqlSessionFactory 對 象 的 實 例 可 以 通 過 SqlSessionFactoryBuilder 對 象 來 獲 得 。 SqlSessionFactoryBuilder 對象可以從 XML 配置檔案,或從 Configuration 類的習慣準備的實 例中建構 SqlSessionFactory 對象。 

      這裡的SqlSessionFactory和Hibernate中的SessionFactory是一樣的,我們可以通過factory,擷取session。

package org.ygy.util;

import java.io.IOException;
import java.io.InputStream;

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

/**
 * MyBatis的工具類
 * @author yuguiyang
 *
 */
public class MyBatisUtil {
	private static SqlSessionFactory sqlSessionFactory = null;
	
	/**
	 * 初始化Session工廠
	 * @throws IOException
	 */
	private static void initialFactory() throws IOException {
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	/**
	 * 擷取Session
	 * @return
	 */
	public static SqlSession getSession() {
		if(sqlSessionFactory == null) {
			try {
				initialFactory();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		return  sqlSessionFactory.openSession();
	}
	
	
}
           

接下來,我們測試一下,看看配置是否正确:

package org.ygy.model;

import static org.junit.Assert.*;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import org.ygy.util.MyBatisUtil;

public class ModelTest {
	
	@Test
	public void testGetSession() {
		SqlSession session = MyBatisUtil.getSession();
		
		assertNotNull(session);
		
		if(session != null) {
			session.close();
			session = null;
		}
	}
}
           

貌似,想當然的悲劇了,這樣測試好像不行,剛才忘記添加資料庫驅動了,結果運作一樣成功了,如果不執行SQL語句的話,MyBatis好像不會去連接配接資料庫,測試還是等一下吧

MyBatis學習(一)- 搭建MyBatis項目

既然這樣的話,我們就先寫一個映射檔案。

首先,我們要建一張表,就來一個使用者表吧(t_user),我用的SqlServer,語句就省略了吧

MyBatis學習(一)- 搭建MyBatis項目

然後,和表對應的實體類:

package org.ygy.model;

/**
 * 使用者
 * @author yuguiyang
 *
 */
public class User {
	private Integer id;//自動增長的ID
	private String name;//使用者名
	private String password;//密碼
	private String email;//郵箱
	private Integer age;//年齡
	private Integer gender;//性别,0-男 ; 1-女

	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 String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Integer getAge() {
		return age;
	}

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

	public Integer getGender() {
		return gender;
	}

	public void setGender(Integer gender) {
		this.gender = gender;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", password=" + password
				+ ", email=" + email + ", age=" + age + ", gender=" + gender
				+ "]";
	}

}
           

接下來,是映射檔案:UserMapper.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="org.ygy.mapper.UserMapper">

	<insert id="insert" parameterType="org.ygy.model.User" useGeneratedKeys="true">
		insert into t_user(name , password , email , gender , age)
		values(#{name} , #{password} , #{email} , #{gender} , #{age})
	</insert>
	
	<select id="selectUser" resultType="org.ygy.model.User">
		select * from t_user
	</select>
  
</mapper>
           

最後,在mybatis-config.xml配置檔案中添加映射檔案:

<!-- 映射檔案 -->
	<mappers>
		<mapper resource="org/ygy/mapper/UserMapper.xml"/>
	</mappers>
           

好了,這下,我們可以測試了:

package org.ygy.model;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.ygy.util.MyBatisUtil;

public class ModelTest {
	private SqlSession session = null;
	
	@Before
	public void before() {
		session = MyBatisUtil.getSession();
	}
	
	@After
	public void after() {
		session.commit();
		session.close();
	}
	
	@Test
	public void testGetSession() {
		assertNotNull(session);
		
		if(session != null) {
			session.close();
			session = null;
		}
	}
	
	@Test
	public void testSelectUser() {
		List<User> userList = session.selectList("org.ygy.mapper.UserMapper.selectUser");
		
		for(User each : userList) {
			System.out.println("each->" + each);
		}
		
	}
	
	@Test
	public void testInsert() {
		User user = new User();
		user.setName("路飛");
		user.setPassword("lufei");
		user.setEmail("[email protected]");
		user.setAge(23);
		user.setGender(0);
		
		int result = session.insert("org.ygy.mapper.UserMapper.insert" , user);
		assertEquals(1 , result);
	}
}
           
MyBatis學習(一)- 搭建MyBatis項目

,這樣,一個入門的示例,就差不多了。

拓展:

1.别名

在mybatis-config.xml中可以配置别名 (typeAliases)

類型别名是為 Java 類型命名一個短的名字。它隻和 XML 配置有關,隻用來減少類完全限定名的多餘部分。

看看上面UserMapper.xml中

MyBatis學習(一)- 搭建MyBatis項目

隻要在mybatis-config.xml中添加

<!-- 配置别名 -->
	<typeAliases>
		<typeAlias type="org.ygy.model.User" alias="User"/>
	</typeAliases>
           

就可以了。

繼續閱讀