一、MyBatis簡介
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,並且改名爲MyBatis 。這就是爲什麼很多人既把它稱爲iBatis又稱爲MyBatis的原因;2013年11月遷移到Github。
MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
二、MyBatis入門案例
1、首先新建一個Maven Java項目,Maven依賴如下:
<!-- 配置Mybatis的Jar文件 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.1</version>
</dependency>
<!-- 配置MySql數據庫 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- 配置log4j日誌 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.9</version>
</dependency>
Maven自動加載依賴Jar包完畢後,項目結構如下圖所示:
2、創建數據庫文件
-- ----------------------------
-- Table structure for sl_company
-- ----------------------------
DROP TABLE IF EXISTS `sl_company`;
CREATE TABLE `sl_company` (
`company_id` int(11) NOT NULL AUTO_INCREMENT,
`company_name` varchar(50) DEFAULT NULL,
`full_name` varchar(100) DEFAULT NULL,
`web` varchar(45) DEFAULT NULL,
`address` varchar(100) DEFAULT NULL,
`postcode` varchar(45) DEFAULT NULL,
`phone` varchar(45) DEFAULT NULL,
`email` varchar(45) DEFAULT NULL,
PRIMARY KEY (`company_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of sl_company
-- ----------------------------
INSERT INTO `sl_company` VALUES ('1', '銳客科技1', '上海銳客科技股份有限公司', 'www.codeman.cn', '上海市浦東新區峨山路91弄97號陸家嘴軟件園5號樓3層', '200127', '4008202993', '[email protected]');
3、由於每一個數據持久層框架都需要一個與數據庫連接的配置文件,同樣在src/main/resource下新建一個mybatis.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="development">
<environment id="development">
<!-- 配置事務管理器 -->
<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>
</configuration>
4、定義表所對應的實體類,包結構如下,需要注意的是實體類屬性的名稱與表中字段名稱一致:
package com.mybatis.entity;
import java.io.Serializable;
public class SlCompany implements Serializable {
private static final long serialVersionUID = 1L;
/**
* company_id:
*/
private int company_id;
/**
* company_name:
*/
private String company_name;
/**
* full_name:
*/
private String full_name;
/**
* web:
*/
private String web;
/**
* address:
*/
private String address;
/**
* postcode:
*/
private String postcode;
/**
* phone:
*/
private String phone;
/**
* email:
*/
private String email;
public SlCompany() {
super();
}
public SlCompany(int company_id, String company_name, String full_name, String web, String address, String postcode,
String phone, String email) {
super();
this.company_id = company_id;
this.company_name = company_name;
this.full_name = full_name;
this.web = web;
this.address = address;
this.postcode = postcode;
this.phone = phone;
this.email = email;
}
public int getCompany_id() {
return company_id;
}
public void setCompany_id(int company_id) {
this.company_id = company_id;
}
public String getCompany_name() {
return company_name;
}
public void setCompany_name(String company_name) {
this.company_name = company_name;
}
public String getFull_name() {
return full_name;
}
public void setFull_name(String full_name) {
this.full_name = full_name;
}
public void setWeb(String web) {
this.web = web;
}
public String getWeb() {
return web;
}
public void setAddress(String address) {
this.address = address;
}
public String getAddress() {
return address;
}
public void setPostcode(String postcode) {
this.postcode = postcode;
}
public String getPostcode() {
return postcode;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPhone() {
return phone;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmail() {
return email;
}
}
5、新建一個包,該包專門放置配置文件,並且新建一個slCompanyMapper.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屬性,這個屬性的作用是爲了將該映射聲明爲唯一的,以便後續可以通過該命名空間直接調用 -->
<!-- 該命名空間的格式是包名+該映射文件的名字 -->
<mapper namespace="com.mybatis.mappings.slCompanyMapper">
<!-- 根據id查詢得到一個user對象 -->
<!-- parameterType屬性標識查詢傳入參數的類型 -->
<!-- resultType屬性標識該查詢執行完畢後的返回值類型 -->
<select id="getSlCompany" parameterType="int" resultType="com.mybatis.entity.SlCompany">
select * from sl_company where company_id=#{id}
</select>
</mapper>
6、修改mybatis.xml文件內容,添加將上述slCompanyMapper.xml配置到mybatis.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="development">
<environment id="development">
<!-- 配置事務管理器 -->
<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/mybatis/mappings/slCompanyMapper.xml"/>
</mappers>
</configuration>
7、編寫測試類,代碼如下:
package com.mybatis.test;
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;
import com.mybatis.entity.SlCompany;
public class MyBatisTest {
public static void main(String[] args) throws IOException {
// mybatis提供了Resources類用來提供簡易方式來獲取各種來源的資源文件信息
// 獲取mybatis.xml的字節流
InputStream is = Resources.getResourceAsStream("mybatis.xml");
// 獲取mybatis.xml的字符流
//Reader reader = Resources.getResourceAsReader("mybatis.xml");
// 構建SqlSessionFactory對象,傳入字符流或字節流均可
SqlSessionFactory SqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 獲取SqlSession對象
SqlSession sqlSession = SqlSessionFactory.openSession();
// 執行查詢操作
// selectOne()方法的第一個參數是由slCompanyMapper.xml裏配置的mapper的namespace屬性 + 該mapper下select元素的id屬性值組成的
SlCompany slCompany = sqlSession.selectOne("com.mybatis.mappings.slCompanyMapper.getSlCompany", 1);
System.out.println(slCompany.getCompany_name());
}
}
執行後發現,數據庫中的符合條件的公司名稱確實被打印出來了;
通過以上示例,我們可以得知MyBatis需要以下幾個配置信息:
a)一個配置數據庫連接信息,以及整合各種mapper信息的文件,比如該例的mybatis.xml
b)一個專門配置對各種SQL進行唯一的映射文件,如本例中的slCompanyMapper.xml
c)mybatis框架的三個常用API:Resources、SqlSessionFactory、SqlSessionFactoryBuilder、SqlSession的使用
即通過Resources資源類獲取各種資源來源的配置信息
通過SqlSessionFactoryBuilder獲取對應的SqlSessionFactory對象
通過SqlSessionFactory獲取SQL執行者SqlSession對象
通過SqlSession,通過傳入唯一映射SQL的id執行對應的SQL,獲取指定類型的結果
以上,是一個入門級的MyBatis例子,可以大體看出MyBatis的輪廓,後續會逐漸解開MyBatis更多的面紗;