MyBatis(原名是ibatis)簡介java
MyBatis是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎全部的JDBC代碼和參數的手工設置以及對結果集的檢索封裝。MyBatis可使用簡單的XML或註解用於配置和原始映射,將接口和Java的POJO(Plain Old Java Objects,普通的Java對象)映射成數據庫中的記錄.mysql
與數據庫進行交互,有不少種方法或者框架:由簡到繁能夠排列爲:sql
JDBC->dbutils->MyBatis->Hibernateshell
JDBC不用多說,最基本的Java數據庫交互手段。數據庫
dbutils相對於JDBC的優點在於,它可以自動封裝查詢結果集,不須要操做statement或resualtset。可是,它的CRUD操做仍是須要寫SQL語句的。apache
Hibernate則徹底是與對象打交道了,存一個對象的數據只須要save(object)就能夠了。session
而Mybaits是介於dbutils與Hibernate之間的東西。Mybatis須要寫SQL語句,可是不是存放在Java代碼中,而是存放在xml文件中,至關於一箇中間件同樣,當Java代碼須要與數據庫進行交互,就調用這個xml中大的SQL語句。另外,與xml並行的是,還可使用註解來完成這個操做。mybatis
那麼,既然有了Hibernate,爲何還須要Mybatis呢?不少狀況下是爲了不浪費,好比一些查詢,咱們能夠控制在咱們但願的範圍內。相比於dbutils,Mybatis的優點呢?Mybatis雖然不像Hibernate那樣是徹底圍繞對象的,可是Mybatis在Java代碼中操做的仍然是對象,只是須要xml中的SQL與數據庫交互;而dbutils的Java代碼仍然須要操做SQL。app
那麼接下來,咱們來用一個例子梳理構建一個Mybatis應用的通常步驟:框架
咱們但願作這樣一件事情:咱們在數據庫中構造一個users表,在代碼模塊中構建一個User類,users表的字段與User的屬性是徹底一一對應的。如今,咱們但願經過輸入一個id字段或者屬性值,將相應的users表中的記錄行查詢出來並自動封裝成User對象。那麼,如今的問題就是如何造成這種代碼區的對象與數據庫表的映射,以及如何在此基礎上構建一個咱們須要的查詢服務。這就須要咱們的Mybatis。
(本文出自:http://my.oschina.net/happyBKs/blog/473255)
環境與項目的搭建:
爲了方便,我使用的IDE是STS,項目用的是Maven的quickstart項目。
首先,咱們須要導入相應的jar。包括mybatis的和mysql driver。
pom.xml以下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.happyBKs.mybatis</groupId> <artifactId>C1</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>C1</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.35</version> </dependency> </dependencies> </project>
而後,加入一個源文件文件夾,命名爲src/main/resources,爲的是之後存放項目中的各類配置文件和資源文件。
最後,咱們把數據庫搭建好。我用的是mysql-5.6.25,用bin下的mysqld命令登陸。
bin> mysqld -u root
這裏我是默認的設置,用戶名root,密碼爲空。
構建Mybatis程序的基本步驟:
1.數據庫建表users,並插入數據。
create database mybatis; use mybatis; CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT); INSERT INTO users(NAME, age) VALUES('Tom', 12); INSERT INTO users(NAME, age) VALUES('Jack', 11);
happyBKs很但願根紅苗正的mysql workbench。在那裏操做吧。
2. 添加Mybatis的配置文件config.xml
這個文件是mybatis的核心配置文件,包含了數據庫配置信息,如driver名稱、數據庫url、用戶名和密碼等;還包含了咱們剛纔提到的映射的構建,也是在這裏把全部的映射文件羅列出來。
在實際使用時,咱們須要先行加載這裏文件,因此可謂是整個,Mybatis的項目配置文件的樹幹部分。
在這個項目中,我將config.xml放到了src/main/resources文件夾下。
這裏,咱們先只進行數據庫配置,映射配置等會兒再說。
<?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> <!-- development: 開發模式 work: 工做模式 --> <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="" /> </dataSource> </environment> </environments> </configuration>
值得一提的是,這裏的evironments或environment能夠有兩種模式:
development: 開發模式
work: 工做模式
區別這裏不說,影響不大。可是請注意,不管你選擇哪種模式,請讓evironments或environment的模式保持統一,不然要出問題的哦。
3. 定義表所對應的實體類
這裏咱們構建一個與users表對應的類User。
package com.happyBKs.mybatis.C1; public class User { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public User(int id, String name, int age) { super(); this.id = id; this.name = name; this.age = age; } public User() { super(); } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + "]"; } } //shift+alt+s, 誰用誰知道
這裏差一個題外話,爲了給初學者們一個提醒,高手們是如何寫bean類定義的,果斷shift+alt+s。
4. 定義操做users表的sql映射文件userMapper.xml
這裏應該是最核心的部分了,怎麼把類與表關聯;如何寫一個服務,如按id查詢。
<?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.happyBKs.mybatis.C1.userMapper"> <!-- 根據id查詢對象 --> <select id="getUser" parameterType="int" resultType="com.happyBKs.mybatis.C1.User"> select * from users where id=#{id} </select> </mapper>
構建一個映射,就是要構建一個mapper節點並配置。mapper須要一個惟一性的標識,就是namespace屬性,這裏給出一種比較經常使用的命名規範,用User類的包名 + 這個映射文件的文件名。這裏文件名的命名規範是,類名首字母小寫+Mapper。固然這只是一種習慣或者規範,你固然也能夠命名成其餘形式,只要能保證其惟一性。
而後,如何把類與表關聯起來呢?Mybatis沒有像Hibernate那樣,在配置文件中將數據庫名和類名、數據庫字段和類屬性直接對應着配置創建映射。Mybatis是直接在構建服務的過程當中將類名和表包含其中:構建一個查詢服務,要用到select節點,User類名在select的resultType中被指定;代表這是在select節點內容的SQL查詢語句中被寫明。因此,Mybatis與Hibernate相比,並不能是一種映射結構清楚、映射程度徹底的解決方案,可是Mybatis也的確很靈活和方便,咱們能夠本身定製SQL語句,而且也完成了類與表在服務上的映射關係。
好吧,咱們仍是看看這個服務吧。
select標籤中咱們指定了三個屬性。服務的id,這個和users表中的id字段沒有任何關係。select的id是用來標識這個服務的名稱,咱們在後面調用服務的時候會用到,固然它要求命名惟一。parameterType標識輸入參數的類型,這裏咱們是按users的id字段進行查詢,因此這裏的參數類型指的就是users的id字段類型。在select節點的SQL語句中,咱們用通配符來標識這個參數#{id}。resultType用來標識服務的返回結果的類型,是一個User類的對象。
5. 在config.xml文件中註冊userMapper.xml文件
全部的映射文件須要統一在mybatis的配置文件config.xml中註冊。方法就是構建一個mappers節點,而後爲每一個映射文件構建一個mapper節點。
<?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> <!-- development: 開發模式 work: 工做模式 --> <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="" /> </dataSource> </environment> </environments> <!-- 在conf.xml文件中註冊userMapper.xml文件 --> <mappers> <mapper resource="com/happyBKs/mybatis/C1/userMapper.xml"/> </mappers> </configuration>
6. 測試程序:
好吧,咱們來調用看看吧。
這裏我給出兩段測試代碼,功能同樣。第二個比較推薦,由於家在配置文件config.xml時使用了類加載器。
大體思路是:
我須要一個Session,它接收一個statement和一個參數來完成查詢。
statement如何是描述服務的,怎麼描述呢。就是要用到咱們剛纔usrMapper.xml映射文件中定義的命名空間 + select服務標籤的id內容,這樣就標記出來了惟一性的服務,他但是包含了SQL語句和類與表映射關係的哦。
那麼,session從哪來,用SqlSessionFactory對象造出來。
那麼,SqlSessionFactory從哪來,用SqlSessionFactoryBuilder來build出來。好吧,這裏構造一個SqlSessionFactory對象,須要指定數據庫配置等信息,那麼很天然的須要在build方法中提供mybaitis的config.xml配置文件的內容。這裏提供配置文件config.xml內容的方式是傳入一個InputStream。
因此一開始就須要構建一個config.xml的InputStream對象。
package com.happyBKs.mybatis.C1; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class App { public static void main( String[] args ) { test2(); } private static void test1() throws IOException { String resource = "config.xml"; //加載mybatis的配置文件(它也加載關聯的映射文件) Reader reader = Resources.getResourceAsReader(resource); //構建sqlSession的工廠 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); //建立能執行映射文件中sql的sqlSession SqlSession session = sessionFactory.openSession(); //映射sql的標識字符串 String statement = "com.happyBKs.mybatis.C1.userMapper"+".getUser";//先找映射文件,後找標籤 //執行查詢返回一個惟一user對象的sql User user = session.selectOne(statement, 1); System.out.println(user); } private static void test2() { String resource = "config.xml"; //用類加載器加載mybatis的配置文件 InputStream inputStream=App.class.getClassLoader().getResourceAsStream(resource); SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = factory.openSession(); String statement = "com.happyBKs.mybatis.C1.userMapper"+".getUser";//先找映射文件,後找標籤 User user = session.selectOne(statement,2);//根據id查,這裏id爲2 //類型不須要強轉,強大吧 System.out.println(user); } }
好吧,最後看看結果。