千家信息网

mybatis学习总结-mybatis初体验

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,从开始工作到现在,用到的ORM框架都是Hibernate,听说过ibatis,但是一直为看过具体的用法。前段时间面试的时候,发现好几个公司都问会不会ibatis,所以最近几天对其进行了一下学习,然后在
千家信息网最后更新 2026年11月01日mybatis学习总结-mybatis初体验

从开始工作到现在,用到的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的初体验


1.获取mybatis

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

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的配置:

                                                                                                                                                                                                

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 users = new ArrayList();        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 getUsers() {                return users;        }        public void setUsers(List 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

                                                insert into t_user(id,name) values(#{id},#{name})                      update t_user set name = #{name} where id = ${id}                 delete t_user where id = #{id}    

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


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 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 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、类型转换、拦截器等等

源码来源:×××/technology

配置 数据 核心 文件 方式 框架 事务 对象 数据库 准备 测试 工具 来源 项目 应用 学习 元素 只是 可以通过 实例 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 有格互联网科技 湖南永感互联网科技有限公司 互联网科技工作委员会副主任毛军 互联网科技公司华为 腾讯阿里互联网科技 北京互联网科技 电子科技大学互联网 北京禾田雨橡互联网科技 移动互联网年度科技创新 米聚互联网科技南京有限公司排面 保险科技服务互联网营销体系 互联网公司高科技产品 深圳互联网科技的发展 互联网相关科技技术 信承诺互联网科技有限公司 抖集互联网科技技术咨询 陕西九四连强互联网科技有限公司 银川新华互联网科技学校是国营吗 兰石爱特工业互联网科技分公司 杭州科技互联网公司有哪些 成都互联网科技公司 凡科互联网科技 互联网公司会议桌创意科技软装饰 贵州叶脉互联网科技有限公司所属行业 苏州五指互联网络科技有限 互联网科技公司有风险吗 互联网科技大赛获奖感言 启辰互联网科技 保山互联网科技靠谱吗 广西泛欧互联网科技有限公司
0