MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,而且更名爲MyBatis。是一個基於Java的持久層框架java
不管是Mybatis、Hibernate都是ORM的一種實現框架,都是對JDBC的一種封裝!mysql
到目前爲止,咱們已經在持久層中學了幾種技術了…sql
那咱們爲啥還要學Mybatis呢???如今Mybatis在業內大行其道,那爲啥他能那麼火呢??數據庫
Hibernate是一個比較老舊的框架,用過他的同窗都知道,只要你會用,用起來十分舒服…啥sql代碼都不用寫…可是呢,它也是有的缺點::處理複雜業務時,靈活度差, 複雜的HQL難寫難理解,例如多表查詢的HQL語句apache
而JDBC很容易理解,就那麼幾個固定的步驟,就是開發起來太麻煩了,由於什麼都要咱們本身幹..markdown
而SpringDAO其實就是JDBC的一層封裝,就相似於dbutils同樣,沒有特別出彩的地方….session
咱們能夠認爲,Mybatis就是jdbc和Hibernate之間的一個平衡點…畢竟如今業界都是用這個框架,咱們也不能不學呀!mybatis
其實咱們已經學過了Hibernate了,對於Mybatis入門其實就很是相似的。所以就很簡單就能掌握基本的開發了…oracle
導入Mybatis開發包app
導入mysql/oracle開發包
建立一張表
create table students( id int(5) primary key, name varchar(10), sal double(8,2) );
建立實體:
/** * Created by ozc on 2017/7/21. */ public class Student { private Integer id; private String name; private Double sal; public Student() { } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getSal() { return sal; } public void setSal(Double sal) { this.sal = sal; } }
建立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> <!-- 加載類路徑下的屬性文件 --> <properties resource="db.properties"/> <!-- 設置一個默認的鏈接環境信息 --> <environments default="mysql_developer"> <!-- 鏈接環境信息,取一個任意惟一的名字 --> <environment id="mysql_developer"> <!-- mybatis使用jdbc事務管理方式 --> <transactionManager type="jdbc"/> <!-- mybatis使用鏈接池方式來獲取鏈接 --> <dataSource type="pooled"> <!-- 配置與數據庫交互的4個必要屬性 --> <property name="driver" value="${mysql.driver}"/> <property name="url" value="${mysql.url}"/> <property name="username" value="${mysql.username}"/> <property name="password" value="${mysql.password}"/> </dataSource> </environment> <!-- 鏈接環境信息,取一個任意惟一的名字 --> <environment id="oracle_developer"> <!-- mybatis使用jdbc事務管理方式 --> <transactionManager type="jdbc"/> <!-- mybatis使用鏈接池方式來獲取鏈接 --> <dataSource type="pooled"> <!-- 配置與數據庫交互的4個必要屬性 --> <property name="driver" value="${oracle.driver}"/> <property name="url" value="${oracle.url}"/> <property name="username" value="${oracle.username}"/> <property name="password" value="${oracle.password}"/> </dataSource> </environment> </environments> </configuration>
使用Mybatis的API來建立一個工具類,經過mybatis配置文件與數據庫的信息,獲得Connection對象
package cn.itcast.javaee.mybatis.util; import java.io.IOException; import java.io.Reader; import java.sql.Connection; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; /** * 工具類 * @author AdminTC */ public class MybatisUtil { private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); private static SqlSessionFactory sqlSessionFactory; /** * 加載位於src/mybatis.xml配置文件 */ static{ try { Reader reader = Resources.getResourceAsReader("mybatis.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } } /** * 禁止外界經過new方法建立 */ private MybatisUtil(){} /** * 獲取SqlSession */ public static SqlSession getSqlSession(){ //從當前線程中獲取SqlSession對象 SqlSession sqlSession = threadLocal.get(); //若是SqlSession對象爲空 if(sqlSession == null){ //在SqlSessionFactory非空的狀況下,獲取SqlSession對象 sqlSession = sqlSessionFactory.openSession(); //將SqlSession對象與當前線程綁定在一塊兒 threadLocal.set(sqlSession); } //返回SqlSession對象 return sqlSession; } /** * 關閉SqlSession與當前線程分開 */ public static void closeSqlSession(){ //從當前線程中獲取SqlSession對象 SqlSession sqlSession = threadLocal.get(); //若是SqlSession對象非空 if(sqlSession != null){ //關閉SqlSession對象 sqlSession.close(); //分開當前線程與SqlSession對象的關係,目的是讓GC儘早回收 threadLocal.remove(); } } /** * 測試 */ public static void main(String[] args) { Connection conn = MybatisUtil.getSqlSession().getConnection(); System.out.println(conn!=null?"鏈接成功":"鏈接失敗"); } }
配置實體與表的映射關係
<?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"> <!-- namespace屬性是名稱空間,必須惟一 --> <mapper namespace="cn.itcast.javaee.mybatis.app04.Student"> <!-- resultMap標籤:映射實體與表 type屬性:表示實體全路徑名 id屬性:爲實體與表的映射取一個任意的惟一的名字 --> <resultMap type="student" id="studentMap"> <!-- id標籤:映射主鍵屬性 result標籤:映射非主鍵屬性 property屬性:實體的屬性名 column屬性:表的字段名 --> <id property="id" column="id"/> <result property="name" column="name"/> <result property="sal" column="sal"/> </resultMap> </mapper>
如今咱們已經有了Mybatis的配置文件和表與實體以前的映射文件了,所以咱們要將配置文件和映射文件關聯起來
<mappers> <mapper resource="StudentMapper.xml"/> </mappers>
在測試類上,咱們是能夠獲取獲得鏈接的
public class StudentDao { public void add(Student student) throws Exception { //獲得鏈接對象 SqlSession sqlSession = MybatisUtil.getSqlSession(); sqlSession.insert(); } public static void main(String[] args) throws Exception { StudentDao studentDao = new StudentDao(); Student student = new Student(1, "zhongfucheng", 10000D); studentDao.add(student); } }
到如今爲止,咱們實體與表的映射文件僅僅映射了實體屬性與表的字段的關係…
咱們在Hibernate中若是想要插入數據什麼的,只要調用save()方法就好了。Hibernate是自動化屏蔽掉了數據庫的差別,而咱們Mybatis是須要本身手動編寫SQL代碼的…
那麼SQL代碼是寫在哪裏的呢???明顯地,咱們做爲一個框架,不可能在程序中寫SQL,咱們是在實體與表的映射文件中寫的!
Mybatis實體與表的映射文件中提供了insert標籤【SQL代碼片斷】供咱們使用
//在JDBC中咱們一般使用?號做爲佔位符,而在Mybatis中,咱們是使用#{}做爲佔位符 //parameterType咱們指定了傳入參數的類型 //#{}實際上就是調用了Student屬性的get方法 <insert id="add" parameterType="Student"> INSERT INTO ZHONGFUCHENG.STUDENTS (ID, NAME, SAL) VALUES (#{id},#{name},#{sal}); </insert>
在程序中調用映射文件的SQL代碼片斷
public void add(Student student) throws Exception { //獲得鏈接對象 SqlSession sqlSession = MybatisUtil.getSqlSession(); try{ //映射文件的命名空間.SQL片斷的ID,就能夠調用對應的映射文件中的SQL sqlSession.insert("StudentID.add", student); sqlSession.commit(); }catch(Exception e){ e.printStackTrace(); sqlSession.rollback(); throw e; }finally{ MybatisUtil.closeSqlSession(); } }
值得注意的是:Mybatis中的事務是默認開啓的,所以咱們在完成操做之後,須要咱們手動去提交事務!