Mybatis总结(mybatis plus待更新)

MyBatis是Apache公司开发为解决数据持久化问题的框架。

下面以maven工程为例,来介绍搭建mybatis开发环境(使用mysql数据库)的一些细节。

要搭建mybatis环境,首先必须的是在pom.xml中配置jar的打包方式,以及mybatis和mysql-connector-java的坐标。(根据需要,增添日志或者测试的坐标)

首先介绍不使用注解方式来搭建环境。

1. 注意持久层接口的映射文件(Dao.xml)的resources路径必须与java中持久层的接口Dao路径相匹配,创建路径时也必须逐层Directory,如果一次性创建,可能并不会创建分层的目录,路径就无法匹配。

!!!如果使用注解的方式,一定要移除对应的映射配置文件(Dao.xml)

image

 

查询所有

IUserDao.xml中关于’查询所有‘这个功能的配置,其关键路径是由namespace的接口路径

id是接口中定义的方法的名字,返回类型可以通过SqlMapConfig.xml中的package标签进行简化,不然也需要全路径

image

下面是保存用户的例子,其中#{}代表了ppst中的占位符,会自动进行java类型和jdbc类型的转换,填充对象的数据,简单的传入单个参数,名称可以为value也可以任意设置

(下下张图备注中使用的${}表示的是拼接sql串,但不会进行jdbc类型转换,但如果是单个参数,名称必须为value)

image

注解方式:

没有了映射文件

只需要在接口定义的方法上直接写出sql语句:

image

 

 

模糊查询

如果是模糊查询有2种配置方式,推荐使用参数占位符的方式,字符串拼接很不安全。

image

你只需要在输入参数的地方自己手动加上%就可以了。

接口中定义的方法:image[16]

测试类中的方法:

image

注解方式:

没有了映射文件

只需要在接口定义的方法上直接写出sql语句,对于参数的写法使用#{}

image

 

条件查询

image

mybatis可以使用条件查询,需要在接口配置文件中进行处理

image

用where和if标签去动态增添语句,通过and的sql方式去动态拼接条件。

 

paremeterPype参数配置

这个标签属性,不仅可以设置为基本类型,比如Integer、String等,还可以使用自定义的实体类(POJO)类型,比如自定义一个包装了user的POJO类:

image

接口中定义方法为:

image

接口的配置文件中:

image

这个方法是遍历了一组id,去找寻id范围内的user

image

 

resultType参数配置

我们默认的配置,因为domain的类属性与数据库表中的column是一致的,所以会实现自动匹配封装(匹配时,mysql不区分大小写,所以单纯的驼峰命名与默认配置时一致的),但是如果不一致,会无法实现封装。

如果要自己取别名,而要其实现匹配封装,有2种方式。

a.需要在配置的语句中自己加上别名

image

用as的方式,把column属性与自己定义的名称一一对应。

b.由于上述方式过于具体,你需要在每一个使用了 别名的方法中更改,比较麻烦,所以还可以采用定义resultMap的方式

image

之后把所有的resultType更改为resultMap即可

image

 

一对一查询

有多种方式:

a.定义一个包含两个实体所需信息的实体,那么只需要在返回数据时更改returnType为这个综合了信息的实体即可。

b.使用resultMap去定义一对一映射的查询的结果(使用这种方式需要在一对一中,返回类型的一的那一方去添加另一方的对象,重点是重新定义接口类的配置)

image

注解方式:(一个账户对一个用户)

没有了映射文件

只需要在接口定义的方法上直接写出sql语句:

image

 

一对多查询

一个用户有多个账户,如果查询时该用户没有账户,仍然需要将该用户查询出来,所以用左外连接进行查询。

配置时,在一的一方的实体类中,添加多的一方的对象集合,并且修改配置文件

image

注解方式:(一个用户对多个账户)

没有了映射文件

只需要在接口定义的方法上直接写出sql语句:

image

 

多对多查询

用户可以有多个角色,一个角色可以对应多个用户

多对多其实就是双向的一对多关系,关键在于sql语句比较复杂(使用中间表),仍然是在主动方的实体类中,添加被动方的对象List集合。

image

image

另一方的反过来配置即可

image

image

注解配置:

多对多就是双向的一对多,同一对多中的配置。

 

延迟加载

一般在查询数据时,对于被动方的使用不是即时性的,所以不需要使用被动方数据时就可以使用懒加载来提高性能(查询单表比关联查询多表的速度快)

以一对一关系(账户对用户)的例子,配置用户延迟加载

a.使用association参数来配置延迟加载的部分

image

要使用还需要在SqlMapConfig.xml中添加延迟加载开启

image

b.还可以直接使用以前用过的collection标签来配置延迟加载,但是需要进行改动,使用select和column去实现新的映射

image

 

mybatis一级缓存

是SqlSession级别的缓存,只要SqlSession没有flush或close,它就存在

需要在配置方法时添加useCache参数

image

只要SqlSession没有进行flush和close,对同样的结果集进行查询时,只会执行一次数据库操作,第二次查询时不会向数据库发出sql语句,而是直接从一级缓存中查询。

SqlSession的修改添加删除commit,close都会清空一级缓存。

如果SqlSession执行commit操作,这样的目的是为了让缓存中存储的是最新的信息,避免脏读。

注解方式:

其实一级缓存是默认开启的,只是flush和close清空他,所以打开是不需要配置的。

 

二级缓存

是mapper映射级别的缓存,只要由同一个SqlSessionFactory创建的SqlSession都能共享缓存

需要到SqlMapConfig.xml去添加setttings设置

image

然后去映射文件中添加,cache标签就代表该映射将使用二级缓存

image

然后还需要在具体的语句上去使用useCache标签

image

测试类为:

image

基于注解的配置:

没有了映射文件

但是SqlMapConfig.xml中的setting开启也是需要进行的。

只是需要在持久层接口中,使用注解开启二级缓存

image

 

2. resources根目录下的SqlMapConfig.xml配置文件

一般头部是默认的mybatis的config约束

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

内部的configuration的配置细节已经在下面的代码中全部加上了备注

其中配置连接池的数据的信息,需要引入jdbcConfig.properties(也可以直接指定,写在properties中,以name value的形式,不过还是推荐使用配置文件)

image

为了方便配置,可以在typeAliases和mappers中使用package标签,实现实体类的别名指定和接口映射文件的路径指定。(typeAliases使用package是批量的别名定义,会扫描包下的所有类,必须银蛇文件名称相同,且放在同一个目录中。也可以用typeAlias去细节定义)

 

SqlMapConfig.xml属性配置

<configuration>
    <!--配置properties
        可以在标签内部配置连接数据库的信息,也可以通过属性引用外部配置文件信息
        resource属性
            用于指定配置文件的位置,按照类路径的写法来写,必须存在于类路径下
        url属性
            是要求按照url的写法来写地址
            URL:Uniform Resource Locator 统一资源定位符。它可以唯一地表示一个资源的位置
            like:http://localhost:8080/StoreV5/Servlet
                 协议    主机      端口  URI
            URI:Uniform Resource Identifier 统一资源标识符。它可以在应用中惟一的定位一个资源
    -->
    <properties
            url="file:///D:/WorkSpace/IDEAworkspace/mybatis_base/mybatis_dao/src/main/resources/jdbcConfig.properties"/>
    <!--<properties resource="jdbcConfig.properties"/>-->
    <!--使用typeAliases配置别名,它只能配置domain中类的别名-->
    <typeAliases>
        <!--&lt;!&ndash;type属性指定实体类的全限定类名。alias属性指定别名,当指定了别名就不再区分大小写&ndash;&gt;-->
        <!--<typeAlias type="com.lky.domain.User" alias="user"/>-->

        <!--用于指定要配置别名的包,当指定之后,该包下的实体类都会这册别名(类名,不区分大小写)-->
        <package name="com.lky.domain"/>
    </typeAliases>
    <!--配置环境-->
    <environments default="mysql55">
        <!--配置mysql55环境-->
        <environment id="mysql55">
            <!--配置事务-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--配置映射文件位置-->
    <mappers>
        <!--<mapper resource="com/lky/dao/IUserDao.xml"/>-->

        <!--package标签用于指定dao接口所在的包,当指定了之后就不需要再写mapper以及resource或者class了-->
        <package name="com.lky.dao"/>
    </mappers>
</configuration>

image

MyBatis 在初始化时, 根据<dataSource>的 type 属性来创建相应类型的的数据源 DataSource,即:
type=”POOLED”: MyBatis 会创建 PooledDataSource 实例
type=”UNPOOLED” : MyBatis 会创建 UnpooledDataSource 实例
type=”JNDI”: MyBatis 会从 JNDI 服务上查找 DataSource 实例,然后返回使用

 

配置完pom.xml,接口的映射文件Dao.xml,总的配置文件SqlMapConfig.xml,和个人的数据库连接参数jdbcConfig.properties之后,就可以使用mybatis了。

 

使用mybatis的步骤(简单的从数据库查询所有User),如下

image

为了方便多个测试,可以使用Junit的@Before和@After方法,把资源创建和释放分开,更便于测试mybatis的各种配置和应用(其中@After方法常常与Mybatis事务提交所组合,在释放资源前,session.commit();其实事务开启的开关在openSession()方法中,可设置为true or false)

 

最后,给上Mybatis的官方使用文档,中文的

http://www.mybatis.org/mybatis-3/zh/getting-started.html

所有的细节设置都可以在其中学到,希望大家一起进步!

posted @ 2019-07-13 22:47  STK0210  阅读(1184)  评论(0编辑  收藏  举报