曾命名IBatis(老版本), 交給Google維護後,更名爲MyBatis(新版本)。
學習文檔:
https://mybatis.org/mybatis-3/zh/index.htmlhtml
封裝了JDBC操做,簡化數據庫訪問代碼。
封裝功能:
(1)封裝了獲取鏈接,執行SQL語句,釋放鏈接。
(2)封裝了SQL參數設置。例如:insert into emp (name,age) values(#{name}, #{age})
(3)封裝了記錄映射成實體對象的過程。
注:java
實體類屬性名與查詢結果集ResultSet中的列名(並不必定是數據庫中表的列名,而是取出時的列名、或者叫別名)要保持一致。mysql
step1:導入相關jar包(mybatis包 + 數據庫驅動包)。
step2:編寫mybatis配置的xml文件。用於指定數據庫鏈接參數和SQL定義文件的位置。
step3:編寫相關實體類(以及接口類)。
step4:編寫sql語句的xml文件。用於定義SQL語句。
step5:使用SqlSession對象執行SQL操做(SqlSession 操做 是非線程安全的)。sql
step1:導包。數據庫
step2:編寫mybatis配置的xml文件。apache
【config/mybatis-config.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="environment"> <environment id="environment"> <transactionManager type="JDBC"/> <!-- MyBatis自帶鏈接池,只需配置數據庫鏈接的一些數據便可 此處以MySql爲例。 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/lyh?useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 加載SQL定義文件,須要修改 如有多個SQL定義文件,可使用<mapper />標籤追加。 文件路徑中存在.的話,使用/分割 --> <mappers> <mapper resource="config/EmpMapper.xml"/> </mappers> </configuration>
step3:編寫相關實體類對象。編程
【entity.Employee.java】
package entity;
import java.io.Serializable;
/**
* 實體類
*/
public class Employee implements Serializable{
private Integer id;
private String name;
private Double salary;
private Integer age;
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 getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
", salary=" + salary +
", age=" + age +
'}';
}
}
step4:編寫sql語句的xml文件。安全
【config/EmpMapper.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="mybatisDemo.entity.Employee"> <!-- namespace 指命名空間 id 指的是sql語句惟一表示 resultType 指的是sql的返回類型(使用全類名錶示) #{id} 表示接收參數,至關於佔位符,(可以使用 ${id},其將數據直接顯示在sql語句中) --> <select id="selectEmp" resultType="entity.Employee"> select * from emp where id = #{id} </select> </mapper>
step5:使用SqlSession對象執行SQL操做。網絡
【test.Demo.java】
package test;
import entity.Employee;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class Demo {
@Test
public void test() throws IOException {
// step1:讀取配置文件
String resource = "config/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// step2:建立一個 SqlSessionFactory 的對象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// step3:獲取一個 SqlSession 的實例
SqlSession session = sqlSessionFactory.openSession();
try{
// 根據惟一的sql id 定位到sql語句。
Employee employee = session.selectOne("selectEmp", 1);
System.out.println(employee);
}finally {
// step4:關閉 SqlSession 實例
session.close();
}
}
}
step6:測試截圖session
(1)定義一個接口,裏面定義一系列方法,並將這些方法與 sql 語句的xml文件 進行映射。
(2)其中 方法名爲 xml 文件中 的 惟一id標識, 並使用 resultType、resultMap 來定義返回值類型。
(3)與基本的方式相比,增長了個 接口類,映射到 sql 的 xml 文件(經過命名空間 namespace 來映射接口,id 爲 接口的方法名),並經過接口類來進行sql的調用。
step1:導包
step2:編寫mybatis配置的xml文件。
【config/mybatis-config.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="environment"> <environment id="environment"> <transactionManager type="JDBC"/> <!-- MyBatis自帶鏈接池,只需配置數據庫鏈接的一些數據便可 此處以MySql爲例。 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/lyh?useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 加載SQL定義文件,須要修改 如有多個SQL定義文件,可使用<mapper />標籤追加。 文件路徑中存在.的話,使用/分割 --> <mappers> <mapper resource="config/EmpMapper.xml"/> </mappers> </configuration>
step3:編寫相關實體類對象。
【entity.Employee.java】
package entity;
import java.io.Serializable;
/**
* 實體類
*/
public class Employee implements Serializable{
private Integer id;
private String name;
private Double salary;
private Integer age;
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 getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
", salary=" + salary +
", age=" + age +
'}';
}
}
step4:定義接口類
【mapper.EmpMapper.java】
package mapper;
import entity.Employee;
/**
* 接口式編程,定義一系列方法,並根據方法映射到sql 的xml 文件中。
*/
public interface EmpMapper {
public Employee getEmp(Integer id);
}
step5:編寫sql語句的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.EmpMapper"> <!-- namespace 指命名空間,用於指明接口類的位置 id 指的是sql語句惟一表示,爲接口類中的方法 resultType 指的是sql的返回類型(使用全類名錶示) #{id} 表示接收參數,至關於佔位符,(可以使用 ${id},其將數據直接顯示在sql語句中) --> <select id="getEmp" resultType="entity.Employee"> select * from emp where id = #{id} </select> </mapper>
step6:使用SqlSession對象執行SQL操做。
【test.Demo.java】
package test;
import entity.Employee;
import mapper.EmpMapper;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class Demo {
@Test
public void test() throws IOException {
// step1:讀取配置文件
String resource = "config/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// step2:建立一個 SqlSessionFactory 的對象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// step3:獲取一個 SqlSession 的實例
SqlSession session = sqlSessionFactory.openSession();
try{
// 獲取接口類的對象(內部爲接口類自動建立代理對象)
EmpMapper empMapper = session.getMapper(EmpMapper.class);
// 經過方法調用sql
Employee employee = empMapper.getEmp(1);
System.out.println(employee);
}finally {
// step4:關閉 SqlSession 實例
session.close();
}
}
}
step7:測試截圖
用於 mybatis 的配置。
用於設置開發環境。每一個<environment>標籤能夠設置一個開發環境。使用 default能夠切換環境。
【environment內部的標籤】 transactionManager: 用於指定事務管理器。type="[JDBC|MANAGED]" dataSource:用於指定數據源。type="[UNPOOLED|POOLED|JNDI]" 【舉例:】 <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> <environment id="provided"> <transactionManager type="MANAGED"/> <dataSource type="UNPOOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments>
用於引入外部資源文件。好比 數據庫的配置信息 放在 (.properties) 文件中。能夠經過 <properties> 將 該文件引入。
【屬性:】
url:引入網絡路徑 或者 磁盤下的路徑 下的文件
resource: 引入當前項目類路徑下的文件
引入文件後,使用 ${} 來取出 文件的內容。
對上例接口式編程進行部分修改。
(1)增長一個 config/db.properties,用於保存數據庫鏈接信息。
(2)使用 <properties> 標籤引入 db.properties 文件, 並使用 ${} 來取出 文件的內容。
【db.properties】 jdbc.driver = com.mysql.cj.jdbc.Driver jdbc.url = jdbc:mysql://localhost:3306/lyh?useUnicode=true&characterEncoding=utf8 jdbc.username = root jdbc.password = 123456 【config/mybatis-config.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> <properties resource="config/db.properties"></properties> <environments default="environment"> <environment id="environment"> <transactionManager type="JDBC"/> <!-- MyBatis自帶鏈接池,只需配置數據庫鏈接的一些數據便可 此處以MySql爲例。 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!-- 加載SQL定義文件,須要修改 如有多個SQL定義文件,可使用<mapper />標籤追加。 文件路徑中存在.的話,使用/分割 --> <mappers> <mapper resource="config/EmpMapper.xml"/> </mappers> </configuration>
用於修改 mybatis 的默認設置。
【setting屬性:】
name:要修改的配置的名字
value:要修改的配置的值
(1)好比開啓 駝峯命名映射規則(mapUnderscoreToCamelCase)。
默認狀況下,數據庫裏的數據,沒法自動轉換駝峯命名,獲取不到值。
開啓駝峯命名映射規則後,能夠獲取到值。
<settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
用於支持不一樣的數據庫。
【在全局配置文件中,添加如下信息:】 name指的是不一樣的數據庫,value指的是別名。 <databaseIdProvider type="DB_VENDOR"> <property name="SQL Server" value="sqlserver"/> <property name="MySQL" value="mysql"/> <property name="Oracle" value="oracle" /> </databaseIdProvider> 【在sql的xml文件中,使用databaseId來區別數據庫】 <select id="getEmp" resultType="entity.Employee" databaseId="mysql"> select * from emp where id = #{id} </select> <select id="getEmp" resultType="entity.Employee" databaseId="oracle"> select * from emp where id = #{id} </select>
用於配置sql映射文件的讀取位置。
(1)使用 <mapper> 標籤來定義 sql 的xml文件。 【屬性:】 url:引入網絡路徑 或者 磁盤下的路徑 下的文件 resource: 引入當前項目類路徑下的文件 class: 用於引入接口類(使用時須要將 xml 與 接口類 放在同一個包下)。 (2)使用 <package> 標籤來 批量定義映射器。 <mappers> <package name="org.mybatis.builder"/> </mappers> org.mybatis.builder 包下全部接口皆被定義爲映射器, 若使用 sql的xml配置文件,則需將配置文件與 接口同名 且置於同一包下。 若使用 註解,則無需編寫 sql語句 的 xml 配置文件。
注:
使用class 屬性時,能夠在接口上使用 註解標記,並直接定義sql 語句(此時不須要sql的配置文件)。