Mybatis入門


MyBatis入門

Editor:SimpleWu

MyBatis簡介

  • MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年11月遷移到Github。
  • MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以對配置和原生Map使用簡單的 XML 或注解,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。

MyBatis參考資料官網

http://www.mybatis.org/mybatis-3/zh/index.html

MyBatis下載地址

https://github.com/mybatis/mybatis-3

MyBatis的優勢

  • 開源的優秀的持久層框架
  • SQL語句與代碼分離
  • 面向配置的編程
  • 良好支持復雜數據映射
  • 動態SQL

MyBatis開發步驟

1.添加需要的jar包

1)mybatis-3.3.0 核心包(如果需要日志操作,可以導入依賴包)

2)數據庫驅動(mysql-connector-java-5.1.22-bin)

2.創建數據庫,添加測試數據
create table `tal_employee` (
	`id` int (11),
	`last_name` varchar (360),
	`email` varchar (300),
	`gender` char (9)
); 
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('1','韓信','hanxin@gemail.com','男');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('2','LiBaihH','libai@gemail.com','男');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('3','孫尚香','sunshangxiang@gemail.com','女');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('4','安琪拉','anqila@gemail.com','女');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('5','Hello','Hello@gemail.com','男');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('6','Miya','Miya@gemail.com','男');
3.創建實體類
public class Employee {
	private Integer id;
	private String lastName;
	private String email;
	private String gender;
	//此處省略get set toString。。。
}
4.創建實體類映射配置文件
<?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="EmployeeMapper">
	<!-- 定義一個查詢方法  resultType 返回值類型-->
	<select id="findAll" resultType="com.simple.mybatis.entitys.Employee">
		select * from tal_employee
	</select>
</mapper>
5.創建mybatis主配置文件
<?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>
	<!-- 配置環境  default默認使用環境名字-->
	<environments default="development">
		<!-- 配置一個環境 -->
		<environment id="development">
			<!-- 使用事務JDBC事務管理器 -->
			<transactionManager type="JDBC" />
			<!-- 配置數據庫連接 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
				<property name="username" value="root" />
				<property name="password" value="root" />
			</dataSource>
		</environment>
	</environments>
	<!-- 加載映射 -->
	<mappers>
		<mapper resource="com/simple/mybatis/entitys/EmployeeMapper.xml" />
	</mappers>
</configuration>

編寫代碼見下文

獲取SqlSessionFactory對象

private SqlSessionFactory sqlSessionFactory;
	@Before
	public void init() throws IOException{
		//讀取mybatis主配置文件
		InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
		/**
		 * 實例化SqlSessionFactory
		 * 如果沒有指定默認環境,可以在這里指定使用的環境ID,比如我先在有個DEV環境
		 * sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"DEV");
		 * 我這里已經使用了默認環境所以我就不用這種方式創建了
		 */
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}

訪問數據庫

獲取SqlSession對象,作用於與數據庫的一次回話作用於與數據庫的一次回話

SqlSession session = sqlSessionFactory.openSession();

獲取所有員工記錄

EmployeeMapper就是我們實體類映射文件的命名空間,findAll就是我們select標簽的ID

List<Employee> employees = session.selectList("EmployeeMapper.findAll");
		for (Employee employee : employees) {
			System.out.println(employee);
		}

訪問結果:

Employee [id=1, lastName=null, email=hanxin@gemail.com, gender=男]
Employee [id=2, lastName=null, email=libai@gemail.com, gender=男]
Employee [id=3, lastName=null, email=sunshangxiang@gemail.com, gender=女]
Employee [id=4, lastName=null, email=anqila@gemail.com, gender=女]
Employee [id=5, lastName=null, email=Hello@gemail.com, gender=男]
Employee [id=6, lastName=null, email=Miya@gemail.com, gender=男]

在這里我們訪問數據庫是正常的,為什么lastName為空呢?

解決表字段與類屬性名不對應

原因:應為我們這里實體類上的屬性叫做lastName與數據庫列last_name名字不對應所以獲取的值為空

解決方案1:將實體類映射文件的中select標簽中的取別名

<select id="findAll" resultType="com.simple.mybatis.entitys.Employee">
		select id,last_name AS lastName,email,gender from tal_employee
</select>

解決方案2:在mybatis主配置文件中配置駝峰式命名,需要將配置排在前面否則XML報錯

<settings>
	<!-- 開啟駝峰式命名規則 -->
	<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

使用方案2我們類中屬性lastName會匹配數據庫字段last_name

使用日志查看SQL語句等

首先我們需要添加mybatis依賴包

添加log4j.properties

#設置輸出級別和輸出位置
log4j.rootLogger=debug,Console
#設置控制台相關的參數
log4j.appender.Console=org.apache.log4j.ConsoleAppender  
log4j.appender.Console.layout=org.apache.log4j.PatternLayout  
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n  
#設置MyBatis的輸出內容
log4j.logger.java.sql.ResultSet=INFO  
log4j.logger.org.apache=INFO  
log4j.logger.java.sql.Connection=DEBUG  
log4j.logger.java.sql.Statement=DEBUG  
log4j.logger.java.sql.PreparedStatement=DEBUG

這樣我們就可以使用log4j來查看我們的sql語句啊,傳入的參數啊。。等等

MyBatis的配置文件

  • 通過前面簡單的MyBatis案例,大家應該了解到了MyBatis框架的基本結構,和Hibernate一樣,MyBatis包含了一個核心配置文件和映射文件。
  • 核心配置文件(mybatis-config.xml):包含了對Mybatis的核心配置,包含連接池信息,事務,加載映射文件,參數設置等配置。
  • 映射文件(EmployeeMapper.xml):主要實現實體對象對數據庫的映射,關聯關系,Sql語句等。

核心配置文件

標簽 說明
配置環境
一些外部屬性,這些屬性可以被替換
Mybatis中極為重要的調整設置,會改變Mybatis的默認行為。
為Java類型設置一個別名,它只和xml配置有關。
映射器,加載MyBatis的映射文件。
插件,Mybatis允許用戶在映射的某一點進行攔截。

環境配置

  1. Mybatis可以通過 配置多種環境,比如開發環境、測試環境和生產環境等。
  2. 不過要記住,盡管可以配置多個環境,但是SqlSessionFactory對象只能加載一個。如果你需要同時連接多個數據庫,需要創建多個SqlSessionFactory實例。

事務管理

在 MyBatis 來進行事務的設置,其中有兩種類型的事務管理器。

  1. JDBC:這個配置就是直接使用了 JDBC 的提交和回滾設置,它依賴於從數據源得到的連接來管理事務范圍。
  2. MANAGED:這個配置幾乎沒做什么。它從來不提交或回滾一個連接,而是讓容器來管理事務的整個生命周期(比如 JEE 應用服務器的上下文)。 默認情況下它會關閉連接,然而一些容器並不希望這樣,因此需要將 closeConnection 屬性設置為 false 來阻止它默認的關閉行為。
<transactionManager type="MANAGED">
    <property name="closeConnection" value="false"/>
</transactionManager>

如果你正在使用 Spring + MyBatis,則沒有必要配置事務管理器, 因為 Spring 模塊會使用自帶的管理器來覆蓋前面的配置。

數據源

使用標准的 JDBC 數據源接口來配置 JDBC 連接對象的資源。有三種數據源類型

  1. UNPOOLED:這個數據源的實現只是每次被請求時打開和關閉連接。
  2. POOLED:這種數據源的實現利用“池”的概念將 JDBC 連接對象組織起來, 避免了創建新的連接實例時所必需的初始化和認證時間。
  3. JNDI:使用JNDI在外部配置數據源。

properties標簽

properties為外部屬性,比如數據庫連接信息可以配置到一個單獨的properties文件中,然后在xml中進行引入。

添加一個db.properties文件

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

在mybatis主配置文件中引用

<properties resource="db.properties" />
<environments default="development">
    <environment id="development">
    	<transactionManager type="JDBC" />
        <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>

映射器

通常MyBatis中將映射關系(非必須)和SQL語句寫入到映射文件中,在配置文件中需要手動進行加載映射文件。加載映射文件使用 進行加載。Mybatis中有4種加載方式。

1.使用resource,加載classpath路徑進行加載。

<mappers>
    <mapper resource="com/simple/mybatis/entitys/EmployeeMapper.xml"/>
</mappers>

2.使用url路徑進行加載。

<mappers>
    <mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>

3.使用calss進行加載,注解方式。

<!– 加載class類-->
<mappers>
    <mapper class="使用注解的全類名"/>
</mappers>

4.使用package進行加載,注解方式。

<!– 加載某個包下的所有class文件-->
<mappers>
    <package name="com.simple.mybatis.entitys"/>
</mappers>

別名的使用

之前,我們在sql映射xml文件中的引用實體類時,resultType需要寫上實體類的全類名(包名+類名),如下:

<select id="findAll" resultType="com.simple.mybatis.entitys.Employee">
		select id,last_name AS lastName,email,gender from tal_employee
</select>

在mybatis主配置文件中 加入

<typeAliases>
    <typeAlias type=“com.simple.mybatis.entitys.Employee" alias="Employee"/>
</typeAliases>

這樣在resultType中就可以直接使用Employee類型了。這個別名是不區分大小寫的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM