zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    逆序数
    Java处理对象
    Java8增强的包装类
    Java初始化块
    Linux- Linux软件配置
    Python- 【python无法更新pip】提示python.exe: No module named pip
    Error- Overloaded method value createDirectStream in error Spark Streaming打包报错
    Error- spark streaming 打包将全部依赖打进去Invalid signature file digest for Manifest main attributes
    Spark- Spark从SFTP中读取zip压缩文件数据做计算
    JAVA- 内部类及匿名内部类
  • 原文地址:https://www.cnblogs.com/STK0210/p/11182451.html
Copyright © 2011-2022 走看看