MyBatis筆記(一)——帶你入門帶你飛

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);
	}
}


好吧,最後看看結果。

相關文章
相關標籤/搜索