javaweb mybatis(手动jar包)

基础: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的键名或者对象的属性名

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

串行口的工作原理及应用

前言 对最近串行口的学习进行一下总结。 参考链接 【51单片机】串口通信 - 知乎 (zhihu.com) LED数码管的静态显示与动态显示&#xff08;KeilProteus&#xff09;_proteus数码管显示-CSDN博客 定时器/计数器的应用-CSDN博客 74ls164_百度百科 (baidu.com) 74ls165中文资…

Kafka 的特点和优势

Apache Kafka 作为一款分布式流处理平台&#xff0c;以其独特的特点和卓越的优势成为实时数据处理领域的瑰宝。本文将深入研究 Kafka 的各项特点和优势&#xff0c;并通过详实的示例代码展示其在不同场景下的强大应用。 高吞吐量和水平扩展 Kafka 的设计注重高吞吐量和水平扩…

使用外部编辑器编辑执行MAXScript代码的方法

如何使用外部编辑器编辑执行MAXScript代码&#xff1f;这里我们要借助一个3dMax插件程序MXSCOM&#xff0c;MXSCOM允许从外部代码编辑器编辑和执行3ds Max MaxScript和Python文件。 2005年&#xff0c;Simon Feltman发布了第一个MXSCOM&#xff0c;这是一个小型的Visual Basic …

【Delphi】实现彩色日志显示框

目录 一、前言 二、实现方法 1. 第一步 2. 第二步 3. 第三步 三、主程序代码 四、下载 1. 可执行程序 2. 程序源代码 一、前言 在用Delphi做日常开发的时候&#xff0c;经常需要显示程序运行的日志&#xff0c;一般我们会使用TMemo&#xff0c;使用起来简单&#xff0c…

根据关键词写作文章的软件,根据标题写作文章的工具

在当今信息化时代&#xff0c;人工智能技术的飞速发展&#xff0c;智能AI写作工具逐渐成为文案创作者的得力助手。这些工具不仅能够根据标题迅速生成文章&#xff0c;而且在提高创作效率的同时&#xff0c;也为我们节省了大量时间和精力。 人工智能的基本原理&#xff1a;人工智…

Python遥感开发之快速判断TIF数据为空

Python遥感开发之快速判断TIF数据为空 前言&#xff1a;介绍一下如何使用python下的gdal读取tif数据的时候&#xff0c;快速判断该tif数据是否为空&#xff0c;如果为空的话就把当前的tif删掉。 如图所示&#xff0c;通过arcgis查看箭头指向的为空值。 仅通过文件的大小无法判…

java 工具类: CompareUtils(比较对象字段值变化)

一、前言 我们在工作中&#xff0c;可能会在日志中记录数据的变化情况或者在公共处理的数据增加一个日志页面&#xff0c;记录每次修改的变化。我们可以根据CompareUtils工具类比较数据前后发生了怎样的变化, 这样我们就可以知道数据做了哪些改变. 二、条件限制 在写这个通用…

【Leetcode题单】(01 数组篇)刷题关键点总结01【数组的遍历】

【Leetcode题单】&#xff08;01 数组篇&#xff09;刷题关键点总结01【数组的遍历】&#xff08;4题&#xff09; Easy数组的遍历485. 最大连续 1 的个数 Easy495. 提莫攻击 Easy414. 第三大的数 Easy628. 三个数的最大乘积 Easy 大家好&#xff0c;这里是新开的LeetCode刷题系…

【数组和函数实战: 斗地主游戏】

目录 1. 玩法说明 2. 分析和设计 3. 代码实现 4. 游戏演示1. 玩法说明 一副54张牌,3最小,两个王最大,其实是2,和上面一样从大到小排列 2. 分析和设计 2.1 分析和设计 常量和变量设计 一副牌有54张,有牌的数值和花色,可以分别用两个数组来存储,card为卡牌表示的数值,color为…

Git 标签管理

前言 标签 tag&#xff0c;就相当于对 某一次的 commit 做一个标识&#xff0c;起了一个别名&#xff0c;例如&#xff1a;在某个项目发布版本的时候&#xff0c;可针对最后一次 commit 起一个别名 v1.0 来标识这一次的commit。tag 的作用&#xff1a;commit id 相对于 tag 是很…

openwrt上开启syslog打印方法

最近在openwrt上调试蓝牙时&#xff0c;出现问题&#xff0c;设备上的蓝牙适配器已经正常工作了&#xff0c;执行pair命令后&#xff0c;openwrt和待连接的设备上都出现了配对码&#xff0c;两边都同意&#xff0c;但连接失败 尝试分析log&#xff0c;发现在如下代码处打印了错…

代码随想录算法训练营 ---第五十二天

第一题&#xff1a; 简介&#xff1a; 动态规划五部曲&#xff1a; 1.确定 dp数组下标的定义 dp[i] 到达 i 时 最长递增子序列的长度 2.确定递推公式 我们确定当前的最大长度需要遍历前面所有的最大长度&#xff0c;然后如果序列最后一个值小于nums[i]那就dp[j] 1&#xf…

Redis--13--缓存一致性问题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 缓存一致性问题1、先更新缓存&#xff0c;再更新DB方案二&#xff1a;先更新DB&#xff0c;再更新缓存方案三&#xff1a;先删缓存&#xff0c;再写数据库推荐1&…

Elk-filebeat

前言 Elk&#xff1a;filebeat搜集日志工具和logstash相同 Filebeat是一个轻量级的日志收集工具&#xff0c;所使用的资源比logstash部署和启动时使用的资源更小 Filebeat可以运行在非Java环境&#xff0c;他可以代理logstash在非Java环境上收集日志 Filebeat无法实现数据的…

【选择题】校招笔试选择题第一辑

题目 以下程序的运行结果是&#xff08; &#xff09; #include <stdio.h> int main(void) {printf("%s , %5.3s\n", "computer", "computer");return 0; }A. computer , puter B. computer , com C. computer , computer D. computer…

zookeeper+kafka+ELK+filebeat集群

目录 一、zookeeper概述&#xff1a; 1、zookeeper工作机制&#xff1a; 2、zookeeper主要作用&#xff1a; 3、zookeeper特性&#xff1a; 4、zookeeper的应用场景&#xff1a; 5、领导者和追随者&#xff1a;zookeeper的选举机制 二、zookeeper安装部署&#xff1a; 三…

STM32-SPI 中断

SPI协议 1.1 SPI总线介绍 SPI接口是Motorola &#xff08;motorola | Smartphones, Accessories & Smart Home Devices&#xff09;首先提出的全双工三线/四线同步串行外围接口采用主从模式&#xff08;Master Slave&#xff09;架构。 时钟由Master控制&#xff0c;在时钟…

【Leetcode题单】(01 数组篇)刷题关键点总结02【统计数组中的元素】

【Leetcode题单】&#xff08;01 数组篇&#xff09;刷题关键点总结02【统计数组中的元素】&#xff08;6题&#xff09; 统计数组中的元素645. 错误的集合 Easy697. 数组的度 Easy448. 找到所有数组中消失的数字 Easy442. 数组中重复的数据 Medium41. 缺失的第一个正数 Hard27…

Docker镜像制作与推送

目录 Docker镜像制作 搭建私服 将本地镜像推送到私有库 Docker镜像制作 以创建一个新ubuntu镜像&#xff0c;并安装vim命令示例 运行一个ubuntu镜像&#xff0c;发现在镜像里面无法使用vim命令&#xff0c;因为该ubuntu镜像只包括了其最基本的内核命令 [rootlocalhost ~]…

找不到msvcp110.dll如何修复?分享5个亲测有效的修复方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp110.dll丢失”。这个错误通常发生在运行某些程序时&#xff0c;系统无法找到所需的动态链接库文件。那么&#xff0c;msvcp110.dll到底是什么呢&#xff1f;它又有什么作用&#xff1…