Mybatis怎么用看这里就够了

Mybatis的融合使用

通常在项目中使用Mybatis的时候我们只需要写一个Mapper接口以及复制一个对应的xml文件,这是一位其他的框架——SpringBoot已经帮我们做好了一些重复性的操作,以及伴随着Mybatis—Plus的诞生我们通过代码自动生成整个开发更是简单。但是如果不能了解Mybatis的原始操作那么对Mybatis这一技术的应用就也达不到轻车熟驾。今天就是想通过这篇文章从Mybatis的手动挡说到的他自动挡——SpringBoot+Mybatis,在说到L3级别的无人驾驶——MybatisPlus。有关Mybatis源码的解读可以参考下面这篇文章:

我终于到清楚了Mybatis的运行机制_码涤生的博客-CSDN博客

项目代码地址:https://gitee.com/Lml_7117/mybatisweb-templte1.git

一、Mybatis应用概述

在Mybatis之前有JDBC、Hibernate,他们的使用都存在不够便捷的问题。JDBC使用需要经过——注册驱动、获取Connection对象,构造Statement、处理Result、关闭数据源。Hibernate是在08/09年很火的一个框架,相对于JDBC他可以将结果集的映射关系配置为xml文件,同时将我们对数据库的操作封装为一个Session对象,我们对数据库资源、异常的管理只需要聚焦于这个Session对象即可。但是他对多表联联查支持不好,同时不支持动态SQL语句,并且在做更新操作的时候需要对表中所有字段进行更新操作。Hibernate不能够有效的支持存储过程,自身生成的HQL性能较差不能够进行优化。

相对于HibernateMybatis可以支持多表联查以及动态sql语句,换句话说就是他解决了Hibernate的痛点,所以他火了起来。Mybatis也支持注解方式的开发,这就位简单SQL的编写提供了极大的便利,面对复杂的产寻语句还是推荐使用Mybatis的xml配置文件的方式实现。后面出现了与Mybatis的升级版MybatisPlus,那Mybatis的开发速度就更是起飞了。Mybatis的所有操作也可以看做是通过一个SqlSession完成的,使用Mybatis对数据库的所用操作都是通过代理实现的,这样就可以使用Mybtis为我们提供的一系列能力,他是会为Dao层的接口生成一个代理对象。那么我们想要使用起来Mybatis就首先要获得一个Dao层接口的代理。

二、Mybatis的原生使用

Java的项目中仅仅是引入Mybatis而不适用其他的任何框架,第一步就是写一个Mybatis的配置文件,里面主要记录数据库的连接信息以及Mapper的xml文件配置信息):

这两个配置文件都是在项目的Resource目录下的,在项目大家的时候也应该注意resource的文件目录需要做一个正确的标记,否则在使用Mybatis读取的时候读取不到。如果要是放在了项目的src目录下应该是需要在pom文件上做相应的配置才可。

这里就不贴多余,到时候直接将项目的git地址放上去需要的可以直接拿下调试。在只有Mybatis使用的时候最好可以封装一个工具类,用来生产SQLSession对象,获取到了sqlSession对象就可以获取代理,之后就可以直接的调用Dao层接口中的方法。

其中工具类中会通过读取Mybatis的配置文件来构造一个SqlSessionFactory的对象,这个工厂对象有被用来构造SqlSession,通过向SqlSession对象的getMapper方法中传入Dao层接口的class对象,构造了一个Dao层接口的代理对象。通过这个代理对象就可以进行我们数据库的操作。由于Mybatis的配置文件中包含了接口对应xml的信息,xml中又有sql语句所以我们定义的dao层接口实际上已经与sql语句对应上了,如果想要理解他们是如何对应上的可以去看在文章开头推荐的那篇关于Mybatis源码讲解的文章。

在使用纯Mybatis框架的时候其中牵扯到了几个关键的对象,有关这几个对象应该的声明周期以及作用范围应该重点记忆:

SqlSessionFactoryBuilder

这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。

SqlSessionFactory

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。 下面的示例就是一个确保 SqlSession 关闭的标准模式:

try (SqlSession session = sqlSessionFactory.openSession()) {
 // 你的应用逻辑代码
}

在所有代码中都遵循这种使用模式,可以保证所有数据库资源都能被正确地关闭。

映射器实例

映射器是一些绑定映射语句的接口。映射器接口的实例是从 SqlSession 中获得的。虽然从技术层面上来讲,**任何映射器实例的最大作用域与请求它们的 SqlSession 相同。**但方法作用域才是映射器实例的最合适的作用域。 也就是说,映射器实例应该在调用它们的方法中被获取,使用完毕之后即可丢弃。 映射器实例并不需要被显式地关闭。尽管在整个请求作用域保留映射器实例不会有什么问题,但是你很快会发现,在这个作用域上管理太多像 SqlSession 的资源会让你忙不过来。 因此,最好将映射器放在方法作用域内。就像下面的例子一样:

try (SqlSession session = sqlSessionFactory.openSession()) {
 BlogMapper mapper = session.getMapper(BlogMapper.class);
 // 你的应用逻辑代码
}

三、SpringBoot整合Mybatis

SpringBoot整合Mybatis,可以是得我们对Mybatis的使用更加便捷,前面我们有讲到Mybatis使用的时候需要注册获得一个Dao层接口的代理对象,整合之后可以省去这些步骤.这个简化的过程就是SpringBoot通过他的机制去读取并且加载Mybatis的相关配置:

  • 直接将Mybatis的配置写到项目的application配置文件中
  • 将Mybatis的配置路径书写到application配置文件中,使得Mybatis的配置文件也可以被项目成功加载到
mybatis-plus:
  config-location: classpath:sql\mybatis\config\boot\mybatis-config.xml

除过与Mybatis的直接配置文件还有一个就是与数据库具体操作有关的xml文件,xml配置文件的方式也是有两种的一个还是将相应的xml配置再Mybatis配置文件的标签中,另一种就是直接在application的配置文件或在那个指定mapper的一个路径:

mybatis-plus:
  mapper-locations: classpath:sql\mybatis\mapper\boot1\*.xml

通过上面我们成功的将Mybatis的相关的配置文件以及有关Mapper的xml文件都指定到项目中了,现在还少的一个操作就是如何为Dao层的接口获取代理:

  • 在项目中用两种方式一种是通过在启动类的地方指定我们需要扫描Dao层
  • 为对应的Dao层接口直接添加相关注解——@Mapper
@SpringBootApplication(scanBasePackages = "com.mybatis")
@MapperScan(basePackages = "com.mybatis.mybatisweb.boot.mapper")
public class MybatiswebApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatiswebApplication.class, args);

    }
}
//或者
@Mapper
public interface UserBootMapper extends BaseMapper<User> {
    User getUserById(Long id);
}

通过上面的描述我们主要是阐述了继承SpringBoot之后为我们省去的工作以及在Mybati中几个关键的配置,有关Mybatis的简单的sql语句产寻就不再这里做详细介绍,这里主要是介绍关联产寻的用法。如果要是一对一关联的话使用的主要标签是——如果是一对多关联则使用的是。结合原来文章中讲到的关于Mybatis的源码实际上这里Mybatis并不是说直接的对两条SQL语句进行了组装联查,而是在第一条产寻结果出来之后再进行结果集映射处理的时候有查询了第二条。有了这个认识的基础也就也能理解关于关联产寻中的使用:

<select id="getUserContactById" parameterType="long" resultMap="userReuslt">
    select
    <include refid="allColumn"/>
    from
    tb_user
    where
    id = #{id}
</select>

    <resultMap id="userReuslt" type="com.mybatis.mybatisweb.boot.domain.User">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <collection property="userContacts" column="id"
                    select="com.mybatis.mybatisweb.boot.mapper.UserContactMapper.getUserContactByUserId" />
    </resultMap>

Mybatis的基础使用也就没有什么问题,具体有关更多的配置以及动态语句还是建议直接看Mybatis的官网,上面确实很全。经过这次文章的记录发现对Mybatis源码有了一定的了解之后对Mybatis错误的排查快多了。

四、Mybatis-Plus取缔Mybatis

Mybatis—Plus取代Mybatis主要解决掉的是Mybatis对简单语句的处理能力,这里个人理解的简单语句主要是指对单表的操作。在使用Mybatis的过程中以前最大的一个困惑点就是使用了Plus之后应该如何再配合xml文件来处理复杂的sql语句。这实际上有点杞人忧天,Plus开篇提出的就是对Mybatis的入侵如加强。所以使用使用Mybatis-Plus的时候正常使用Mybatis即可。下面提出一些自己结合项目经验对MybatisPlus整合使用的建议:

  • MybatisPlus只用来做简单的单表查询
  • 在项目的Service层中直接继承Mybatis中体统的IService,使得Service中就直接拥有Dao层的能力
  • 如果有复杂Sql需要实现则在定义的Mapper接口中进行定义,并在Xml文件中写sql语句

在SpringBoot的整合中讲解了框架如何帮我们简化了若干配置,Mybatis-Plus如果整合在SpringBoot项目中则他为我们提供的主要能力是生成简单的Sql语句,能够生成SQL语句的前提就是他知道表的结构是怎么样的,所以不管是IService、还是BaseMapper他都是泛型,通过泛型指定Domain,Domain中有制定了这个实体对应的是数据库中的那个表,以及也能够指明返回结构集的接受结构是什么。通过条件构造器来构造sql语句的复杂条件,但是如果是很复杂的还是建议使用xml的形式。下面的代码是条件构造器,他利用了函数式编程的思想:

@GetMapping("/plus/test")
@ResponseBody
public String testPlus() {
    QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
    userQueryWrapper.eq("name","张天");
    List<User> users = userService.getUserByCons(userQueryWrapper);
    System.out.println(users.toString());
    return users.toString();
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值