Mybatis基础

2 篇文章 0 订阅
2 篇文章 0 订阅

首先声明。该Mybatis系列的博客是我学习性博客,整个系列的博客是需要连贯起来看的。总结也是片段性总结的。如果觉得有些思维跳跃,或不连贯请参考代码。

本项目所有代码及文档都托管在 Github地址:https://github.com/JYG0723/mybatispractice

如果觉得不错的话,欢迎给个 star , 如果你想完善这个项目的话,你也可以 fork 后修改然后推送给我。


什么是 MyBatis ?

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。


Mybatis 与 Hibernate 不同

Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。

Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。

Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。

总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。


Sqlsession 的使用范围

SqlSession 中封装了对数据库的操作,如:查询、插入、更新、删除等。

通过 SqlSessionFactory 创建 SqlSession,而 SqlSessionFactory 是通过 SqlSessionFactoryBuilder 进行创建。

1、SqlSessionFactoryBuilder

SqlSessionFactoryBuilder 用于创建 SqlSessionFacoty,SqlSessionFacoty 一旦创建完成就不需要SqlSessionFactoryBuilder 了,因为 SqlSession 是通过 SqlSessionFactory 生产,所以可以将SqlSessionFactoryBuilder 当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。

2、SqlSessionFactory

SqlSessionFactory 是一个接口,接口中定义了 openSession 的不同重载方法,SqlSessionFactory 的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理 SqlSessionFactory。

3、SqlSession

SqlSession 是一个面向用户的接口, sqlSession 中定义了数据库操作,默认使用 DefaultSqlSession 实现类。此对象中对操作数据库实质上用的是 Executor

结论:

每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围(定义局部变量使用)。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。

打开一个SqlSession;使用完毕就要关闭它。通常把这个关闭操作放到 finally 块中以确保每次都能执行关闭


Settings(全局配置参数)

Mybatis 框架在运行时可以调整一些运行参数

比如:开启二级缓存、开启延迟加载。。。

typeHandlers(类型处理器)

mybatis中通过typeHandlers完成jdbc类型和java类型的转换。

通常情况下,mybatis提供的类型处理器满足日常需要,不需要自定义.

mappers(映射器)

使用相对于类路径的资源
使用完全限定路径。


 使用 mapper 接口类路径
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。


册指定包下的所有mapper接口
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。

Sql语句传入多参

输入映射
通过 parameterType 指定输入参数的类型,类型可以是简单类型hashmappojo的包装类型

这段代码可以很明显看出来什么时候选择字符串拼接,什么时候选择预编译后输出

SELECT * FROM USER WHERE username LIKE '%${user.username}%' AND password = #{user.password}

resultType

使用 resultType 进行输出映射,只有查询出来的列名和 pojo 中的属性名一致,该列才可以映射成功。
如果查询出来的列名和 pojo 中的属性名全部不一致,没有创建 pojo 对象。
只要查询出来的列名和 pojo 中的属性有一个一致,就会创建 pojo 对象。

输出pojo对象和pojo列表

不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xml中resultType指定的类型是一样的。

在mapper.java指定的方法返回值类型不一样:

1、输出单个pojo对象,方法返回值是单个对象类型

//根据id查询用户信息
    public User findUserById(int id) throws Exception;

2、输出pojo对象list,方法返回值是List

//根据用户名查询用户信息
    public List<User> findUserByUsername(String userName) throws  Exception;

resultMap

resultType 可以指定 pojo 将查询结果映射为 pojo,但需要 pojo 的属性名和 sql 查询的列名一致方可映射成功。

如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。

resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

使用方法

1、定义 resultMap

2、使用 resultMap 作为 statement 的输出映射类型

将下面的 sql 使用 User 完成映射

select id id_, username username_ from user where id = #{value}

parameterType传输单个简单类型值,${}括号中只能是value。
                 #{}括号中可以写任何

User 类中属性名和上边查询的列名不一致。

所以需要:定义 resultMap

<!--定义 resultMap
    将select id id_, username username_ from user where id = #{value} 和User类中的属性做一个映射关系
    type: resultMap最终映射的java对象类型
    id:对resultMap的唯一标识
    -->
    <resultMap id="userResultMap" type="user">
        <!--id表示查询结果中的唯一标识
        column:查询出来的列名
        property:type指定pojo的属性名
        最终resultMap对column和property做一个映射关系(对应关系)
        -->
        <id column="id_" property="id"/>

        <!--result: 对普通结果映射定义
        column:查询出来的列名
        property:type指定pojo的属性名
        最终resultMap对column和property做一个映射关系(对应关系)
        -->
        <result column="username_" property="username"/>
    </resultMap>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值