• Mybatis的介绍及使用


    目录

    Mybatis

    搭建MyBatis开发环境

    1、创建Maven工程,导入MyBatis依赖的组件

    2、编写MyBatis核心配置文件(mybatis-config.xml)

    3、创建实体类-POJO

    4、创建SQL映射文件(mapper.xml)

    5、创建测试类


    Mybatis

    MyBatis是一款优秀的持久层框架,用于简化JDBC开发
    MyBatis 本是 Apache的一个开源项目iBatis, 2010年这个项目由apache softwarefoundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github

    官网:mybatis – MyBatis 3 | 入门

    持久层

    负责将数据到保存到数据库的那一层代码

    JavaEE三层架构:表现层、业务层、持久层

    框架

    框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型

    在框架的基础之上构建软件编写更加高效、规范、通用、可扩展

    JDBC缺点

    1.硬编码:注册驱动,获取连接,SQL语句

    2.操作繁琐:手动设置参数,手动封装结果集

    Mybatis特点

    1、基于SQL语法,简单易学

    2、能了解底层封装过程,内部通过JDBC访问数据库的操作

    3、SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度

    4、方便程序代码调试

    ORM(Object Relational Mapping)

    对象/关系映射,是一种数据持久化技术。它在对象模型关系型数据库之间建立起对应关系,

    并且提供了一种机制,通过JavaBean对象去操作数据库表中的数据。

    编写程序的时候,以面向对象的方式处理数据。

    保存数据的时候,却以关系型数据库的方式存储。

    ORM解决方案包含下面四个部分:

    1、在持久化对象上执行基本的增、删、改、查操作

    2、对持久化对象提供一种查询语言或者API

    3、对象关系映射工具

    4、提供与事务对象交互、执行检查、延迟加载以及其他优化功能

    搭建MyBatis开发环境

    1、创建Maven工程,导入MyBatis依赖的组件

    找到pom.xml在dependencies中添加依赖 

    2、编写MyBatis核心配置文件(mybatis-config.xml)

    configuration 配置
    properties    可以配置在Java 属性配置文件中
    settings    修改 MyBatis 在运行时的行为方式
    typeAliases  Java 类型命名一个别名(简称)
    typeHandlers  类型处理器
    objectFactory  对象工厂
    plugins   插件
    environments   环境
    environment   环境变量
    transactionManager 事务管理器
    dataSource  数据源
    mappers    映射器

     配置properties元素的两种方式

    1、通过外部指定的方式,即配置在典型的Java属性文件中(如:database.properties),实现动态配置

    2、直接配置为xml,并使用这些属性对配置项实现动态配置

    通过外部指定的方式(database.properties),实现动态配置

    配置propertiesresource属性

    1. <properties>
    2. <property name="driver" value="com.mysql.jdbc.Driver"/>
    3. <property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms"/>
    4. <property name="user" value="root"/>
    5. <property name="password" value=“aptech"/>
    6. ......
    7. ">
    8. " value="${driver}"/>
    9. " value="${url}"/>
    10. " value="${user}"/>
    11. " value="${password}"/>

     若两种方式同时都用了,那么哪种方式优先?

    配置propertiesresource指定

    配置propertynamevalue

    1. <properties resource="database.properties">
    2. <property name="driver" value="com.mysql.jdbc.Driver"/>
    3. <property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms"/>
    4. <property name="user" value="root"/>
    5. <property name="password" value="root"/>
    6. </properties>

      resource属性值的优先级高于property子节点配置的值

    settings元素

    作用:是设置一些非常重要的设置选项,用来设置和改变MyBatis运行时的行为方式 

    设置项

    描述

    允许值

    默认值

    cacheEnabled

    对在此配置文件下的所有cache 进行全局性开/关设置

    true | false

    true

    lazyLoadingEnabled

    全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载

    true | false

    true

    autoMappingBehavior

    MyBatis对于resultMap自动映射匹配级别

    NONE |

    PARTIAL |

    FULL

    PARTIAL

    typeAliases元素

    作用:配置类型别名,通过与MyBatis的SQL映射文件相关联,减少输入 多余的完整类名,以简化操作。

    1. <typeAliases>
    2. <package name ="cn.smbms.pojo" />
    3. </typeAliases>

     environments元素

    表示配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上

    子元素节点:environment,但是必须指定其中一个默认运行环境(通过default指定)

    注意:每个SqlSessionFactory实例只能选择一个运行环境

    dataSource

    dataSource元素使用基本的JDBC数据源接口来配置JDBC连接对象的资源

    有三种内建的数据源类型

    <dataSource type=" [UNPOOLED | POOLED | JNDI]" />
    
    1. <dataSource type="POOLED">
    2. <property name="driver" value="${driver}"/>
    3. <property name="url" value="${url}"/>
    4. <property name="username" value="${user}"/>
    5. <property name="password" value="${password}"/>
    6. </dataSource>

    mappers元素

    作用:映射器,定义SQL映射语句

    须在配置中引用mapper映射文件

    方式一:使用类资源路径获取资源

    1. <mappers>
    2. <mapper resource="cn/smbms/dao/user/UserMapper.xml"/>
    3. mappers>

     方式二:使用URL获取资源

    1. <mappers>
    2. <mapper url="file:///E:/sqlmappers/UserMapper.xml"/>
    3. <mapper url="file:///E:/sqlmappers/ProviderMapper.xml"/>
    4. </mappers>

    3、创建实体类-POJO

    4、创建SQL映射文件(mapper.xml)

    SQL映射文件的几个顶级元素(按照定义的顺序)

    mappernamespace
    cache配置给定命名空间的缓存
    cache-ref从其他命名空间引用缓存配置
    resultMap用来描述数据库结果集和对象的对应关系
    sql可以重用的SQL块,也可以被其他语句引用
    insert 映射插入语句
    update映射更新语句
    delete映射删除语句
    select映射查询语句

    mapper

    namespace:命名空间

    namespace和子元素的id联合保证唯一,区别不同的mapper

    绑定DAO接口

    namespace的命名必须跟某个接口同名

    接口中的方法与映射文件中SQL语句id一一对应

    示例:

    1. <mapper namespace="cn.cvs.dao.sysuser.SysUserMapper">
    2. <select id="getUserList"
    3. ……
    4. </select>
    5. </mapper>

    select语句有很多属性可以详细配置每一条语句

    id:命名空间中唯一的标识符

    接口中的方法与映射文件中的SQL语句id一一对应

    parameterType:

    表示查询语句传入参数的类型的完全限定名和别名

    支持基础数据类型和复杂数据类型

    resultType

    SQL语句返回值类型的完整限定名或别名

    示例:仅传入一个简单数据类型的查询条件,如一个基本类型或其包装类型,或一个String类型等,MyBatis框架的处理方式也非常简单。需求:根据真实姓名模糊查询用户信息

    1.SysUserMapper接口中添加查询方法

    List<SysUser>  getUserListByRealName(String realName);

    2SysUserMapper.xml中添加SQL语句映射

    1. select * from t_sys_user where realName like CONCAT ('%', #{param}, '%')

     3、在单元测试类中添加测试方法

    List<SysUser> userList =sqlSession.getMapper(SysUserMapper.class) .getUsersByRealName("李");
    

    别名与Java类型映射

    别名映射的类型
    stringString
    byteByte
    longLong
    shortShort
    doubleDouble
    floatFloat
    booleanBoolean
    date

    Date

    intInteger

    integer

    Integer
    arraylistArrayList
    mapMap
    listList

    collection

    Collection
    iteratorIterator
    decimalBigDecimal
    bigdecimalBigDecimal
    objectObject

    ……

    ……

    parameterType

    基础数据类型

    int、StringDate等,一个参数传递单一数值

    用@Param注解为参数命名,通过 #{参数名} 获取传入的值

    复杂数据类型

    Java实体类,Map

    通过#{属性名}或者#{mapkeyName}即可获取传入值

    resultType :直接表示返回类型

    基本数据类型

    复杂数据类型

    resultMap :对外部resultMap的引用

    应用场景:

    数据库字段信息与对象属性不一致

    复杂的联合查询,自由控制映射结果

    二者不能同时存在,本质上都是Map数据结构

    resultMap自动映射匹配前提:字段名与属性名一致

    resultMap的自动映射级别-autoMappingBehavior

    PARTIAL(默认):自动匹配所有

    NONE:进制自动匹配

    1. <settings>
    2. <setting name="autoMappingBehavior" value="NONE"/>
    3. </settings>

     insert属性:id、parameterType

    1. <insert id="add" parameterType="User" >
    2. insert into smbms_user (userCode,userName,userPassword)
    3. values ( #{userCode},#{userName},#{userPassword})
    4. </insert>

     注意:insertupdatedelete元素均没有resultType属性

    update属性:id、parameterType

    1. <update id ="modify" parameterType="User">
    2. update smbms_user set userCode = #{userCode},
    3. userName = #{userName},
    4. userPassword = #{userPassword} where id = #{id}
    5. </update>

     delete属性:id、parameterType

    1. <delete id ="deleteUserById" parameterType="int">
    2. delete from smbms_user where id = #{id}
    3. </delete>

     resultMap属性

    id:resultMap的唯一标识

    type:Java实体类

    resultMap子元素

    id:一般对应数据库中该行的主键id,设置此项可提高MyBatis性能

    result:映射到JavaBean的某个“简单类型”属性

    association:映射到JavaBean的某个“复杂类型”属性,比如JavaBean

    collection:映射到JavaBean的某个“复杂类型”属性,比如集合

    association

    复杂的类型关联,一对一

    内部嵌套:映射一个嵌套JavaBean属性

    属性

    property:映射数据库列的实体对象的属性

    javaType:完整Java类名或者别名

    resultMap:引用外部resultMap

    子元素:id、result

    property:映射数据库列的实体对象的属性

    column:数据库列名或者别名

    collection

    复杂类型集合,一对多

    内部嵌套、映射一个嵌套结果集到一个列表

    属性

    property:映射数据库列的实体对象的属性

    ofType:完整Java类名或者别名(集合所包括的类型)

    resultMap:引用外部resultMap

    子元素:id、result

    property:映射数据库列的实体对象的属性

    column:数据库列名或者别名

    5、创建测试类

    1、读取核心配置文件mybatis-config.xml

    2、创建SqlSessionFactory对象,读取配置文件

    3、创建SqlSession对象

    4、调用mapper文件进行数据操作

    SqlSessionFactory

    SqlSessionFactory是每个MyBatis应用的核心

    作用:创建SqlSession实例

    SqlSessionFactory工具类

    1. public class MybatisUtil {
    2. private static SqlSessionFactory sqlSessionFactory;
    3. static {
    4. String mybatisPath = "mybatis/mybatis-config.xml";
    5. //1、加载mybatis配置文件
    6. InputStream is = null;
    7. try {
    8. is = Resources.getResourceAsStream(mybatisPath);
    9. } catch (IOException e) {
    10. e.printStackTrace();
    11. }
    12. //2、根据mybatis配置文件,创建生成SqlSession的factory工厂
    13. sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    14. }
    15. public static SqlSession createSqlSession(){
    16. if (sqlSessionFactory != null){
    17. return sqlSessionFactory.openSession();
    18. }
    19. return null;
    20. }
    21. public static void closeSqlSession(SqlSession sqlSession){
    22. if (sqlSession != null){
    23. sqlSession.close();
    24. }
    25. }
    26. }

  • 相关阅读:
    vue-treeselect树形下拉,根据登录人角色,隐藏本级登录人节点(树形数据,删除指定节点)
    【Singleton模式】C++设计模式——单例模式
    【测试开发】基于 node 的 puppeteer 环境搭建(1/2)
    Google-indexing api使用
    第二章《Java程序世界初探》第2节:常量的使用
    SpringBoot的初步认识
    数据结构:共用体+枚举
    ⭐每天一道leetcode:21.合并两个有序链表(简单;双指针)
    [笔记]攻防工具分享之 CobaltStrike框架 《一》环境配置
    期货公司开户后续会有哪些服务?
  • 原文地址:https://blog.csdn.net/qi341500/article/details/128096045