javaweb mybatis(手动jar包)

news2025/1/18 10:07:21

基础:https://blog.csdn.net/qq_67832732/article/details/134764134

条件查询

在映射文件的SQL配置中配置参数

使用parameterType来指定参数类型

使用#{参数名}来接收参数的值 

parameterType="string" 表示sql语句需要一个参数,类型为字符串

username=#{xxx}表示用户名的值是来自一个变量xxx,这个变量值直接从java代码中传入,变量名可以任意命名,因为只有一个变量,会自动识别传过来的参数

 parameterType: 表示查询语句传入参数的类型。

支持基础数据类型复杂数据类型 如果SQL是单条件查询,则parameterType指定为基础数据类型

单条件查询

练习:在数据库的user表中,新增两个字段 性别( sex ),整型,1代表男性,0代表女性,非空 出生日期( birthDate ),date类型

使用MyBatis查询user表中所有的女性用户并输出 使用MyBatis查询user表中在1996年出生的用户并输出 

1、创建user实体类

package entity;

import java.util.Date;

public class User {

    private String username;
    private String password;
    private Integer age;
    private String sex;
    private String birthDate;

    public User() {
    }

    public User(String username, String password, Integer age, String sex, String birthDate) {
        this.username = username;
        this.password = password;
        this.age = age;
        this.sex = sex;
        this.birthDate = birthDate;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(String birthDate) {
        this.birthDate = birthDate;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", birthDate=" + birthDate +
                '}';
    }
}

 2、创建数据库连接

 3、创建sql映射

4、创建测试方法

 

多条件查询 

在数据库中,查询用户信息表user中性别为“女性”,“1996”年出生的记录并输出

该例是一个多条件查询,需要向SQL配置中传入两个参数。 如果SQL是单条件查询,则parameterType指定为基础数据类型 如果是多条件查询,则parameterType指定为复杂数据类型。

多条件查询时,parameterType的参数类型可以为如下两种:

使用Java自定义实体类

 parameterType指定为自定义实体类” UserCnd”

#{sex}表示性别条件的值取自实体类对象中sex属性的值

#{birthYear}表示出生年份条件的值取自实体类对象中birthYear属性的值

使用map或者hashmap 

 总结

resultType属性

查询结果映射是指MyBatis自动将SQL语句查询出来的结果映射到指定的对象中。

 MyBatis通过resultType属性来实现查询结果的自动映射

resultType的值可以指定为两种类型:

基本数据类型(int、string、long等等) 复杂数据类型(Java实体类、map/hashmap)

自定义查询结果映射 

实体类”entity.User”中的属性名和SQL查询结果列名不一致,无法完成数据自动映射

解决方案1:定义别名 为SQL查询出的字段定义别名,

”强制”与”entity.User”中的属性名保持一致,以满足自动映射的要求

解决方案2:使用resultMap自定义映射关系

(1)在映射文件”UserMapper.xml”中,加入<resultMap>标签:

 

(2)在映射文件”UserMapper.xml”中,将select配置的resultType属性修改为resultMap,并指定值为”userMap”

 

<select>节点中使用resultMap属性来指定需要使用的自定义映射关系,resultMap不能和resultType同时使用

数据新增

 使用MyBatis框架在用户信息表user中插入一条记录

因为是insert语句,因此加入一个<insert>标签

insert语句需要传递5个参数,因此parameterType=”entity.User”

#{uname}表示用户名的值取自参数对象的uname属性

#{upass}表示密码的值取自参数对象的upass属性

对于增删改操作默认resultType=”int”,代表数据操作匹配的行数,因此不需要定义resultType属性

 提交事务

如果执行测试方法,数据库中并未成功插入一条数据 

这里就涉及到mybatis的事务,对于增删改操作,默认不会自动提交到数据库执行

方案一

手动提交,需要在insert操作后加入如下代码完成手动提交:     sqlSession.commit();

方案二 

自动提交,需要将sqlSession设置为自动提交事务,

数据修改

 

因为是update语句,因此加入一个<update>标签

update语句需要传递3个参数,因此parameterType=”map”

#{XXX}里的参数名必须要和map对象里键的名称一一对应 

使用接口来完成Mybatis数据操作 

第一步:在src下新建一个包,命名为”dao”。在包下新建一个接口,命名为”UserDao”

第二步:在”UserDao”中定义接口方法

接口方法定义规则如下:

必须保持与相应的SQL配置参数一致

方法名与id一致 方法参数与parameterType指定类型一致

方法返回值与resultType/resultMap指定映射类型一致

第三步:修改SQL映射文件”UserMapper.xml”,将其与接口”UserDao”关联,通过namespace属性关联

第四步:在测试类中加入测试方法”testDao”,通过接口来执行SQL

 测试类 

关联查询 

数据库里有学生表(student)和学生证信息表(student_card)

要求用mybatis框架查询所有的学生信息以及每位学生的学生证信息

需求涉及两张表,因此需要使用多表连接查询

原始方法

方案一:关联查询实现步骤

(1)创建实体 在“entity”包下新建学生(Student)实体类和学生证(StudentCard)实体类 因为两个实体类是1对1的关系,所以在Student中增加一个StudentCard类型的属性 设计如下

 

(2)在SQL映射文件”StudentMapper.xml”中加入SQL配置如下 

 说明

id标签是定义数据库主键与实体中简单数据类型属性的映射关系

result标签是定义非主键字段与实体中简单数据类型属性的映射关系

association标签用于定义实体类型属性的映射关系。

在<association>标签中,property= ”studentCard” 指定复杂数据类型属性的名称。

javaType =”entity.StudentCard”表明该属性的类型

<association>标签内部的<id>、<result>标签用于指定查询结果列和StudentCard类型中每一个属性的映射关系

(3)在”dao”包下新建接口”StudentDao”以及接口方法

接口需要与”StudentMapper.xml”通过namespace属性关联 

 (4)新建测试类”SelectTest”,并加入测试方法    

方案二:嵌套查询实现 

1、执行主查询:select * from student,获取所有学生

2、遍历主查询的结果,执行子查询:select * from student_card where stu_id=?

具体操作

(1)在SQL映射文件”StudentMapper.xml”中配置子查询SQL: select * from student_card where stu_id=?

(2)在SQL映射文件”StudentMapper.xml”中配置主查询SQL:select * from student

 关联查询【1对多】

数据库里有顾客表(customer)和订单表(orders)

要求用mybatis框架查询所有的顾客信息以及每位顾客的订单信息 

题目需求涉及两张表,因此需要使用多表连接查询 分析表与表之间的关系以及如何关联的 cutomer表与orders表是1对多的关系,通过cutomer.id和orders.customer_id进行关联

select c.*,o.*     from customer c     left join orders o     on c.id=o.customer_id

方案一:关联查询实现步骤

(1)创建实体 在“entity”包下新建顾客(Customer)实体类和订单(Order)实体类 因为两个实体类是1对多的关系,所以在Customer中增加一个Order类型的列表属性 设计如下

 2)新建SQL映射文件”CustomerMapper.xml”中加入SQL配置如下

id标签是定义数据库主键与实体中简单数据类型属性的映射关系

result标签是定义非主键字段与实体中简单数据类型属性的映射关系

collection标签用于定义集合类型属性的映射关系。

在<collection>标签中,property= ”orders” 指定集合数据类型属性的名称。 javaType =”ArrayList”表明该属性的类型为集合。ofType=”entity.Order”表明集合中存放的数据类型。

< collection >标签内部的<id>、<result>标签用于指定查询结果列和Order类型中每一个属性的映射关系。 

3)在”dao”包下新建接口”CustomerDao”以及接口方法

接口需要与”CustomerMapper.xml”通过namespace属性关联 

4)新建测试类”SelectTest”,并加入测试方法 

resultMap标签使用总结

resultMap标签用于自定义查询结果映射关系

子节点id和result仅用于指定基础数据类型属性的映射关系

子节点id用于指定主键属性result用于指定其他属性

子节点<association>标签用于处理实体类型属性的映射关系,体现实体间1对1的关系

子节点<collection>用于处理集合类型属性的映射关系,体现实体间1对多或者多对多的关系 

关联查询【多对多】

数据库里有学生表(student)、课程表(course)以及一个中间表(student_course),

题目需求涉及三张表,因此需要使用多表连接查询

student表与course表是多对多的关系,通过中间表来进行关联 select c.*,stu.*  from course c     left join student_course sc  on c.course_id=sc.course_id left join student stu on stu.stu_id=sc.stu_id

多对多的关联通过使用中间表可以转化为两个一对多的关系,因此解决多对多的查询配置和一对多是一样的 

mybatis动态sql

动态SQL是MyBatis的一个强大特性 可以运用动态SQL语句标签方便我们在SQL中实现各种逻辑

常用标签如下: <if>:条件选择

<choose>:相当于Java中的switch,用于条件选择

<where>:简化SQL中的where

<set>:解决动态更新语句

<trim>:灵活的去除多余的关键字

<foreach>:迭代遍历一个集合

具体介绍

where标签

where 标签的作用:去除多余的 where

       当使用 if 标签进行动态 SQL 拼接时,如果 if 标签的判断条件不满足的话,便不拼接 if 标签中的内容,这便导致了 SQL 语句的 where 子句缺失,造成 SQL 错误。
       使用 where 标签便可以解决上述问题,使用 where 标签将 if 标签包裹起来,当 if 标签的判断条件不满足,动态 SQL 不拼接时,便不会向 SQL 语句中插入 where 子句,从而避免该错误。

<where>标签能够智能的处理where、and、or,不必担心关键字导致的语法错误。

习惯上在<where>标签中的每一个条件前都加一个and或or

choose标签

choose 标签的作用:去除多余条件

       在使用 if 标签编写需要判断的条件时,如果表达式内容的判断结果为 true 那么条件就满足。当有多个条件满足,并且实际业务并不需要这么多的条件或者只需要一个条件时便可以使用此标签去除条件。

       choose 标签是按顺序判断其内部 when 标签中的 test 条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的 sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。


set标签

set 标签的作用:去除多余逗号

       当我们去编写动态修改 SQL 语句时,会使用 if 标签去动态拼接修改的内容,并且动态拼接的修改条件通常都会有 “,” 的存在,但是因为是动态拼接无法保证那一条拼接的修改条件是最后一条,这就导致了拼接完成后可能存在多余的 “,” ,造成 SQL 错误。
       使用 set 标签将这些动态拼接修改的内容的 if 标签包裹起来,便可以去除多余的 “,” 。

 使用set标签与if标签组合,可以智能增减要修改的字段,并智能判断逗号是否有必要存在

 trim标签 

trim标签:可用于拼接动态SQL语句

该标签有以下属性:

prefix:前缀

suffix:后缀

prefixOverrides:前缀覆盖,可用于智能的处理”and”,”or”关键字

suffixOverrides:后缀覆盖,可用于处理update语句中中多余的”,”

作用:可以利用trim来代替<where>或者<set>的功能

 将

替换

foreach标签 

foreach标签的属性主要有 item,index,collection,open,separator,close。

item表示对集合进行迭代时每一个对象的别名

index指定一个名字,用于表示在迭代过程中,每次迭代的位置

open是前缀,表示该语句以什么开始

separator表示在每次迭代元素之间以什么符号作为分隔符

close是后缀,表示以什么结束

collection指定需要遍历的集合

例如在StudentMapper.xml中新增SQL配置

(1)如果是单参数且参数类型是集合时,collection的值为list

(2) 如果是单参数且参数类型是数组时,collection的值为array          

(3) 如果是多参数且参数类型是map或者实体类对象时,collection的值为对应map的键名或者对象的属性名

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算UDP报文CRC校验的总结

概述 因公司项目需求&#xff0c;遇到需要发送带UDP/IP头数据包的功能&#xff0c;经过多次尝试顺利完成&#xff0c;博文记录以备忘。 环境信息 操作系统 ARM64平台的中标麒麟Kylin V10 工具 tcpdump、wireshark、vscode 原理 请查看大佬的博文 UDP伪包头定义&#x…

2023年【G1工业锅炉司炉】考试试题及G1工业锅炉司炉模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【G1工业锅炉司炉】考试试题及G1工业锅炉司炉模拟考试题库&#xff0c;包含G1工业锅炉司炉考试试题答案和解析及G1工业锅炉司炉模拟考试题库练习。安全生产模拟考试一点通结合国家G1工业锅炉司炉考试最新大纲及…

【开源】基于Vue和SpringBoot的校园二手交易系统

项目编号&#xff1a; S 009 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S009&#xff0c;文末获取源码。} 项目编号&#xff1a;S009&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 二手商品档案管理模…

Docker容器(一)概述

一、虚拟化概述 1.1引⼊虚拟化技术的必要性 服务器只有5%的时间是在⼯作的&#xff1b;在其它时间服务器都处于“休眠”状态. 虚拟化前 每台主机⼀个操作系统; 软硬件紧密结合; 在同⼀个主机上运⾏多个应⽤程序通常会遭遇冲突; 系统的资源利⽤率低; 硬件成本⾼昂⽽且不够灵活…

TIA西门子博途V19安装教程及注意事项

TIA西门子博途V19安装教程及注意事项 前提条件: TIA Portal V19需要.Net Framework 3.5环境,所以在安装TIA V19之前要先安装它。 如下图所示,否则可能会提示报错信息: 大家可以在控制面板中的程序和功能中检查是否已经安装,如果没有,可以参考以下步骤自行安装:

OpenWrt作为旁路由(网关)配置

目录 背景前提条件环境操作步骤物理层连接设置与主路由同一网段禁用IPv6取消LAN接口桥接防火墙配置 背景 本文简介如何配置OpenWrt&#xff0c;使其作为旁路由&#xff08;网关&#xff09;运行。 旁路由大概有以下这几种工作方式&#xff1a; 主路由开DHCP&#xff0c;网关未…

十、FreeRTOS之FreeRTOS任务调度

本节需要掌握的内容如下&#xff1a; 1&#xff0c;开启任务调度器&#xff08;熟悉&#xff09; 2&#xff0c;启动第一个任务&#xff08;熟悉&#xff09; 3&#xff0c;任务切换&#xff08;掌握&#xff09; 一&#xff0c;开启任务调度器&#xff08;熟悉&#xff09…

java高校实验室排课学生考勤系统springboot+vue

随着各高校办学规模的迅速扩大,学科专业的不断拓宽,传统的实验教学和实验室管理方法已经不能适应学校管理的要求,特别是化学实验室的管理,化学实验室仪器药品繁杂多样,管理任务繁重,目前主要使用人工记录方法管理,使用不便,效率低下,而且容易疏漏.时间一长将产生大量的文件和数…

【C++】异常处理 ⑦ ( 异常类的继承层次结构 | 抛出 / 捕获 多个类型异常对象 | 抛出子类异常对象 / 捕获并处理 父类异常对象 )

文章目录 一、抛出 / 捕获 多个类型异常对象1、抛出 / 捕获 多个类型异常对象2、操作弊端3、完整代码示例 二、异常类的继承层次结构1、抛出子类异常对象 / 捕获并处理 父类异常对象2、完整代码示例 - 抛出子类异常对象 / 捕获并处理 父类异常对象 自定义的 异常类 , 可能存在 …

Java数据结构 之 包装类简单认识泛类

生命不息&#xff0c;奋斗不止 目录 1. 什么是包装类&#xff1f; 1.1 装箱和拆箱 1.2 自动装箱和自动拆箱 2. 什么是泛型 3. 引出泛型 3.1 语法 4 泛型类的使用 4.1 语法 4.2 示例 4.3 类型推导(Type Inference) 5. 裸类型(Raw Type) &#xff08;了解&#xff09…

〖大前端 - 基础入门三大核心之JS篇㊻〗- JS + CSS实现动画

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

JSP格式化标签 parseDate将指定时间格式字符串转为真正的date对象

格式化标签最后一个就是 parseDate 作用 将一个日期/时间格式字符串 转为 真正的date时间类型 有点无语 这种 东西应该都是在java中去做的 而不是在java中 这个建议也是做个了解即可 作用不是那么大 基本语法如下 这里 我们 直接编写代码如下 <% page contentType"…

智能优化算法应用:基于天牛须算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于天牛须算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于天牛须算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.天牛须算法4.实验参数设定5.算法结果6.参考文献7.…

2024年AMC8美国初中数学竞赛最后一个月复习指南(附资料)

还有一个半月的时间&#xff0c;2024年AMC8&#xff08;大家默认都直接叫这个比赛的英文名&#xff0c;而不叫中文名美国数学竞赛或美国初中数学竞赛了&#xff09;就要开始了。 有志于在2024年AMC8的比赛中拿到奖项的孩子已经在“磨拳霍霍”了。那么最后一个半月的时间该如何…

智能优化算法应用:基于热交换算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于热交换算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于热交换算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.热交换算法4.实验参数设定5.算法结果6.参考文献7.…

Java线程池的使用和最佳实践

第1章&#xff1a;引言 处理并发问题时&#xff0c;如果每次都新建线程&#xff0c;那系统的压力得有多大&#xff1f;这时候&#xff0c;线程池就像一个英雄一样出现了&#xff0c;它帮我们有效地管理线程&#xff0c;提高资源利用率&#xff0c;降低开销。那么&#xff0c;为…

还搞不懂什么是参数,超参数吗?三分钟快速了解参数与超参数的概念和区别!!!

文章目录 前言一、参数是什么&#xff1f;二、超参数是什么三&#xff0c;常使用的超参数有哪些 前言 参数是模型中可被学习和调整的参数&#xff0c;通过训练数据进行学习和优化&#xff1b; 而超参数则是手动设置的参数&#xff0c;用于控制模型的行为和性能&#xff0c;超…

探秘Python FastAPI、Sanic、Tornado 与Golang Gin性能之战!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python和Golang作为两种流行的编程语言&#xff0c;都拥有强大的异步框架&#xff0c;为开发者提供了在构建高性能应用时的选择。在Python阵营中&#xff0c;FastAPI、Sanic、Tornado等框架因其异步特性和高效的…

viple模拟器使用(四):unity模拟器中实现两距离局部最优迷宫算法

名字解读 两距离&#xff1a;指的是左侧距离和右侧距离 局部最优&#xff1a;对当前状态来说最好的选择&#xff0c;至于整体能不能达到最优&#xff0c;是无法确定的。 从节点1到节点5&#xff0c;一共有3条路 第1条路线&#xff1a;1→2→4→5&#xff0c;对应的花销是&…

LeetCode刷题---反转链表

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏&#xff1a;http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#xff0c;所以下面题目主要也是这些算法做的 我讲述…