1. 程式人生 > >搭建Mybatis步驟

搭建Mybatis步驟

一、Mybatis介紹
   在這裡插入圖片描述
  MyBatis是一個支援普通SQL查詢,儲存過程和高階對映的優秀持久層框架。MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及對結果集的檢索封裝。MyBatis可以使用簡單的XML或註解用於配置和原始對映,將介面和Java的POJO(Plain Old Java Objects,普通的Java物件)對映成資料庫中的記錄。
二、mybatis快速入門
2.1、準備開發環境
1、建立測試專案,普通java專案或者是JavaWeb專案均可,如下圖所示:
  
2、新增相應的jar包
  【mybatis】
  mybatis-3.1.1.jar
  【MYSQL驅動包】
    mysql-connector-java-5.1.7-bin.jar

3、建立資料庫和表,針對MySQL資料庫
  SQL指令碼如下:
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(‘孤傲蒼狼’, 27);
INSERT INTO users(NAME, age) VALUES(‘白虎神皇’, 27);
select * from users;

將SQL指令碼在MySQL資料庫中執行,完成建立資料庫和表的操作,如下:
到此,前期的開發環境準備工作全部完成。
2.2、使用MyBatis查詢表中的資料
  1、新增Mybatis的配置檔案conf.xml
  在src目錄下建立一個conf.xml檔案,如下圖所示:
  
  conf.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>
<!—
配置MyBatis執行環境。
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="java" />
</dataSource>
</environment>
</environments>


</configuration>

2、定義表所對應的實體類,如下圖所示:
  
 User類的程式碼如下:

package com.cn.entity;
/**
 * @author gacl
 * users表所對應的實體類
*/

public class Users {
	//實體類的屬性和表的欄位名稱一一對應
	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 String toString() {
	        return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
	  }


} 

3、定義操作users表的sql對映檔案userMapper.xml
  建立一個com.cn.mapping包,專門用於存放sql對映檔案,在包中建立一個userMapper.xml檔案,如下圖所示:

在建立XML前要先引入DTD檔案,步驟如下

點選add按鈕

點選File System按鈕

找到DTD檔案,key中輸入-//mybatis.org//DTD Mapper 3.0//EN點選OK
在com.cn.mapping包下建立XML檔案

輸入名字後點擊NEXT

選擇第一項,點選next

選擇第二項

點選finish

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,namespace的值習慣上設定成包名+sql對映檔名,這樣就能夠保證namespace的值是唯一的
  例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml檔案去除字尾)
   -->
<mapper namespace="com.cn.mapping.usersMapper">
<!-- 在select標籤中編寫查詢的SQL語句, 設定select標籤的id屬性為getUser,id屬性值必須是唯一的,不能夠重複
      使用parameterType屬性指明查詢時使用的引數型別,resultType屬性指明查詢返回的結果集型別
     resultType="me.gacl.domain.User"就表示將查詢結果封裝成一個User類的物件返回
     User類就是users表所對應的實體類
     -->
<!-- 
         根據id查詢得到一個user物件
      -->
<select id="getUser" parameterType="int" 
         resultType="com.cn.entity.Users">
         select * from users where id=#{id}
</select>


</mapper>

4、在conf.xml檔案中註冊userMapper.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="java" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 註冊userMapper.xml檔案, 
         userMapper.xml位於me.gacl.mapping這個包下,所以resource寫成me/gacl/mapping/userMapper.xml-->
<mapper resource="com/cn/mapping/usersMapper.xml"/>



</mappers>

</configuration>

5、編寫測試程式碼:執行定義的select語句
  建立一個Test1類,編寫如下的測試程式碼:

package me.gacl.test;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import me.gacl.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

publicclass Test1 {

public static void main(String[] args) throws IOException {
//mybatis的配置檔案
		 String resource = "conf.xml";
		//使用類載入器載入mybatis的配置檔案(它也載入關聯的對映檔案)
		 InputStream is = Test1.class.getClassLoader().getResourceAsStream(resource);
		//構建sqlSession的工廠
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
		
        //建立能執行對映檔案中sql的sqlSession
        SqlSession session = sessionFactory.openSession();
		/**
         * 對映sql的標識字串,
         * me.gacl.mapping.userMapper是userMapper.xml檔案中mapper標籤的namespace屬性的值,
         * getUser是select標籤的id屬性值,通過select標籤的id屬性值就可以找到要執行的SQL
         */
        String statement = "com.cn.mapping.usersMapper.getUser";//對映sql的標識字串
        //執行查詢返回一個唯一user物件的sql
        Users user = session.selectOne(statement, 1);
        System.out.println(user);    }
}

執行結果如下:
  
  可以看到,資料庫中的記錄已經成功查詢出來了。

一、使用MyBatis對錶執行CRUD操作——基於XML的實現

  1. 先建立類MyBatisUtil.java類
package com.cn.util;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisUtil {

	 /**
     * 獲取SqlSessionFactory
     * @return SqlSessionFactory
     */
    public static SqlSessionFactory getSqlSessionFactory() {
        String resource = "conf.xml";
        InputStream is = MyBatisUtil.class.getClassLoader().getResourceAsStream(resource);
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        return factory;
    }
    
    /**
     * 獲取SqlSession
     * @return SqlSession
     */
    public static SqlSession getSqlSession() {
        return getSqlSessionFactory().openSession();
    }
    
    /**
     * 獲取SqlSession
     * @param isAutoCommit 
     *         true 表示建立的SqlSession物件在執行完SQL之後會自動提交事務
     *         false 表示建立的SqlSession物件在執行完SQL之後不會自動提交事務,這時就需要我們手動呼叫sqlSession.commit()提交事務
     * @return SqlSession
     */
    public static SqlSession getSqlSession(boolean isAutoCommit) {
        return getSqlSessionFactory().openSession(isAutoCommit);
    }

}

1、定義sql對映xml檔案
  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,namespace的值習慣上設定成包名+sql對映檔名,這樣就能夠保證namespace的值是唯一的
  例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml檔案去除字尾)
   -->
<mapper namespace="com.cn.mapping.usersMapper">
<!-- 在select標籤中編寫查詢的SQL語句, 設定select標籤的id屬性為getUser,id屬性值必須是唯一的,不能夠重複
      使用parameterType屬性指明查詢時使用的引數型別,resultType屬性指明查詢返回的結果集型別
     resultType="me.gacl.domain.User"就表示將查詢結果封裝成一個User類的物件返回
     User類就是users表所對應的實體類
     -->
<!-- 
         根據id查詢得到一個user物件
      -->
<select id="getUser" parameterType="int" 
         resultType="com.cn.entity.Users">
         select * from users where id=#{id}
</select>
<!-- 建立使用者(Create) -->
<insert id="addUser" parameterType="com.cn.entity.Users">
         insert into users(name,age) values(#{name},#{age})
</insert>

<!-- 刪除使用者(Remove) -->
<delete id="deleteUser" parameterType="int">
         delete from users where id=#{id}
</delete>

<!-- 修改使用者(Update) -->
<update id="updateUser" parameterType="com.cn.entity.Users">
         update users set name=#{name},age=#{age} where id=#{id}
</update>

<!-- 查詢全部使用者-->
<select id="getAllUsers" resultType="com.cn.entity.Users">
         select * from users
</select>

</mapper>

單元測試類程式碼如下:

package com.cn.test;

import java.util.List;

import javax.xml.registry.infomodel.User;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import com.cn.entity.Users;
import com.cn.util.MyBatisUtil;

public class TestCRUDByXmlMapper {

	@Test
	     public void testAdd(){
	         //SqlSession sqlSession = MyBatisUtil.getSqlSession(false);
	         SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
	         /**
	          * 對映sql的標識字串,
	          * com.cn.mapping.usersMapper是usersMapper.xml檔案中mapper標籤的namespace屬性的值,
	          * addUser是insert標籤的id屬性值,通過insert標籤的id屬性值就可以找到要執行的SQL
	          */
	         String statement = "com.cn.mapping.usersMapper.addUser";//對映sql的標識字串
	         Users user = new Users();
	         user.setName("使用者孤傲蒼狼");
	         user.setAge(20);
	         //執行插入操作
	         int retResult = sqlSession.insert(statement,user);
	         //手動提交事務
	         //sqlSession.commit();
	         //使用SqlSession執行完SQL之後需要關閉SqlSession
	         sqlSession.close();
	         System.out.println(retResult);
	     }
	
	     @Test
	     public void testUpdate(){
	         SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
	         /**
	          * 對映sql的標識字串,
	          * com.cn.mapping.usersMapper是usersMapper.xml檔案中mapper標籤的namespace屬性的值,
	          * updateUser是update標籤的id屬性值,通過update標籤的id屬性值就可以找到要執行的SQL
	          */
	         String statement = "com.cn.mapping.usersMapper.updateUser";//對映sql的標識字串
	         Users user = new Users();
	         user.setId(3);
	         user.setName("孤傲蒼狼");
	         user.setAge(25);
	         //執行修改操作
	         int retResult = sqlSession.update(statement,user);
	         //使用SqlSession執行完SQL之後需要關閉SqlSession
	         sqlSession.close();
	         System.out.println(retResult);
	     }
	
	     @Test
	     public void testDelete(){
	         SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
	         /**
	          * 對映sql的標識字串,
	          * com.cn.mapping.usersMapper是usersMapper.xml檔案中mapper標籤的namespace屬性的值,
	          * deleteUser是delete標籤的id屬性值,通過delete標籤的id屬性值就可以找到要執行的SQL
	          */
	         String statement = "com.cn.mapping.usersMapper.deleteUser";//對映sql的標識字串
	         //執行刪除操作
	         int retResult = sqlSession.delete(statement,5);
	         //使用SqlSession執行完SQL之後需要關閉SqlSession
	         sqlSession.close();
	         System.out.println(retResult);
	     }
	
	     @Test
	     public void testGetAll(){
	         SqlSession sqlSession = MyBatisUtil.getSqlSession();
	         /**
	          * 對映sql的標識字串,
	          * com.cn.mapping.usersMapper是usersMapper.xml檔案中mapper標籤的namespace屬性的值,
	          * getAllUsers是select標籤的id屬性值,通過select標籤的id屬性值就可以找到要執行的SQL
	          */
	         String statement = "com.cn.mapping.usersMapper.getAllUsers";//對映sql的標識字串
	         //執行查詢操作,將查詢結果自動封裝成List<User>返回
	         List<User> lstUsers = sqlSession.selectList(statement);
	         //使用SqlSession執行完SQL之後需要關閉SqlSession
	         sqlSession.close();
	         System.out.println(lstUsers);
	     }

}

一、連線資料庫的配置單獨放在一個properties檔案中
  之前,我們是直接將資料庫的連線配置資訊寫在了MyBatis的conf.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="java"/>
</dataSource>
</environment>
</environments>

</configuration>
 

其實我們完全可以將資料庫的連線配置資訊寫在一個properties檔案中,然後在conf.xml檔案中引用properties檔案,具體做法如下:
  1、在src目錄下新建一個db.properties檔案,如下圖所示:
  
  在db.properties檔案編寫連線資料庫需要使用到的資料庫驅動,連線URL地址,使用者名稱,密碼,如下:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
name=root
password=java

2、在MyBatis的conf.xml檔案中引用db.properties檔案,如下:

<?xml version="1.0" encoding="UTF-8"?>
 2<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
 3<configuration>
 4
 5<!-- 引用db.properties配置檔案 -->
 6<properties resource="db.properties"/>
 7<!--
 8        development : 開發模式
 9        work : 工作模式
10-->
11<environments default="development">
12<environment id="development">
13<transactionManager type="JDBC"/>
14<!-- 配置資料庫連線資訊 -->
15<dataSource type="POOLED">
16<!-- value屬性值引用db.properties配置檔案中配置的值 -->
17<property name="driver" value="${driver}"/>
18<property name="url" value="${url}"/>
19<property name="username" value="${name}"/>
20<property name="password" value="${password}"/>
21</dataSource>
22</environment>
23</environments>
24
25</configuration>

二、為實體類定義別名,簡化sql對映xml檔案中的引用
  之前,我們在sql對映xml檔案中的引用實體類時,需要寫上實體類的全類名(包名+類名),如下:

<!-- 建立使用者(Create) -->
<insert id="addUser" parameterType="me.gacl.domain.User">
    insert into users(name,age) values(#{name},#{age})
</insert>

parameterType="me.gacl.domain.User"這裡寫的實體類User的全類名me.gacl.domain.User,每次都寫這麼一長串內容挺麻煩的,而我們希望能夠簡寫成下面的形式

<insert id="addUser2" parameterType="_User">
    insert into users(name,age) values(#{name},#{age})
</insert>

parameterType="_User"這樣寫就簡單多了,為了達到這種效果,我們需要在conf.xml檔案中為實體類=“me.gacl.domain.User"定義一個別名為”_User",具體做法如下:
  在conf.xml檔案中標籤中新增如下配置:

<typeAliases>
<typeAlias type="me.gacl.domain.User" alias="_User"/>
</typeAliases>

這樣就可以為me.gacl.domain.User類定義了一個別名為_User,以後_User就代表了me.gacl.domain.User類,這樣sql對映xml檔案中的凡是需要引用me.gacl.domain.User類的地方都可以使用_User來代替,這就達到了一個簡化實體類引用的目的。
  除了可以使用這種方式單獨為某一個實體類設定別名之外,我們還可以使用如下的方式批量為某個包下的所有實體類設定別名,如下:

<!-- 配置實體類的別名,配置實體類別名的目的是為了在引用實體類時可以使用實體類的別名來代替實體類,達到簡寫的目的 -->
<typeAliases>
<!-- 為實體類me.gacl.domain.User配置一個別名_User -->
<!-- <typeAlias type="me.gacl.domain.User" alias="_User"/> -->
<!-- 為me.gacl.domain包下的所有實體類配置別名,MyBatis預設的設定別名的方式就是去除類所在的包後的簡單的類名
        比如me.gacl.domain.User這個實體類的別名就會被設定成User
         -->
<package name="me.gacl.domain"/>
</typeAliases>
<package name="me.gacl.domain"/>就表示為這個包下面的所有實體類設定別名

MyBatis預設的設定別名的方式就是去除類所在的包後的簡單的類名,比如me.gacl.domain.User這個實體類的別名就會被設定成User。
在平時的開發中,我們表中的欄位名和表對應實體類的屬性名稱不一定都是完全相同的,下面來演示一下這種情況下的如何解決欄位名與實體類屬性名不相同的衝突。