java技术分享_小何技术分享,java框架之mybatis (一)

49e0b697625b49bd1f30fb1bd375d4a8.png

Mybatis简介

MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

目前MyBatis仍然是国内最流行的轻量级的持久层框架之一。所谓轻量级,是代表代码简洁,几乎没有任何第三方依赖,对项目代码入侵小,功能强大。它只需要简单的配置,就可以无缝的与spring框架整合到一起,如果使用spring boot整合,那几乎就是拿来即用。

Mybatis架构

对于任何一个持久层框架,都应该具备接口服务,数据处理服务,基础服务等相关功能,MyBatis也不例外,它会具体如下几个层结构

3c70f1b1c05e5cb3ba472ca37435908d.png

1、接口层主要负责对外提供应用服务,程序中我们直接使用mybatis接口实现对数据库中数据的CRUD操作

2、数据处理层主要负责处理数据访问问题:

  • SQL参数映射(Dao方法参数与映射文件中#{}表达式映射)
  • SQL解析(语法,语义)例如: select * from project where id=#{id}
  • SQL执行(将sql发送到数据库端执行)
  • SQL结果映射(例如将ResultSet中的数据存到map或者pojo对象)

3、基础服务层主要负责提供如下几个方面的服务:

  • 连接管理(配置连接池,例如POOPED)
  • 事务管理(保证数据的原子性,一致性,隔离性,持久性)
  • 缓存处理(分为一级缓存和二级缓存,为了更好的提高查询性能)
  • 配置加载(别名配置,映射配置,日志配置....)

Mybatis核心Api及调用过程

1、SqlSessionFactoryBuilder

负责读取配置文件mybatis-config.xml,创建SqlSessionFactory对象

2、SqlSessionFactory接口

负责创建SqlSession对象,一般一个项目只有一个SqlSessionFactory,默认的情况下实现类是DefaultSqlSessionFactory,它的内部成员变量只有一个Configuration对象,所以是线程安全的。

3、SqlSession接口

负责连接的维护,事务的处理,类似JDBC中的Connection,此对象不能共享,线程不安全,有并发的情况,不能作为成员变量使用。SqlSession对象中封装了CRUD所需要的基本方法和面向接口编程的getMapper()方法。它内部还包含了Executor用来执行Sql

4、Executor接口

有四个实现类:SimpleExecutor,BatchExectuor,ReuseExecutor,CachingExecutor

5、StatementHandler

PreparedStatementHandler,StatementHandler

6、TypeHandler

7、ResultHandler

43d300005e51b50fcdfa83e093637a86.png

MyBatis添加配置及映射文件

在spring框架整合mybatis时需要的核心配置文件,springboot整合时不需要为mybatis做特殊配置。

step01:在src/main/resources目录下创建配置文件mybatis-configs.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>

每个映射文件都有一个唯一的namespace,它可以定位Sql的位置:namespace值 + id值。在使用接口编程时,其做用发生改变:要与接口的的"包名.类名"保持一致,来确定匹配哪个接口来映射。

step02:在src/main/resources/mapper目录下创建映射文件MemberMapper.xml

<?xml version="1.0" encoding="UTF-8"?> insert into t_members(nickname,password,realname,gender,rank,email,mobile,safequestion,safeanswer,createdTime) values  (#{nickname},#{password},#{realname},#{gender},#{rank},#{email},#{mobile},#{safequestion},#{safeanswer},#{createdTime})

step03:将映射文件添加到核心配置文件中进行配置(使用相对路径,不能在最前面加"/" --绝对路径)

Mybatis接口映射操作

4a98680c99f7b7c8c5abd002afdf19cd.png

1. 接口定义

import java.util.List;import org.apache.ibatis.annotations.Param; public interface MemberDao {List findPageObjects(); int insertObject(Member entity); int updatePassword(Object[] params); int deleteObject(@Param("id") Integer id);}

2. 参数说明

  • 传递实体值对象

然后在mapper中表达式#{email}来取值,此表达式调用值对象的get方法。当接口中值对象参数用@Param修饰时,必须用#{entity.email}来取值。

  • 传递数组对象

利用用数组下标来取值#{array[0]}

  • 直接传递基本值对象

可以用参数名来取值。当多个参数时,就必须加@Param修饰,可以为参数起别名。

MyBatis动态排序

1. ${ }表达式主要用于获取配置文件数据,接口中的参数信息,当${ }出现在映射文件的Sql语句中时创建的不是预编译的Sql,而是字符串的拼接,有可能会导致Sql注入问题。所以一般使用${ }接收Sql参数时,这些参数一般是字段名、表名等,例如 order by {column},当用${ }获取接口参数信息时,参数必须使用@param注解进行修饰或者使用下标或者参数#{param1}形式。

2. #{ }表达式主要用户获取接口中的参数数据,在映射文件的Sql语句中出现#{ }表达式,底层会创建预编译的Sql,性能会相对较好。

接口中方法定义:

List findObjects(@Param("column") String column, @Param("seq") String seq); 

映射文件中的实现:

 select * from t_members order by ${column} ${seq}

MyBatis的id应用策略

当对象对应的表中的记录为自增长时,可以采用如下方案:

 insert into tms_members(nickname,password,realname,gender,rank,email,mobile,safequestion,safeanswer,createdTime)values(#{nickname},#{password},#{realname},#{gender},#{rank},#{email},#{mobile},#{safequestion},#{safeanswer},#{createdTime}) 

其中:useGeneratedKeys必须为true,keyProperty属性用于指定参数中的id属性注意:接口返回值仍然是影响的条数,要从pojo中get到keyProperty

当多线程并发的向表中写入数据时,假如id使用自增长可能存在线程安问题。

可将自增长的id设置为随机数,当然有些数据库根本就不支持自增长,此时也可以选择随机数。借助mybatis 应用向表中写入数据,主键值要求通过UUID生成.其映射文件参考

 select replace(uuid(),'-','')  insert into t_orders (id,state,price,projectId,createdTime) values (#{id},#{state},#{price},#{projectId},now())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值