当前位置: 首页 > news >正文

Mybatis的综合案例-学生信息查询系统 用于校验是否真正学习掌握了动态SQL

Mybatis的综合案例-学生信息查询系统

需求一:当用户输入的学生姓名不为空,则只根据学生信息进行查询;
当用户输入的学生姓名为空,且专业不为空,那么就根据学生专业进行学生的查询

需求二:查询所有id值小于5的学生信息


1.搭建项目环境:

​ 往pom中写入依赖引入,引入我们所需要的各个架包:Mybatis3.5.2、Mysql8.0、Junit4.12、log4j1.2.17、(若是无法使用maven方式导入的话,我会带上项目需要的所有离线jar架包,可以自行导入到自己项目的lib下进行安装)

<!--pom.xml--><dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.11</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><!--   	        <scope>test</scope>--><scope>compile</scope></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency></dependencies><build><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource></resources></build>

2.数据库准备

​ 我们这次的项目是学生信息查询系统,因此我们需要准备名为:studentinfoselectsystem的数据库(也可缩写为studentiss,命名规则:项目名称要全小写),其中的表为:dm_student

​ SQL语句如下(若是不能使用,也可以在文章头下载数据库文件sql):

Create table dm_student(
id int(32) PRIMARY KEY AUTO_INCREMENT,
name varchar(50),
major varchar(50),
sno varchar(16)
);insert into dm_student VALUES('1','Stevedash','数学','100');
insert into dm_student VALUES('2','Steve','语文','100');
insert into dm_student VALUES('3','Kdash','英语','100');
insert into dm_student VALUES('4','wgd','数学','80');
insert into dm_student VALUES('5','dxm','语文','90');
insert into dm_student VALUES('6','god','英语','60');

3.配置文件准备

​ 准备好所有的配置文件:mybatis-config.xml(mybatis的核心配置文件)、db.properties(jdbc链接数据库配置文件)、log4j.propertie(log4j日志导出配置文件)

在这里插入图片描述

具体代码如下:

mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 环境配置 --><!-- 加载类路径下的属性文件 --><properties resource="db.properties"/><!-- 设置别名为pojo--><typeAliases><package name="pojo"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><!-- 数据库连接相关配置 ,db.properties文件中的内容--><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><!-- mapping文件路径配置 --><mappers><mapper resource="mapper/StudentMapper.xml"/></mappers>
</configuration>
db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/studentinfoselectsystem?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
username=root
password=root
log4j.propertie
###\u6839logger\u8BBE\u7F6E###
log4j.rootLogger = debug,console,file### 
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.Threshold = DEBUG 
log4j.logger.java.sql.Statement=debug 
log4j.appender.console.layout.ConversionPattern = [%p] %d %c - %m%n###
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender
###
log4j.appender.file.File = D:/log/web.log
log4j.appender.file.Append = true
log4j.appender.file.Threshold = warn 
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = [%p] %d %c - %m%n

4.编写pojo类

​ pojo(普通java对象),创建出持久化类Student与数据库dm_student进行映射关联,要在类中声明好变量和数据库表中的字段一一对应,并且生成getter和setter方法。

Student.java具体代码如下:
package pojo;public class Student {private int id;//对应数据库字段idprivate String name;//姓名 对应数据库字段nameprivate String major;//专业 对应数据库字段majorprivate String sno;学号 对应数据库字段sno//生成getter和setter方法public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getMajor() {return major;}public void setMajor(String major) {this.major = major;}public String getSno() {return sno;}public void setSno(String sno) {this.sno = sno;}/*重写toString()方法,让其变成输出我们想要的信息,方便我们检查测试功能需求是否满足*/@Overridepublic String toString(){return "Student{"+"id="+id+",name="+name+",major="+major+",sno="+sno+"}";}
}

5.编写StudentMapper.xml

​ 在resources新建一个package:mapper,在mapper 包下新建一个StudentMapper.xml。

①StudentMapper.xml具体代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="mapper.StudentMapper"><select id="selectStudentByNameOrMajor" parameterType="Student" resultType="Student">select * from dm_student where 1=1<choose><when test="name!=null and name!=''">and name=#{name}</when><when test="major!=null and major!=''">and major=#{major}</when><otherwise>and  sno is not null</otherwise></choose></select><select id="selectAllIdSmallThanNumber" parameterType="int" resultType="Student">SELECT * FROM dm_student WHERE id IN<foreach item="id" collection="list" open="(" separator="," close=")">#{id}</foreach></select><insert id="addStudent" parameterType="Student">insert into dm_student(id,name,marjor,sno) values(#{id},#{name},#{marjor},#{sno})</insert><delete id="deleteStudent" parameterType="Student">delete from dm_student where id = #{id}</delete><select id="getStudentByList" resultType="Student">select * from dm_student where id in<foreach collection="list" item="id" open="(" separator="," close=")">#{id}</foreach></select><select id="selectByIdLessThan" parameterType="int" resultType="Student">SELECT * FROM dm_student WHERE id &lt; #{id}</select></mapper>
②编写测试类StudentTest.java
package Test;import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.jupiter.api.Test;
import pojo.Student;
import utils.MyBatisUtil;import java.util.ArrayList;
import java.util.List;class StudentTest {private Logger logger= Logger.getLogger(StudentTest.class);/*当用户输入的学生姓名不为空,则只根据学生信息进行查询;当用户输入的学生姓名为空,且专业不为空,那么就根据学生专业进行学生的查询*/@Testvoid selectByNameOrMajor() {SqlSession session= MyBatisUtil.createSqlSession();Student student=new Student();//student.setName("SteveDash");//student.setMajor("数学");List<Student> list=session.selectList("selectStudentByNameOrMajor",student);for (Student student1:list){logger.info(student1.toString());}}/*查询所有id值小于5的学生信息*/@Testvoid selectAllIdSmallThanNumber() {SqlSession session= MyBatisUtil.createSqlSession();List<Integer> intList=new ArrayList<Integer>();for(int i=1;i<5;i++){intList.add(i);}List<Student> list=session.selectList("selectAllIdSmallThanNumber",intList);for (Student student1:list){logger.info(student1.toString());}}/*查询所有id值小于number的学生信息*/@Testvoid selectAllIdNumber() {SqlSession session= MyBatisUtil.createSqlSession();List<Student> list=session.selectList("selectByIdLessThan",5);for (Student student1:list){logger.info(student1.toString());}}
}

反思:需求二是不是可以更改成自己想输入那个数字就输入哪个数字去查询小于该数字的学生信息?

那么最简单的编写SQl语句就是这个了吧?

在这里插入图片描述

但是你会发现,不可以 <报错了,是因为它识别不出来,所以我们得用其他字符来替代

<select id="selectByIdLessThan" parameterType="int" resultType="Student">SELECT * FROM dm_student WHERE id &lt; #{id}</select>

解释一下这串代码:

  1. <select> 元素:这是 MyBatis 中用于定义查询语句的标签。通过 id 属性指定查询语句的唯一标识符,parameterType 属性指定查询语句的输入参数类型,resultType 属性指定查询结果的返回类型。
  2. id 属性:指定查询语句的唯一标识符,可以在 Java 代码中通过这个标识符来调用对应的查询语句。
  3. parameterType 属性:指定查询语句的输入参数类型,我们指定为 int,表示我们将传入一个 int 类型的参数。
  4. resultType 属性:指定查询结果的返回类型,我们指定为 Student,表示查询结果将被映射为 Student 类型的对象。
  5. SQL 查询语句:SELECT * FROM dm_student WHERE id < #{id}。这是实际的 SQL 查询语句。其中,SELECT * FROM dm_student 表示从名为 dm_student 的表中查询所有列的数据。WHERE id < #{id} 表示筛选条件,只查询满足 id 小于传入的参数的记录
  6. &lt;:这是 HTML 实体编码,表示小于符号 <。在 XML 中,< 有特殊的含义,因此需要使用实体编码表示。
  7. #{id}:这是 MyBatis 的参数占位符,会在查询执行时被实际的参数值替代。在这个例子中,#{id} 表示传入的 int 类型的参数值。

作者:Stevedash

发表于:2023年8月23日 16点28分

注:本文内容基于个人学习理解,如有错误或疏漏,欢迎指正。感谢阅读!如果觉得有帮助,请点赞和分享。

相关文章:

Mybatis的综合案例-学生信息查询系统 用于校验是否真正学习掌握了动态SQL

Mybatis的综合案例-学生信息查询系统 需求一&#xff1a;当用户输入的学生姓名不为空&#xff0c;则只根据学生信息进行查询; 当用户输入的学生姓名为空&#xff0c;且专业不为空&#xff0c;那么就根据学生专业进行学生的查询 需求二&#xff1a;查询所有id值小于5的学生信息…...

力扣:70. 爬楼梯(Python3)

题目&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客…...

陕西广电 HG6341C FiberHome烽火 光猫获取超级密码 改桥接模式 提升网速

光猫默认的路由模式实测在100M宽带下只能跑到60M左右&#xff0c;只有改成桥接模式才能跑满&#xff0c;不损失性能。但是改桥接需要给运营商打电话&#xff0c;有的时候不想麻烦他们&#xff0c;这时获取超级密码进行更改就是一个不错的选择了 分析 之前写了一篇HGU B2 光猫的…...

无涯教程-PHP - 移除的扩展

以下扩展已从PHP 7开始删除- eregmssqlmysqlsybase_ct 以下SAPI已从PHP 7开始删除- aolserverapacheapache_hooksapache2filtercaudiumcontinuityisapimilternsapiphttpdpi3webroxenthttpdtuxwebjames PHP - 移除的扩展 - 无涯教程网无涯教程网提供以下扩展已从PHP 7开始删除…...

笔记:transformer系列

1、和其他网络的比较 自注意力机制适合处理长文本&#xff0c;并行度好&#xff0c;在GPU上&#xff0c;CNN和Self-attention性能差不多&#xff0c;在TPU&#xff08;Tensor Processing Uni&#xff09;效果更好。 总结&#xff1a; 自注意力池化层将当做key,value,query来…...

Mysql socket连接测试

配置如下&#xff1a; socket /data/mysql/data/mysql.sock //套接字文件 在数据库没有任何连接的情况下&#xff0c;可以看到3306端口和socket端口都在监听 [mysqlt3-dtpoc-dtpoc-web04 bin]$ netstat -an | grep -i 3306 tcp 0 0 0.0.0.0:3306 0.…...

探究分布式操作系统的本质

探究分布式操作系统的本质 有一位网友问&#xff0c;分布式操作系统的本质是什么&#xff0c;今天就来说说这个话题。 首先&#xff0c;我们需要明确什么是分布式操作系统。 从大范围来理解&#xff0c;分布式操作系统是传统单机操作系统的延伸&#xff0c;可以看作是在多台独…...

opencv-dnn

# utils_words.txt 标签文件 import osimage_types (".jpg", ".jpeg", ".png", ".bmp", ".tif", ".tiff")def list_images(basePath, containsNone):# return the set of files that are validreturn list_file…...

如何选择合适的开源许可证?

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

【前端】深入解析CSS:选择器、显示模式、背景属性和特征剖析

目录 一、前言二、CSS的复合选择器1、后代选择器①、语法②、注意事项 2、子选择器①、语法②、注意事项 3、并集选择器①、语法②、注意事项 4、链接伪类选择器①、语法②、注意事项 三、CSS元素显示模式转换1、转换为块元素display:block2、转换为行内元素display:inline3、转…...

算法训练营第三十四天(8.23)| 动态规划Part04:01背包

目录 Leecode 1049.最后一块石头的重量II Leecode 494.目标和 Leecode 474.一和零 Leecode 1049.最后一块石头的重量II 题目地址&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目类型&#xff1a;01背包 class Solution { public:int…...

【python】tkinter使用多进程打包成exe后multiprocessing无法关闭对应进程

这是由于multiprocessing模块在Windows操作系统下使用fork方法创建子进程时会导致打包成exe后无法正常运行的问题。 可以尝试使用freeze_support函数来解决这个问题。freeze_support函数是在Windows操作系统下用于支持multiprocessing模块的函数。 下面是一个示例代码&#x…...

Redis工具类(缓存操作,Object转换成JSON数据)

依赖spring-data-redis-2.4.1.jar Component Data public class RedisUtils {Autowiredprivate RedisTemplate<String, Object> redisTemplate;Resource(name "stringRedisTemplate")private ValueOperations<String, String> valueOperations;/*** 默…...

Linux 下 Java Socket 编程报 java.net.Exception:Permission denied (权限不足)

本人用Linux部署springboot项目时遇见这个错误&#xff0c;原因很简单&#xff0c;就是端口号没有选对。 在linux系统中&#xff0c;端口号再1024以下的需要root权限&#xff0c;只要把端口改成大于1024的就可以了&#xff0c;但避开一些软件的默认端口&#xff0c;如Tomcat的8…...

IDEA项目实践——VUE介绍与案例分析

系列文章目录 IDEA项目实践——JavaWeb简介以及Servlet编程实战 IDEA项目实践——Spring集成mybatis、spring当中的事务 IDEA项目实践——Spring当中的切面AOP IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——Spring框架简介&#xff0c;以及IOC注解 I…...

vue-canvas基本使用和注意事项-动画闪烁效果-自适应适配不同分辨率问题

前言 canvas画布是html的新特性&#xff0c;熟悉画布我们可以完成很多拖拽&#xff0c;标注&#xff0c;动画的功能 使用canvas实现一个小例子很容易&#xff0c;但是真正在项目中使用时&#xff0c;我们需要注意的地方有很多 canvas基本原理就是它基于渲染方法&#xff0c;根…...

Jmeter 如何才能做好接口测试?

现在对测试人员的要求越来越高&#xff0c;不仅仅要做好功能测试&#xff0c;对接口测试的需求也越来越多&#xff01; 所以也越来越多的同学问&#xff0c;怎样才能做好接口测试&#xff1f; 要真正的做好接口测试&#xff0c;并且弄懂如何测试接口&#xff0c;需要从如下几…...

电商平台京东平台获得京东商品描述API接口演示案例

京东商品描述API接口可以获取京东商品描述&#xff1a; 详细介绍商品的特点和功能,让消费者能够了解商品的具体用途和效果。 使用简洁明了的语言,避免使用过于专业的术语和长句子,让消费者能够轻松理解。 重点突出商品的卖点和优势,让消费者能够更加清晰地了解商品的价值 …...

《算法竞赛·快冲300题》每日一题:“单位转换”

《算法竞赛快冲300题》将于2024年出版&#xff0c;是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码&#xff0c;以中低档题为主&#xff0c;适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 单…...

R语言13-R语言中的数据导入导出和批量导入

数据导入 CSV 文件&#xff1a; 使用 read.csv() 函数导入逗号分隔的文本文件。 data <- read.csv("data.csv")Excel 文件&#xff1a; 使用 readxl 包中的函数 read_excel() 导入 Excel 文件。 install.packages("readxl") # 安装 readxl 包&#…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...