Mybatis知识点复习(第一次)

这一个技术点,更多的是实践,毕竟SQL这个东西,特别是动态SQL、多表查询哪里,其实不难,但是我们写的少了,就看起来很难。配置方面的东西都是死的,我们只需要记住概念,当然有时间的小伙伴可以去多探究一下他的底层原理。这对于我们理解这个技术还是很有帮助的!!!




1、概述

mybatis是用来连接后台业务代码与数据库数据的,在学习mybatis之前,我们一定是接触过JDBC,而mybatis起到的作用,就和它差不多。与Mybtis齐名的还有一个叫做Hibernate。国外使用Hibernate的居多,但是国内,基本的都转战Mybatis。

我曾经的一个学习误区:

我们之前学习的SSH,后来转而学习SSM,Struct变成了SpringMVC,Hibernate变成了Mybatis。我以为Hibernate被嫌弃的程度与Struct一样,其实不是,前者基本上是没有怎么使用了,但是Hibernate有的地方是还在使用的,特别是国外。只不过由于国人更加喜欢Mybatis的可定制化、灵活性,所以很多人都在使用。

不过不管怎么说,他们都是为了替代JDBC而生的!!!




2、编写CRUD的测试程序

1、新建数据库

2、创建一个maven项目

3、导入对应的依赖

4、编写mybatis-config.xml信息

5、编写我们的实体类以及查询接口类(包含简单的CRUD)

6、编写我们的对应的接口的mapper文件

7、为了方便我们可以编写一个Mybatis的工具类,用来返回sqlSession

8、编写我们的测试类

9、执行程序

我们在查询的时候,可以使用模糊查询

1、使用java代码实现

<select id="getUserListLike" resultType="pers.mobian.pojo.User">
	select * from mybatis.user where name like #{value}
</select>


List<User> userList = userDao.getUserListLike("%王%")

2、使用sql语句实现

<select id="getUserListLike" resultType="pers.mobian.pojo.User">
	select * from mybatis.user where name like "%"#{value}"%"
</select>
    
List<User> userList = userDao.getUserListLike("1");    




3、配置解析

3.1、核心配置文件

mybatis-config.xml:所有能配置的东西

configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)

3.2、环境配置

位于配置文件中的==environment ==中

在这个环境里面需要配置事务管理器数据源属性

事务管理器:如果我们后期使用的是Spring+Mybatis,可以不用配置事务管理器。因为Springle的AOP可以帮我们横切一个事务,用于处理事务的回滚以及提交

数据源:可以理解为数据的形式,不同的数据源,对于数据的管理方式不一样,继而得到的访问效率的侧重点也就不一样。

属性:我们正常的开发中为了解耦,总是对数据库的配置信息进行单独的编写db.properties。然后再在环境里面进行一个引用就可以了。


3.3、别名

由于我们在编写接口类的对应mapper文件中,我们每次设置返回类型,以及绑定类型的时候,对于实体类,我们都需要使用全类名,那么对于除类名一外的部分就十分的累赘,所以别名就出现了。当然别名还可以使用于单独取名字,不过更多的是使用于前者。

配置别名的方式有两种

<typeAliases>
  <typeAlias alias="user" type="pers.mobian.pojo.User"></typeAlias>
</typeAliases>
<typeAliases>
    <package name="pers.mobian.pojo" ></package>
</typeAliases>

前者我们可以单独的自定义我们想要的名字,后者绑定对应的包名,名字默认使用类名的小写形式。


3.4、设置

位于settings中,我们后文还会再次学习缓存及日志

设置主要是配置缓存懒加载驼峰命名转换以及日志

<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <setting name="localCacheScope" value="SESSION"/>
</settings>

3.5、引入对应的mapper资源

1、使用类路径的资源进行引用(常用)

<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

2、使用完全限定资源定位符(URL)

<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>

3、使用映射器接口实现类的完全限定类名

<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>

4、将包内的映射器接口实现全部注册为映射器

<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

后两种对应由于需要对于文件的位置及名字有要求,第二种使用不方便。所以更简易使用第一种方式。


3.6、生命周期

生命周期和作用域是至关重要的,因为错误的使用会导致非常严重的并发问题

SqlSessionFactoryBuilder:

  • 一旦创建了SqlSessionFactory,就不再需要它的
  • 建议创建为局部变量

SqlSessionFactory:

  • 可以想象成一个数据库连接池
  • SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例
  • 即其最佳的作用域是应用作用域
  • 最简单得就是使用单例模式或者静态单例模式

SqlSession:

  • 连接到连接池得一个请求
  • SqlSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域
  • 使用完毕之后,应该尽快关闭,否则资源会被占用

每一个Mapper代表一个业务!!!




4、日志

我们不难发现,我们在执行对应的SQL语句的时候,无法查看到我们进行到了那一步,特别是报错的时候,不方便排查。所以我们引入了日志,用来打印我们的对应信息,方便我们的进一步研究、使用

我们日志主要学习两种LOG4JSTDOUT_LOGGING

我们前面已经说过,日志是与缓存、懒加载…齐名的。所有我们的对应的修改方式就在setting中进行


4.1、STDOUT_LOGGING

Mybatis自带的

<settings>
	<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

4.2、LOG4J

由于我们自带的日志的功能有限,且打印的位置只能是在控制台,对于我们的后期使用有一定的不便性。所以我们引入了其他的功能更加强大的日志工具LOG4J

由于这是apache下的一个开源项目,所以我们需要使用引入对应的依赖

使用步骤:

  1. 导入对应的maven依赖
  2. 编写log4j的配置文件
  3. 在setting中开启使用LOG4J日志
  4. 在测试类中,获取对应的日志对象
  5. 测试代码




5、分页

我们查询数据的时候,不应该一下在将所有数据库的数据都显示出来,不管是对于用户的体验性还是对于服务端的机器压力,这样都是不好的。所以我们需要使用分页查询,用来将数据进行按页显示,即出现了我们的分页查询


5.1、使用Limit分页

SQL层面实现分页

我们在mapper.xml文件中的对应的SQL语句后面,添加对应的语句即可

select * from mybatis.user limit #{startIndex},#{pageSize};

然后我们在测试类中设置对应的数据即可


5.2、使用RowBounds分页

java代码层面

RowBounds底层其实使用的也是Limit

使用方式如下

List<User> userList= sqlSession.selectList("pers.mobian.dao.UserMapper.getUserRowBounds", 0, rowBounds);

当然如果你觉得自带的分页方式不好用,你也可以使用其他的插件进行,比如Mybatis pageHelper




6、注解开发

本质使用了反射,底层是动态代理

如果使用注解开发,我们就不再需要mapper.xml文件了,我们直接将对应的SQL语句,用注解的方式写在对应的接口上面。Mybatis相比与Hibernate其中的一个特性就是其可定制化,虽然使用注解能够让我们的开发代码更加的方便,但是如果是复杂的查询语句(多表查询),那么注解就会显得力不从心。所以Mybatis中不建议使用注解开发。在整个SSM中,也只有Mybatis这里不建议使用注解,其他的地方都推荐使用注解,毕竟注解真的很方便!!!

使用方式如图

@Select("select * from user")
List<User> getUser();




7、Lombok

这是一个为了让我们编写实体类更加方便的注解

使用步骤:

  1. 下载对应的插件
  2. 带入对应的依赖
  3. 在实体类上使用对应的注解即可




8、多对一、一对多

核心是使用resultMap对查询结果的嵌套。对于这一块的学习和理解,只有多练多理解,慢慢就会了




9、动态SQL

在编写SQL的时候,基于SQL代码一定的逻辑性

if

choose(when, otherwise)

trim(where, sert)

foreach

SQL片段

记不住不要怕,多练习多实践,会记住的,这只是个简单的逻辑而已!!!




10、缓存

我们查询数据的时候,为了解决每次都去查询相同的数据信息耗费资源的问题,引入了缓存这个概念。对于相同的查询,我们就将它放入缓存,如果下次相同的查询语句来临时,我们就可以直接使用缓存的数据,继而避免了操作数据库的资源耗费。

10.1、一级缓存

Mybatis默认开启的是一级缓存。我们可以使用日志的打印功能来观测,对于同一条SQL查询,我们开启了几次数据库的连接。

一个mapper文件,对应一个缓存的池子,我们将查询的数据放入池子,如果是相同的,下一次直接去池子里面拿就可以了。


10.2、二级缓存

二级缓存是对应于namespace级别的缓存,需要手开启。同样开启的位置也在setting中


10.3、缓存原理

个人觉得这是个重点,虽然没有实际的用处,但是对于我们理解整个Mybatis的数据查询有很大的帮助

缓存原理图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZLnGiobU-1586420918212)(Mybatis.assets/20200310214959578.png)]


10.4、自定义缓存

由于我们前期能力有限,可以暂时不需要考虑这个,但是我们要知道,Mybatis的缓存是可以自定义的

和前面的日志一样,如果觉得自带的不好用,我们可以自己自定义一个缓存。我们一般使用Ehcache进行缓存的自定义或者实现Cache接口(前者的实现也是实现了接口,并且帮我们写了)。

Ehcache使用过程:

  1. 引入对应的依赖
  2. 在mapper中引入对应的路径
  3. 编写一个我们自定义的缓存xml文件

实现接口使用过程:

  1. 实现接口,重写方法




11、思维导图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g0RdM000-1586420918218)(Mybatis.assets/image-20200409162758906.png)]

发布了46 篇原创文章 · 获赞 17 · 访问量 4053

猜你喜欢

转载自blog.csdn.net/qq_44377709/article/details/105413755
今日推荐