从开始工作到现在,用到的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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。