博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyBatis核心组件(配图详解&代码实现)
阅读量:5742 次
发布时间:2019-06-18

本文共 3946 字,大约阅读时间需要 13 分钟。

MyBatis的核心组件分为4个部分 SqlSessionFactoryBuilder(构造器):根据xml或java代码生成SqlSessionFactory。 SqlSessionFactory(工厂接口):使用它生成Sqlsession,工厂模式下生成。 Sqlsession(会话):可以发送SQL执行返回结果和获取Mapping的接口。在大多数开发中,我们使用MyBatis提供的 SQL Mapping 接口编程技术,这提高了可读性和可维护性。 SQL Mapping(映射器):由一个java接口和XML文件(或者是@注解)构成,生成了对应SQL与映射的规则,发送SQL执行并返回结果。

SqlSessionFactory 如何使用MyBatis,首先就是xml或java代码生成SqlSessionFactory,MyBatis给我们提供了SqlSessionFactoryBuilder(构造器),org.apache.ibatis.session.Configuration这个类作为引导,使用的是Builder模式。

在MyBatis中有两种形式生成SqlSessionFactory,一种是XML,一种是java代码实现。这里小编推荐使用XML的形式,也是大多数企业开发的选择。配置XML或java代码后,MyBatis会读取配置文件,通过Configuration类对象构建MyBatis的上下文。

需要提醒大家的是SqlSessionFactory是一个接口,而它的实现类为SqlSessionManager和DefaultSqlSessionFactory两个类。

一般用DefaultSqlSessionFactory,DefaultSqlSessionFactory在多线程中,而它的具体实现依靠DefaultSqlSessionFactory。

使用XML构建SqlSessionFactory  主要分为两类:一类是基础配置文件,通常只有一个,主要配置最基础的上下文参数和运行环境:另一类为映射文件,主要配置映射关系、SQL、参数等。

基础配置文件:一般命名为mybatis-config.xml,放在工程类路径下,下面看一个实例:

复制代码

元素:定义一个别名,代表com.feiyu.POJO.User这个类,在上下文中科院代替全限定名使用。

元素:默认为开发者,里面的是配置事务管理器,采用JDBC管理器方式,使用                                               配置数据库,type="POOLED"为MyBatis内部提供的连接池方式。

元素:代表引入的那些映射器。

//mybatis的配置文件    String resource = "mybatis-config.xml";    //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)    InputStream inputStream = Test1.class.getClassLoader().getResourceAsStream(resource);    //构建sqlSession的工厂    SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);    //使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)    //Reader reader = Resources.getResourceAsReader(resource);    //构建sqlSession的工厂    //SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);    //创建能执行映射文件中sql的sqlSession    SqlSession session = sessionFactory.openSession();    /*     * 映射sql的标识字符串,     * com.feiyu.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,     * getUser是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL     */    String statement = "com.feiyu.mapping.userMapper.getUser";//映射sql的标识字符串    //执行查询返回一个唯一user对象的sql    User user = session.selectOne(statement, 1);    System.out.println(user);复制代码

读取mybatis-config.xml,然后通过SqlSessionFactoryBuilder的Builber方法创建SqlSessionFactory。

SqlSession 作用相当于一个JDBC中的Connection对象,代表一个连接资源的启用。有以下三个作用:

获取Mapping接口 发送SQL给数据库 控制数据库事务

SqlSession sqlSession = SqlSessionFactory.openSession();

下面我们来看看SqlSession在操作事务时的伪代码:

//定义SqlSession SqlSession sqlSession = null; try{ //打开SqlSession会话 sqlSession = SqlSessionFactory.openSession(); sqlSession.commit();//提交事务 }catch (Exception ex) { sqlSession.rollback();//回滚事务 }finally { //在finally语句中确保资源被顺利关闭 if (sqlSession != null) { sqlSession.close(); } }

使用commit方法提交事务,和使用rollback方法回滚事务。

注意:数据库的连接资源使用后要及时的关闭它,如果不及时关闭,数据库的连接资源就会很快被消耗光,整个系统将陷入瘫痪状态,所以这里使用finally语句使其顺利关闭。

映射器 在MyBatis中,映射器尤为的重要,也是最复杂的组件,它是由一个接口和对应的XML文件(或@注解)构成。

有以下4个作用:

描述映射规则 配置缓存 提供SQL语句,配置SQL参数类型,返回类型,缓存刷新等 提供动态SQL  本文只实现XML文件形式映射器方式,也是大多数开发的选择,下面首先定义一个POJO:


package com.feiyu.POJO; /**

  • @author gacl

  • users表所对应的实体类 */ public class User { //实体类的属性和表的字段名称一一对应 private int id; private String name; private int age;

    public int getId() { return id; } public void setId(int id) { = id; } public String getName() { return name; } public void setName(String name) { = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + "]"; } }

映射器接口

package com.feiyu.mapping;

import com.feiyu.POJO.User;

public interface UserMapper { public User getUser(int id); }

引入XML文件

select id, user_name as username, age from tb_user where id = #{id}

元素:其中的namespace对应的是一个接口的全限定名,这样MyBatis就可以根据上下文找到对应的接口

元素:表明这是一个查询的语句,id作为标识,parameterType="int"说明是传递给SQL是一个int型的参数, resultType="com.feiyu.POJO.User">表明返回的是一个user类型的返回值。 用Mapper接口发送SQL UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.getUser(1); 目前使用Mapper接口编程已成主流,在spring中更为常见 有需要Java资料的可以加我

转载于:https://juejin.im/post/5c21d544518825314b0bfe20

你可能感兴趣的文章
Hadoop jobhistory历史服务器
查看>>
IMG-后勤执行-仓库管理-主数据-定义存储类型标识符(WM-16)
查看>>
一个简单的bigfile tablespace无法扩展的案例处理
查看>>
datapump简介(一)
查看>>
AKM项目轶事之2015年‘528’股灾
查看>>
SAP Connected Logistics解决方案
查看>>
Lucene.Net 2.3.1开发介绍 —— 四、搜索(二)
查看>>
dbus 和 policykit 实例篇(python) ()转
查看>>
何止于安全,IBM Cloud Private一个有认知的“专属云空间”
查看>>
基于ZigBee的动车组装配生产线监测节点的设计
查看>>
终于找到嘴唇老是干裂的原因了,不是缺水,而是...
查看>>
梅西百货利用RFID成功促进全渠道订单履行战略
查看>>
移动医疗平台遭遇“挂号滑铁卢”
查看>>
TrendForce:光伏产业再度面临供需失衡
查看>>
漫威英雄后门?即使是白宫会议也可能被黑客窃听
查看>>
为企业用户分析PR策略,TrendKite获1630万美元融资
查看>>
GCC 也要开始飙版本号了 —— 5.0 ??
查看>>
避免成为优秀程序员
查看>>
《CCNP ROUTE 300-101认证考试指南》——2.9节规划练习
查看>>
《深入剖析Nginx》一1.3 源码目录结构
查看>>