mybatis学习总结-mybatis初体验
admin
2023-04-28 06:23:17
0

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

    
    
      
        select * from t_user
        
      
        select * from t_user where id = #{id}
        
      
        select * from t_user where name like '%'||#{name}||'%'
        
        	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

相关内容

热门资讯

烈焰熊熊,堪比“原子弹”,欧洲... 据美国有线电视新闻网(CNN)7月29日报道,席卷法国西南部的大片野火燃烧得如此猛烈,以至于形成了一...
外交部:对日本熊本县地震遇难者... 据凤凰卫视报道,针对日本熊本县发生强震造成人员伤亡,中国外交部发言人毛宁7月29日在例行记者会上表示...
高铁喧哗被劝阻后叫嚣全家体制内... “女子高铁喧哗被劝阻后叫嚣全家体制内”一事迎来官方通报。据新京报报道,7月29日,辽宁北票市公安局发...
广东专业蓝牙耳机定制厂家推荐,... 在珠三角腹地,广东早已成为全球蓝牙耳机产业链的“心脏地带”。从深圳华强北的声学元件批发,到东莞、惠州...
格雷厄姆葬礼变地缘竞价场!两大... 有些葬礼,送别的是逝者;有些葬礼,演的却是活人最现实的政治博弈。当地时间7月28日,美国老牌鹰派参议...
一道小学数学题难住3名医学博士... 3名不同学校的博士同做一道数学题,谁最厉害?近日,一陕西网友发布的视频引发热议。29日,视频发布者“...
华为全新“小艺任务”亮相:整合... 7月29日,在华为鸿蒙电脑新品技术沟通会上,终端云服务小艺业务部总裁贾永利宣布,小艺将迎来“从对话到...
广西日报特稿《王的猜想》火了,... 澎湃新闻记者 蒋子文 实习生 汤煜炜为应对外界购买纸质版特稿《王的猜想》的热情,《广西日报》宣布紧急...
月租20元内!2026年平价云... 不少手游玩家、账号运营从业者挑选云手机时,首要诉求就是低价够用,想要控制每月支出在20元以内,同时兼...
诺奖得主如何看待王虹境遇?“我... 中村修二(2014年诺贝尔物理学奖得主)【导读】近日王虹与邓煜双双获得2026年菲尔兹奖,成为了首批...