Mybatis总结

Mybatis 概述及搭建

        原是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移到了 Google Code,随着开发团队转投GoogleCode 旗下, iBatis3.x正式更名为MyBatis。

        MyBatis 是一款优秀的持久层框架

        MyBatis 避免了几乎所有的 JDBC 代码手动设置参数以及手动获取结果集的操作。 Mybatis 将基本的 JDBC 常用接口封装,对外提供操作即可. MyBatis 可以使用 XML 或注解来配置和映射,将数据库中的记录映射成Java 的 POJO(Plain Old Java Objects,普通的 Java 对象),是一种ORM(ORMObject Relational Mapping 对象关系映射)实现. 它支持动态 SQL 以及数据缓存.         Mybatis 中文官网 https://mybatis.org/mybatis-3/zh_CN/index.html

MyBatis 环境搭建

1.创建一张表和表对应的实体类

2.导入 MyBatis jar 包,mysql 数据库驱动包

<dependency>

<groupld>org.mybatis</groupld>

<artifactld>mybatis</artifactld>

<version>3.4.2</version>

</dependency>

3. 创建 MyBatis 全局配置文件

<?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>

<environments default="development">

<environment id="development">

<transactionManager type="JDBC"/>

<dataSource type="POOLED">

<property name="driver" value="" />

<property name="url" value="" />

<property name="username" value="" />

<property name="password" value=""/>

</dataSource>

</environment>

</environments>

</configuration>

4 定义接口

在接口中定义方法

public interface AdminDao{

Admin findAdminById(int id);

5 创建 sql 映射文件

<?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="接口的地址">

<select id="findAdminByld"    parameterType="int"      resultType="com.ffyc.mybatis.model.Admin">

select *from admin  where id = #{id}

</select></mapper>

 测试Mybatis

读取配置文件

Reader reader = Resources.getResourceAsReader("mybatis-config.xml");

根据官网

创建 SqlSessionFactory

SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); 

创建 SqlSession

SqlSession sqlSession = sessionFactory.openSession(); 

获得接口代理对象

sqlSession.getMapper(接口.class);

sqlSession .close();关闭 

API 接口说明

SqlSessionFactory 接口

        使用 SqlSessionFactory 来创建 SqlSession,一旦创建SqlSessionFactory就会在整个应用过程中始终存在。由于创建开销较大,所以没有理由去销毁再创建它,一个应用运行中也不建议多次创建 SqlSessionFactory。

SqlSession 接口

         Sqlsession 意味着创建与数据库链接会话,该接口中封装了对数据库操作的方法,与数据库会话完成后关闭会话。

Mybatis-Dao 层面向接口开发

         面向接口开发方式只需要程序员编写接口,由 Mybatis 框架创建接口的动态代理对象,使用 sqlsession.getMapper(接口.class);获得代理对象. 面向接口开发需要遵循以下规范:

1、 Mapper.xml 文件中的 namespace 与 mapper 接口的类路径相同.

2、 Mapper 接口方法名和 Mapper.xml 中定义的每个statement 的id相同.

3、 Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个sql 的parameterType 的类型相同.

4、 Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个sql 的resultType 的类型相同. 

 

Mybatis书写

单个参数传递时如上述规范3 ,单个参数传递时直接绑定

多个参数使用

@Param(“id”)绑定

数据访问层Dao:

Admin selectAdmins

(@Param(“account”)String account, @Param(“password”)String password);

 关系映射层Mapper

<select id="selectAdmins" resultType="Admin">

select id, account, passwordfrom adminwhere account= #{account} and password=#{password}

</select>

        例如上述如果没有Param Mybatis只知道传过来两个String类型 的参数.但是不知道那个是account那个是password 所以需要@Param进行参数绑定.

 如果传入一个复杂的对象,就需要使用 parameterType 参数进行类型定义,

例如: void insertAdmin(Admin admin);

<insert id="insertAdmin" parameterType="Admin">

insert into admin(id, account, password)values (#{id}, #{account}, #{password})

</insert>

注意此时  Admin类中的属性要和#{} 内的方法属性名称相同

增删改查

<insert id="唯一标识" 
useGeneratedKeys="把新增加的主键赋值到自己定义的keyProperty"keyProperty="接收主键的属性" 
parameterType="参数类型">
insert into
admin(account,password)values(#{account},#{password})
</insert>

解释

useGeneratedKeys="true"

        该属性告诉 MyBatis 启用自动生成的主键(通常是自增主键)。当插入记录时,数据库会自动生成主键,并将主键值返回给 MyBatis 

keyProperty="接收主键的属性"

        keyProperty 指定 Java 对象中用于接收数据库生成主键的属性。MyBatis 会将数据库生成的主键值赋给这个属性。假设你有一个 Admin 对象,主键字段可能是 id,那么 keyProperty 就应为 "id"

场景适用于数据库主键是自增类型

假设你有一个 Admin 类,并且该类有 id, account, password 三个属性。你想插入 accountpassword,并希望数据库自动生成 id,然后把生成的 id 映射回 Admin 对象的 id 属性。 

作用:

举个例子,插入管理员的账号密码获取id映射到admin对象中  就可以用刚刚获取到的id立即进行插入另一张管理员的权限关系表.

修改

<update id="唯一标识" parameterType=“参数类型">
update admin set account= #{account},password= #{password} whereid= #{id}
</update>

删除

<delete id="唯一标识" parameterType="参数类型">
delete from admin where id= #{id}
</delete>

查询

<select id="唯一标识" resultType="返回结果集类型">
select * from admin where id= #{id}
</select>

简单类型输出映射 返回简单基本类型

<select id="findAdminInfoCount" resultType="int">
select count(*) from admin
</select>

对象映射

         如果表中的类名与类中的属性名完全相同,mybatis会自动将查询结果封装到POJO对象中. 如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局设置实现自动转换

<setting name="mapUnderscoreToCamelCase" value="true"/>

对象映射 

<select id="findUserInfoById" parameterType="int"resultType="Admin">
select * from admin where id=#{id}
</select>

#{} 和${}区别

         #{} 占位符,是经过预编译的,编译好 SQL 语句再取值,#方式能够防止sql 注入#{}:

delete from admin where id=#{id} 结果: delete from admin where id = ?

        ${}会将将值以字符串形式拼接到 sql 语句, ${ }方式无法防止Sql 注入${}:

delete from admin where id=’${id}’ 结果: delete from admin where id=’1’

一般是#{ } 向 sql 传值使用, 而使用${ }向 sql 传列名例如在 order by $ {column} 语句后面可以动态替换列名

特殊处理定义 resultMap

定义 resutlMap

<resultMap id="adminResultMap" type="Admin">
<id column="id" property="id"/>
<result property="account" column="account" />
<result property="password" column="password" />
</resultMap><select id="findAdminInfoResultMap" resultMap="adminResultMap">
SELECT id ,account,password FROM admin
</select>

(1)resutlMap 的 id 属性是 resutlMap 的唯一标识,本例中定义为“adminResultMap”

        这些元素是结果映射的基础。id 和 result 元素都将一个列的值映射到一个简单数据类型(String, int, double, Date 等)的属性或字段。这两者之间的唯一不同是,id 元素对应的属性会被标记为对象的标识符,在比较对象实例时使用。 这样可以提高整体的性能,尤其是进行缓存和嵌套结果映射(也就是连接映射)的时候。

(2)resutlMap 的 type 属性是映射的 POJO 类型

(3)id 标签映射主键,result 标签映射非主键

(4)property 设置对象属性名称,column映射查询结果的列名称

 本例的输出映射使用的是 resultMap,而非 resultType

resultMap 引用了 adminResultMap

总结:resultMap解决了java与sql  复杂的映射关系,非标准字段名称、嵌套对象的处理.

多表关联处理结果集

resultMap 元素中 association , collection 元素.

Collection 关联元素处理一对多关联。

• 部门与员工一对多关系

部门一方,配置多方集合

 员工多方,在多方配置一方

 使用 resultMap 组装查询结果(查询部门一方)

查询员工一方

注解:

在dao层直接使用sql语句

 使用案例

动态sql 

特殊符号转换

if 元素

if 标签可以对传入的条件进行判断

思考当没有type=1时,sql语句会是这样

select * from t_emp where;显然是会报错的

还可以通 过where标签解决

<where>元素会进行判断,如果它包含的标签中有返回值的话,它就插入一个‘where’。

此外,如果标签返回的内容是以 AND 或 OR 开头,它会剔除掉AND或OR。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/436499.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系列二、案例实操

一、创建表空间 1.1、概述 在Oracle数据库中&#xff0c;表空间是一个逻辑存储单位&#xff0c;它是Oracle数据库中存储数据的地方。 1.2、超级管理员登录 sqlplus / as sysdba 1.3、创建表空间 create tablespace water_boss datafile C:\Programs\oracle11g\oradata\orcl\…

Spring Cloud Alibaba-(6)Spring Cloud Gateway【网关】

Spring Cloud Alibaba-&#xff08;1&#xff09;搭建项目环境 Spring Cloud Alibaba-&#xff08;2&#xff09;Nacos【服务注册与发现、配置管理】 Spring Cloud Alibaba-&#xff08;3&#xff09;OpenFeign【服务调用】 Spring Cloud Alibaba-&#xff08;4&#xff09;Sen…

华为-IPv6与IPv4网络互通的6to4自动隧道配置实验

IPv4向IPv6的过渡不是一次性的,而是逐步地分层次地。在过渡时期,为了保证IPv4和IPv6能够共存、互通,人们发明了一些IPv4/IPv6的互通技术。 本实验以6to4技术为例,阐述如何配置IPv6过渡技术。 配置参考 R1 # sysname R1 # ipv6# interface GigabitEthernet0/0/1ip address 200…

【C语言指南】数据类型详解(下)——自定义类型

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C语言指南》 期待您的关注 目录 引言 1. 结构体&#xff08;Struct&#xff09; 2. 联合体&#xff08;Union&#xff09; 3…

【网络安全 | 渗透工具】自动化 .env/.git文件检测

原创文章,禁止转载。 文章目录 1. 安装 DotGit2. 配置 DotGit3. 使用 DotGit 检测 .env / .git 文件1. 安装 DotGit 在谷歌应用商店中搜索 DotGit 并进行安装: 2. 配置 DotGit 安装完成后,可以在设置中开启或关闭相关功能: 3. 使用 DotGit 检测 .env / .git 文件 接下来…

centos7安装Redis单机版

一、检查是否有GCC环境 gcc --version # 提示-bash: gcc: 未找到命令 说明没有gcc环境# 安装gcc环境 yum install gcc# 如果yum源报错 # 1.检查网络是否正常 ping www.baidu.com # 2.备份当前的yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo…

Redis篇(Java操作Redis)

目录 讲解一&#xff1a;简介 讲解二&#xff1a;Jedis Github 一、创建项目、 二、添加依赖 三、配置文件 四、Java连接Redis 五、通过Redis连接池获取连接对象并操作服务器 六、封装JedisUtil对外提供连接对象获取方法 七、Java操作Redis五种数据类型 1. 连接与释放…

避免glibc版本而报错,CentOS等Linux安装node.js完美方法

概述 对于Node.js v18.x或更高&#xff0c;Node.js官方默认是在Ubuntu 20.04, Debian 10, RHEL 8,CentOS 8等高版操作系统上编译得到的&#xff0c;高版本操作系统的glibc版本≥2.28。所以&#xff0c;下载Node.js后&#xff0c;也需要glibc版本≥2.28才能使用。 而CentOS 7.x等…

《安富莱嵌入式周报》第343期:雷电USB4开源示波器正式发布,卓越的模拟前端低噪便携示波器,自带100W电源的便携智能烙铁,NASA航空航天锂电池设计

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程 【授人以渔】CMSIS-RTOS V2封装层专题视频&#xff0c;一期视频将常用配置和用法梳理清楚&#xff0…

JMeter对jdbc request以及foreach和loop controller的使用

Jmeter中jdbc request和foreach控制器 1. 使用variable name实现对数据库查询结果的遍历 在foreach controller中&#xff0c;注意要做variable name的关联(correlation), 否则没法取回这里的jdbc request返回的结果。这里的input variable prefix一定要和jdbc request中的var…

【React】react项目中的redux使用

1. store目录结构设计 2. react组件中使用store中的数据——useSelector 3. react组件中修改store中的数据——useDispatch 4. 示例 react-basic\src\store\moduels\counterStore.js import { createSlice } from reduxjs/toolkitconst counterStore createSlice({name: cou…

新书推荐——《深度学习精粹与PyTorch实践》

深度学习绝非不可窥探的黑箱!深入理解其模型和算法的实际运作机制&#xff0c;是驾驭并优化结果的关键。你无需成为数学专家或资深数据科学家,同样能够掌握深度学习系统内部的工作原理。 本书旨在通过深入浅出的方式&#xff0c;为你揭示这些原理&#xff0c;让你在理解和解释…

视频理解新篇章:Mamba模型的探索与应用

人工智能咨询培训老师叶梓 转载标明出处 在计算机视觉领域&#xff0c;视频理解一直是一个核心研究方向&#xff0c;它要求算法能够捕捉视频中的时空动态以定位活动或推断其演变。随着深度学习技术的发展&#xff0c;研究者们探索了多种架构&#xff0c;如递归神经网络(RNN)、…

2024新淘宝镜像地址下载【vue-cli】

需要先安装NodeJS&#xff0c;然后再安装Vue-cli NodeJS下载 nodejs下载&#xff0c;直接搜官网 网址&#xff1a;https://nodejs.org/zh-cn LTS为长期稳定版本&#xff1a; 安装过程 只需要配置一下安装目录&#xff0c;其他都点下一步next 注意安装目录无中文无空格 验证…

【吊打面试官系列-MySQL面试题】为表中得字段选择合适得数据类型

大家好&#xff0c;我是锋哥。今天分享关于【为表中得字段选择合适得数据类型】面试题&#xff0c;希望对大家有帮助&#xff1b; 为表中得字段选择合适得数据类型 字段类型优先级: 整形>date,time>enum,char>varchar>blob,text 优先考虑数字类型&#xff0c;其次是…

微服务sentinel解析部署使用全流程

sentinel源码地址&#xff1a; 介绍 alibaba/Sentinel Wiki GitHub sentinel官方文档&#xff1a; https://sentinelguard.io/zh-cn/docs/introduction.html Sprong Cloud alibaba Sentinel文档【小例子】 : Sentinel alibaba/spring-cloud-alibaba Wiki GitHub 目录 1、…

车辆重识别(改进的去噪扩散概率模型)论文阅读2024/9/29

所谓改进的去噪扩散概率模型主要改进在哪些方面&#xff1a; ①对数似然值的改进 通过对噪声的那个方差和T进行调参&#xff0c;来实现改进。 ②学习 这个参数也就是后验概率的方差。通过数据分析&#xff0c;发现在T非常大的情况下对样本质量几乎没有影响&#xff0c;也就是说…

markdown 中启用音频支持

markdown 中启用音频支持 markdown 默认不支持音频文件&#xff0c;我们通过 html 标签渲染 flask项目 其中音频文件放在 /static/audios/vad_example.wav markdown 内容如下&#xff1a; ## 音频播放器示例 <audio controls ><source src"vad_example.wav…

基于Node.js+Express+MySQL+VUE科研成果网站发布查看科研信息科研成果论文下载免费安装部署

目录 1.技术选型‌ ‌2.功能设计‌ ‌3.系统架构‌ ‌4.开发流程‌ 5.开发背景 6.开发目标 7.技术可行性 8.功能可行性 8.1功能图 8.2 界面设计 8.3 部分代码 构建一个基于Spring Boot、Java Web、J2EE、MySQL数据库以及Vue前后端分离的科研成果网站&#xff0c;可…

新版pycharm如何导入自定义环境

我们新的版本的pycharm的ui更改了&#xff0c;但是我不会导入新的环境了 我们先点击右上角的add interpreter 然后点击添加本地编译器 先导入这个bat文件 再点击load 我们就可以选择我们需要的环境了