從開始工作到現在,用到的ORM框架都是Hibernate,聽說過ibatis,但是一直為看過具體的用法。
前段時間面試的時候,發現好幾個公司都問會不會ibatis,所以最近幾天對其進行了一下學習,然后在我的博客里總結一下
這篇總結是對ibatis的入門,說明一些ibatis的基本應用,還有平時我們可以用ibatis來干什么。
iBATIS一詞來源于“internet”和“abatis”的組合,是一個由Clinton Begin在2002年發起的開放源代碼項目。于2010年6月16號被谷歌托管,改名為MyBatis。是一個基于SQL映射支持Java和·NET的持久層框架。
以上內容來源于百度百科。因為ibatis已經改名為mybatis,后面我就統一叫mybatis
和hibernate一樣,mybatis是一個ORM框架,對我們的數據庫操作進行了封裝,提高了開發效率。
通過學習我了解到:mybatis只是一個半自動化的ORM實現,需要我們自己寫sql,而不像hibernate那樣,直接定義好實體與數據表的映射就行。
下面我們來通過示例,進行mybatis的初體驗
跟其他開源框架一樣,我們需要下載對應的jar包后才能使用
1)打開我的eclipse,創建一個java web項目。我這里取名叫mybatis
2)解壓下載好的mybatis-3.2.7.zip,找到里面的mybatis-3.2.7.jar,加入build path中
3)可能還需要的jar包,在lib目錄下:asm-3.3.1.jar、cglib-2.2.2.jar,一并加到build path中,如果過程中還需要其他jar包,再另行加入
4)因為mybatis是ORM框架,所以少不了數據庫,我這里用的是Oracle 10g,添加oracle驅動到build path
還是因為要用mybatis,我準備了幾張表,表里插入數據
create table t_user (id number(10) primary key,name varchar2(100),org_id number(10));insert into t_user (id,name,org_id) values (1,'張三',1);insert into t_user (id,name,org_id) values (2,'李四',1);insert into t_user (id,name,org_id) values (3,'王五',2);insert into t_user (id,name,org_id) values (4,'趙六',2);insert into t_user (id,name,org_id) values (5,'錢七',3);create table t_role (id number(10) primary key,name varchar2(100));insert into t_role (id,name) values (1,'總裁');insert into t_role (id,name) values (2,'副總裁');insert into t_role (id,name) values (3,'總經理');insert into t_role (id,name) values (4,'項目經理');create table t_user_role(user_id number(10),role_id number(10));insert into t_user_role(user_id,role_id) values(1,1);insert into t_user_role(user_id,role_id) values(2,2);insert into t_user_role(user_id,role_id) values(3,3);insert into t_user_role(user_id,role_id) values(4,4);insert into t_user_role(user_id,role_id) values(5,4);create table t_org(id number(10) primary key,name varchar2(100));insert into t_org(id,name) values(1,'無線處');insert into t_org(id,name) values(2,'有線處');insert into t_org(id,name) values(3,'通用處');
下面來完成一個mybatis最簡單的實例
hibernate有一個核心配置叫hibernate.cfg.xml,而mybatis的核心配置名稱我這里取名叫mybatis-config.xml
來完成一個最基本的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="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" /> <property name="username" value="ibatis" /> <property name="password" value="ibatis" /> </dataSource> </environment> </environments> <!-- mapping 文件路徑配置 --> <mappers> <mapper resource="com/yu/res/UserMapper.xml" /> </mappers> </configuration>
environments元素下配置了事務的管理、連接池的設定,
mappers元素下,配置了我們的映射文件路徑。
從核心配置中我們看到需要配置一個映射文件,在配置映射文件之前,根據我們建的表,來創建對應的pojo模型
User.java
package com.yu.model;public class User {
private Long id;
private String name;
private Org org;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Org getOrg() {
return org;
}
public void setOrg(Org org) {
this.org = org;
}
}Org.java
package com.yu.model;import java.util.ArrayList;import java.util.List;public class Org {
private Long id;
private String name;
private List<User> users = new ArrayList<User>();
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}Role.java
package com.yu.model;public class Role {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}}配置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="UserMapper">
<select id="queryUser" resultType="com.yu.model.User">
select * from t_user
</select>
<select id="findUserById" resultType="com.yu.model.User" parameterType="long">
select * from t_user where id = #{id}
</select>
<select id="findUserByName" resultType="com.yu.model.User" parameterType="java.lang.String">
select * from t_user where name like '%'||#{name}||'%'
</select>
<insert id="addUser"> insert into t_user(id,name) values(#{id},#{name})
</insert>
<update id="updateUser" parameterType="com.yu.model.User"> update t_user set name = #{name} where id = ${id}
</update>
<delete id="deleteUser" parameterType="java.lang.Long"> delete t_user where id = #{id}
</delete></mapper>從配置中可以看到,我們配置了常用的增、刪、改、查、條件查、模糊查等操作。
將主要的配置配好以后,我們就來看看,怎么用我們的java程序來對mybatis進行操作。
首先回顧一下hibernate中操作數據庫的流程:
1)讀取配置
2)獲取SessionFactory(重量級,只有一個)
3)獲取session
4)開啟事務
5)進行CRUD操作
6)提交事務
7)關閉session
在我們的mybatis中,也有類似的步驟:
1)獲取SqlSessionFactory
2)獲取SqlSession
3)進行CURD操作
4)提交事務
5)關閉SqlSession
每 一 個 MyBatis 的 應 用 程 序 都 以 一 個 SqlSessionFactory 對 象 的 實 例 為 核 心 。 SqlSessionFactory 對 象 的 實 例 可 以 通 過 SqlSessionFactoryBuilder 對 象 來 獲 得 。 SqlSessionFactoryBuilder 對象可以從 XML 配置文件,或從 Configuration 類的習慣準備的實 例中構建 SqlSessionFactory 對象。
引用自官方文檔的一句話。說明獲取SqlSessionFactory有兩種方式,第一種為通過我們的核心配置XML,第二種為通過Configuration類
通過核心配置XML方式
Reader reader = Resources.getResourceAsReader("ibatis-config.xml");SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);通過Configuration方式(其實就是將XML配置轉化為對應的對象)
DataSource dataSource = ...TransactionFactory transactionFactory = new JdbcTransactionFactory();Environment environment = new Environment("development", transactionFactory, dataSource);Configuration configuration = new Configuration(environment);configuration.addMapper(BlogMapper.class);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);SqlSession sqlSession = factory.openSession();
因為我們的系統里只以一個SqlSessionFactory對象為核心,所以可以通過一個工具類來獲取SqlSessionFactory、SqlSession。方便程序操作。
package com.yu.util;import java.io.IOException;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;/**
* mybatis工具類
* @author yu
*
*/public class SqlSessionFactoryUtil {
private static String XML_PATH = "mybatis-config.xml";
private static SqlSessionFactory factory;
static{
Reader r = null;
try {
r = Resources.getResourceAsReader(XML_PATH);
factory = new SqlSessionFactoryBuilder().build(r);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 獲取應用中的SqlSessionFactory
* @return SqlSessionFactory
*/
public static SqlSessionFactory getSqlSessionFactory(){
return factory;
}
/**
* 獲取應用中的SqlSession
* @return SqlSession
*/
public static SqlSession getSqlSession(){
return factory.openSession();
}
/**
* 關閉SqlSession
* @param session
*/
public static void closeSqlSession(SqlSession session){
if(session != null){
session.close();
}
}}前面一大堆鋪墊,現在終于可以運行了,我寫了個測試類,用JUnit的方式,來對mybatis的CRUD操作進行測試。
package com.yu.test;import java.util.List;import org.apache.ibatis.session.SqlSession;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.yu.model.User;import com.yu.util.SqlSessionFactoryUtil;public class MyTest {
public SqlSession session;
@Before
public void getSqlSession(){
session = SqlSessionFactoryUtil.getSqlSession();
}
@After
public void closeSqlSession(){
SqlSessionFactoryUtil.closeSqlSession(session);
}
@Test
public void queryUser(){
List<User> users = session.selectList("UserMapper.queryUser");
for(User u : users){
System.out.println(u.getId()+" "+u.getName());
}
}
@Test
public void findUserById(){
Long id = 1L;
User user = session.selectOne("UserMapper.findUserById",id);
if(user!=null){
System.out.println(user.getId()+" "+user.getName());
}
}
@Test
public void findUserByName(){
String name = "an";
List<User> users = session.selectList("UserMapper.findUserByName",name);
for(User u : users){
System.out.println(u.getId()+" "+u.getName());
}
}
@Test
public void addUser(){
User user = new User();
user.setId(10L);
user.setName("王麻子");
session.insert("UserMapper.addUser", user);
session.commit();
}
@Test
public void updateUser(){
User user = new User();
user.setId(10L);
user.setName("王麻子111");
session.insert("UserMapper.updateUser", user);
session.commit();
}
@Test
public void deleteUser(){
Long id = 10L;
session.delete("UserMapper.deleteUser",id);
session.commit();
}}執行完以后,可以通過查看數據庫的方式來驗證數據是否正確。
上述示例,從核心配置文件,到映射文件,到獲取SqlSessionFactory,到獲取SqlSession,到java API操作,再到測試驗證,完成了對Mybatis的基本操作。
當然這只是最基本的用法。
比如這里的核心配置可已配置返回類型的簡稱
比如這里的映射文件中resultType的設置
比如這里的java操作,還可以改為通過Mapper接口的操作
比如這里的映射配置,還可以改為在Mapper接口中通過注解的方式實現
再比如mybatis的動態sql、類型轉換、攔截器等等
源碼來源:×××/technology
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。