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)...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Shiro学习系列教程三:集成web(web集成环境)
- 写了这么多年代码,这样的登录方式还是头一回见
- Shiro框架:认证和授权原理(shiro框架授权的四种方式)
- Spring Boot 整合 Shiro-登录认证和权限管理
- Apache Shiro权限管理解析二Apache Shiro核心组件
- 详细介绍一下Apache Shiro的实现原理?
- 什么是Apache Shiro?SpringBoot中如何整合Apache Shiro?
- Apache Shiro权限管理解析三Apache Shiro应用
- 那些通用清除软件不曾注意的秘密(清理不需要的应用)
- JWT在跨域认证中的奇妙应用(jq解决跨域)
- 标签列表
-
- hive行转列函数 (63)
- sourcemap文件是什么 (54)
- display none 隐藏后怎么显示 (56)
- 共享锁和排他锁的区别 (51)
- httpservletrequest 获取参数 (64)
- jstl包 (64)
- qsharedmemory (50)
- watch computed (53)
- java中switch (68)
- date.now (55)
- git-bash (56)
- 盒子垂直居中 (68)
- npm是什么命令 (62)
- python中+=代表什么 (70)
- fsimage (51)
- nginx break (61)
- mysql分区表的优缺点 (53)
- centos7切换到图形界面 (55)
- 前端深拷贝 (62)
- kmp模式匹配算法 (57)
- jsjson字符串转json对象 (53)
- jdbc connection (61)
- javascript字符串转换为数字 (54)
- mybatis 使用 (73)
- 安装mysql数据库 (55)