百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Mybatis简单入门

wxin55 2024-11-24 22:38 15 浏览 0 评论

Mybatis简单入门

前言

之前学习了JDBC的访问数据库的方式。复习一下操作步骤

  • 加载驱动
  • 创建连接
  • 开启statement
  • 通过statement执行sql并获取访问结果resultSet
  • 解析RS
  • 关闭resultSet/statement/conn

那么JDBC编程有哪些弊端呢?

  • 工作量大,操作数据库至少要5步;
  • 业务代码和技术代码耦合;
  • 连接资源手动关闭,带来了隐患

因此我们就有了ORM技术(于实现面向对象编程语言里不同类型系统的数据之间的转换)

ORM带来的好处:

  • 更加贴合面向对象的编程语意,Java程序员喜欢的姿势;
  • 技术和业务解耦,Java程序员无需对数据库相关的知识深入了解
  • 开发者不需要关心释放数据库连接资源

目前比较常见的ORM框架就是 hibernate 和 mybatis。互联网企业比较常用的是Mybatis因为相对于hinernate更灵活一些。


Mybatis快速入门

Mybatis一次数据库访问的流程图:

  • SqlSessionFactoryBuilder:读取配置信 息创建SqlSessionFactory,建造者模式,方法级别生命周期;
  • SqlSessionFactory:创建Sqlsession,工厂单例模式,存在于程序的整个生命周期;
  • SqlSession:代表一次数据库连接,可以直接发送SQL执行,也可以通过调用 Mapper访问数据库;线程不安全,要保 证线程独享(方法级);
  • SQL Mapper:由一个Java接口和XML文件组成,包含了要执行的SQL语句和结果集映射规则。方法级别生命周期。

简单的代码示例

maven

<!-- mysql驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.18</version>
</dependency>

<!-- mybatis相关依赖 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.1</version>
</dependency>

配置文件

<?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>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true" />
    </settings>

    <!--配置environment环境 -->
    <environments default="development">
        <!-- 环境配置1,每个SqlSessionFactory对应一个环境 -->
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="UNPOOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/ybconvet?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>

    <!-- 映射文件,mapper的配置文件 -->
    <mappers>
<!--        直接映射到相应的mapper文件-->
        <mapper resource="mapper/YbFctMapper.xml" />
<!--        <mapper class="com.jmmq.load.jim.dao.YbFctMapper" />-->
    </mappers>

</configuration>

Mapper:

package com.jmmq.load.jim.dao;
...
    
@Mapper
public interface YbFctMapper {
    Map getOneByid(String id);
}

sqlMapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.jmmq.load.jim.dao.YbFctMapper" >
    <select id="getOneByid" parameterType="java.lang.String" resultType="java.util.Map">
        select '欸嘿~我不查就是玩' msg from fct_to_dwd where id = #{id}
    </select>
</mapper>

Test

package com.jmmq.load.jim;
...
public class MybatisTest {

    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void init() throws IOException {
        String resource =  "mybatis/mybatis-demo.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 1.读取mybatis配置文件创SqlSessionFactory
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        inputStream.close();
    }

    // 快速入门
    @Test
    public void query() throws IOException {
        // 2.获取sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 3.获取对应mapper
        YbFctMapper mapper = sqlSession.getMapper(YbFctMapper.class);
        // 4.执行查询语句并返回结果
        Map info = mapper.getOneByid("31");
        System.out.println(info);
    }
}

执行结果:

{msg=欸嘿~我不查就是玩}


Mybatis配置文件

  • 属性


属性名

说明

备注


properties

定义配置,配置的属性可以在整个配置文件中其他位置进行引用;

重要,优先使用 property配置文件解耦


settings

设置,用于指定MyBatis的一些全局配置属性,这些属性非常重要, 它们会改变MyBatis的运行时行为;

重要


typeAliases

别名,为Java类型设置一个短的名字,映射时方便使用;分为系统定 义别名和自定义别名;

可以通过xml和注解配置


typeHandlers

用于jdbcType与javaType之间的转换;

无特殊需求不需要调整; 后面专题说明


ObjectFactory

MyBatis每次创建结果对象的新实例时,它都会使用对象工厂 (ObjectFactory)去构建POJO

大部分场景下无需修改


plugins

插件,MyBatis允许你在已映射的语句执行过程中的某一点进行拦截 调用;

插件扩展


environments

用于配置多个数据源,每个数据源分为数据库源和事务的配置;

在多数据源环境使用


databaseIdProvider

MyBatis可以根据不同的数据库厂商执行不同的语句,用于一个系统 内多厂商数据源支持。

大部分场景下无需修改


mappers

配置引入映射器的方法。可以使用相对于类路径的资源引用、或完全 限定资源定位符(包括file:///的URL),或类名和包名等等


  • 参数

参数

描述

取值范围

默认值

cacheEnabled

影响的所有映射器中配置的缓存的全局开关

true/false

true

lazyLoadingEnabled

延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联 关系中可通过设置fetchType属性来覆盖该项的开关状态

true/false

false

aggressiveLazyLoading

启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载; 反之,每种属性将会按需加载。

true/false

true

multipleResultSetsEnabl ed

是否允许单一语句返回多结果集(需要兼容驱动)

true/false

true

useColumnLabel

使用列标签代替列名。不同的驱动在这方面会有不同的表现, 具体可参考 相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。

true/false

true

useGeneratedKeys

允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设 置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 D erby)。

true/false

false

autoMappingBehavior

指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射; PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动 映射任意复杂的结果集(无论是否嵌套)。

NONE/ PA RTIAL/ FU LL

PARTIAL

defaultExecutorType

配置默认的执行器。 SIMPLE 就是普通的执行器; REUSE 执行器会 重用预处理语句(prepared statements); BATCH 执行器将重用 语句并执行批量更新。

SIMPLE/REU SE/BATCH

SIMPLE

defaultStatementTimeout

设置超时时间,它决定驱动等待数据库响应的秒数。

整数

null

safeRowBoundsEnabled

允许在嵌套语句中使用分页(RowBounds)。

true/false

false

mapUnderscoreToCamelCase

是否开启自动驼峰命名规则(camel case)映射,即从经典数据库 列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。

true/false

false

localCacheScope

MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circula r references)和加速重复嵌套查询。 默认值为 SESSION,这种情 况下会缓存一个会话中执行的所有查询。 STATEMENT, 本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会 共享数据。

SESSION /S TATEMENT

SESSIO N

jdbcTypeForNull

当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可, 比如 NULL、VARCHAR 或 OTHER。

JdbcType 枚 举,最常见的 是: NULL, VA RCHAR and OTHER

OTHER

lazyLoadTriggerMethods

指定哪个对象的方法触发一次延迟加载。

方法列表用 逗号隔开;

equals,clon e,hashCode ,toString

callSettersOnNulls

指定当结果集中值为 null 的时候是否调用映射对象的 setter (map 对象时为 put)方法,这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意基本类型(int、boolean 等)是不能设置成 null 的。

true/false

false

logPrefix

指定 MyBatis 增加到日志名称的前缀。



logImpl

指定 MyBatis 所用日志的具体实现,未指定时将自动查找。

SLF4J /LOG4J / L OG4J2 /JDK_LOG GING / COMMO NS_LOGGING / S TDOUT_LOGGIN G / NO_LOGGING


proxyFactory

指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。

CGLIB / JAVASSIS

版本3.3.0以 上JAVASSIS T

Mybatis-mapper文件

  • cache – 给定命名空间的缓存配置。
  • cache-ref – 其他命名空间缓存配置的引用。
  • resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
  • sql – 可被其他语句引用的可重用语句块。
  • insert – 映射插入语句
  • update – 映射更新语句
  • delete – 映射删除语句
  • select – 映射查询语句

具体用法我这里就不写了,反正网上一大片,而且用过的基本都知道怎么用。

动态sql标签

  • if
  • choose(when、otherwise)
  • trim(where、set)
  • foreach



相关推荐

Shiro学习系列教程三:集成web(web集成环境)

相关推荐:《Shiro学习系列教程一:Shiro之helloworld》《Shiro学习系列教程三:集成web》《Shiro学习系列教程四:集成web(二)》《Shiro学习系列教程五:自定义Real...

写了这么多年代码,这样的登录方式还是头一回见

SpringSecurity系列还没搞完,最近还在研究。有的时候我不禁想,如果从SpringSecurity诞生的第一天开始,我们就一直在追踪它,那么今天再去看它的源码一定很简单,因为我们了...

Shiro框架:认证和授权原理(shiro框架授权的四种方式)

优质文章,及时送达前言Shiro作为解决权限问题的常用框架,常用于解决认证、授权、加密、会话管理等场景。本文将对Shiro的认证和授权原理进行介绍:Shiro可以做什么?、Shiro是由什么组成的?举...

Spring Boot 整合 Shiro-登录认证和权限管理

这篇文章我们来学习如何使用SpringBoot集成ApacheShiro。安全应该是互联网公司的一道生命线,几乎任何的公司都会涉及到这方面的需求。在Java领域一般有SpringS...

Apache Shiro权限管理解析二Apache Shiro核心组件

ApacheShiro核心组件Subject(用户主体)Subject是Shiro中的核心概念之一,表示当前用户(可以是登录的用户或匿名用户)。它是与用户交互的主要接口,提供了对用户身份验证...

详细介绍一下Apache Shiro的实现原理?

ApacheShiro是一个强大、灵活的Java安全框架,设计目标是简化复杂的安全需求,提供灵活的API,使开发者能方便地将安全功能集成到任何应用中。主要作用是用于管理身份验证、授权、会话管理和加...

什么是Apache Shiro?SpringBoot中如何整合Apache Shiro?

ApacheShiro是一个功能强大且易于使用的Java安全框架,主要用于构建安全的企业应用程序,例如在应用中处理身份验证(Authentication)、授权(Authorization)、加密(...

Apache Shiro权限管理解析三Apache Shiro应用

Shiro的优势与适用场景优势简单易用:API设计直观,适合中小型项目快速实现权限管理。灵活性高:支持多种数据源(数据库、LDAP等),并允许开发者自定义Realm。跨平台支持:不仅限于We...

那些通用清除软件不曾注意的秘密(清理不需要的应用)

系统清理就像卫生检查前的大扫除,即使你使出吃奶的劲儿把一切可能的地方都打扫过,还会留下边边角角的遗漏。随着大家电脑安全意识的提高,越来越多的朋友开始关注自己的电脑安全,也知道安装360系列软件来"武装...

JWT在跨域认证中的奇妙应用(jq解决跨域)

JWT在跨域认证中的奇妙应用什么是JWT?让我们先来聊聊JWT(JSONWebToken)。它是一种轻量级的认证机制,就像一张电子车票,能让用户在不同的站点间通行无阻。JWT由三部分组成:头部(H...

开启无痕浏览模式真能保护个人隐私吗?

在访问网站页面时,你是否有过这样的疑虑,自己访问的会不会是山寨网站?用公用电脑上网,个人信息会被别人看到吗?这时,有人会说,使用浏览器的“无痕浏览”模式不就行了,可以在操作中不留下“蛛丝马迹”,但,真...

辅助上网为啥会被抛弃 曲奇(Cookie)虽甜但有毒

近期有个小新闻,大概很多小伙伴都没有注意到,那就是谷歌Chrome浏览器要弃用Cookie了!说到Cookie功能,很多小伙伴大概觉得不怎么熟悉,有可能还不如前一段时间被弃用的Flash“出名”,但它...

cookie、session和token(cookie,session和token的区别)

Cookie的概念最早是在1994年由NetscapeCommunications的程序员LouMontulli发明的,目的是为了解决当时早期互联网的一个关键问题:HTTP无状态协...

小白都能看懂的session与cookie的区别理解

cookie/session都是跟踪识别浏览器用户身份的一个东西。cookie的理解:我们要知道,服务器和客户端之间进行数据传输,需要使用到一个超文本传输协议(http协议),而http协议本身是个...

面试:网易一面:支撑10万QPS的电商购物车系统如何架构设计呢?

1.需求分析:10万QPS的购物车系统需要满足哪些需求?回答:10万QPS的购物车系统需要满足以下核心需求和挑战:核心功能:添加、删除、修改购物车商品实时查看购物车列表支持高并发读写(10万QPS)...

取消回复欢迎 发表评论: