mybatis学习总结-mybatis初体验

转自
原文地址:mybatis学习总结-mybatis初体验, 感谢原作者分享。

从开始工作到现在,用到的ORM框架都是Hibernate,听说过ibatis,但是一直为看过具体的用法。
前段时间面试的时候,发现好几个公司都问会不会ibatis,所以最近几天对其进行了一下学习,然后在我的博客里总结一下
这篇总结是对ibatis的入门,说明一些ibatis的基本应用,还有平时我们可以用ibatis来干什么。

iBATIS一词来源于“internet”和“abatis”的组合,是一个由ClintonBegin在2002年发起的开放源代码项目。于2010年6月16号被谷歌托管,改名为MyBatis。是一个基于SQL映射支持Java和·NET的持久层框架。

以上内容来源于百度百科。因为ibatis已经改名为mybatis,后面我就统一叫mybatis和hibernate一样,mybatis是一个ORM框架,对我们的数据库操作进行了封装,提高了开发效率。
通过学习我了解到:mybatis只是一个半自动化的ORM实现,需要我们自己写sql,而不像hibernate那样,直接定义好实体与数据表的映射就行。
下面我们来通过示例,进行mybatis的初体验

1.获取mybatis

跟其他开源框架一样,我们需要下载对应的jar包后才能使用
进入下面的地址:

http://blog.mybatis.org/

或者下面的地址:

https://github.com/mybatis/mybatis-3

其实第一个地址,也是为了点击链接跳转的第二个地址(github)下载。
我下载的是mybatis3.2.7版本。
下载下来是一个zip包,解压后里面有相关的jar包,还有一个英文的pdf说明文档
如果看英文比较吃力的话,可以找到中文版本的,地址如下:

http://mybatis.github.io/mybatis-3/zh/index.html

2.准备工作

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

3.准备数据

还是因为要用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,'通用处');

4.mybatis最简单实例

下面来完成一个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>

从配置中可以看到,我们配置了常用的增、删、改、查、条件查、模糊查等操作。

5.让mybatis运行起来

将主要的配置配好以后,我们就来看看,怎么用我们的java程序来对mybatis进行操作。
首先回顾一下hibernate中操作数据库的流程:
1. 读取配置
2. 获取SessionFactory(重量级,只有一个)
3. 获取session
4. 开启事务
5. 进行CRUD操作
6. 提交事务
7. 关闭session

在我们的mybatis中,也有类似的步骤:
1. 获取SqlSessionFactory
2. 获取SqlSession
3. 进行CURD操作
4. 提交事务
5. 关闭SqlSession.

首先我们来看怎么获取SqlSessionFactory

每一个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 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();
    }
}

执行完以后,可以通过查看数据库的方式来验证数据是否正确。

6.其他问题

上述示例,从核心配置文件,到映射文件,到获取SqlSessionFactory,到获取SqlSession,到java API操作,再到测试验证,完成了对Mybatis的基本操作。
当然这只是最基本的用法。
比如这里的核心配置可已配置返回类型的简称
比如这里的映射文件中resultType的设置
比如这里的java操作,还可以改为通过Mapper接口的操作
比如这里的映射配置,还可以改为在Mapper接口中通过注解的方式实现
再比如mybatis的动态sql、类型转换、拦截器等等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值