Spring学习笔记(六)利用Spring的jdbc实现学生管理系统的用户登录功能

一、案例分析

本案例要求学生在控制台输入用户名密码,如果用户账号密码正确则显示用户所属班级,如果登录失败则显示登录失败。

(1)为了存储学生信息,需要创建一个数据库。

(2)为了程序连接数据库并完成对数据的增删改查操作,需要在XML配置文件中配置数据库连接和事务等信息。

(3)在Dao层实现查询用户信息的方法。

(4)在Controller层处理业务逻辑,如判断用户输入的用户名与密码是否正确 。

二、实现步骤

首先利用idea创建Maven项目,在pom.xml中进行如下配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>Springjdbc</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies>
<!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.27</version></dependency><!--            Spring的基本包 ioc相关--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.26</version></dependency>
<!--        jdbc相关--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.26</version></dependency>
<!--        spring事务相关--><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.3.26</version></dependency>
<!--        springAOP相关--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>6.0.9</version></dependency></dependencies>
</project>

注意配置完后要重新构建Maven项目

1、在数据库中创建数据表student

2、编写实体类

创建Student类,在该类中定义id、username、password和course属性,以及属性对应的getter/setter方法

package org.example.entity;
//编写实体类
public class Student {//定义学生idprivate Integer id;//定义学生姓名private  String username;//定义学生密码private  String password;//定义学生课程private  String course;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}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 String getCourse() {return course;}public void setCourse(String course) {this.course = course;}@Overridepublic String toString() {return "Student{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", course='" + course + '\'' +'}';}
}

3、编写配置文件:

创建配置文件applicationContext-student.xml,在该文件中配置id为dataSource的数据源Bean和id为jdbcTemplate的JDBC模板Bean,并将数据源注入到JDBC模板中

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
<!--    数据源--><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><!-- 数据库驱动 --><property name="driverClassName" value="com.mysql.jdbc.Driver"/><!-- 连接数据库url --><property name="url" value="jdbc:mysql://localhost:3306/Spring"></property><property name="username" value="root"></property><property name="password" value="root"></property></bean><!-- 2.配置JDBC模板 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!-- 3.配置注入类 --><bean id="studentDao" class="org.example.dao.impl.StudentDaoImpl"><property name="jdbcTemplate" ref="jdbcTemplate"></property></bean>
</beans><!--Beans模块:提供了BeanFactory类,是工厂模式的经典实现,Beans模块的主要作用是创建和管理Bean对象。--><!--可作为配置文件模板--><!--XML文件包含了很多约束信息-->

4、编写Dao层方法:

创建StudentDao接口,在StudentDao接口中声明查询所有用户信息的方法。

package org.example.dao;import org.example.entity.Student;
//dao层开发关联数据库,创建接口,定义方法findStudent
public interface StudentDao {public Student findStudentByUsernameAndPassword(String username,String password);
}

5、实现Dao层方法:

创建StudentDaoImpl实现类,在StudentDaoImpl类中实现StudentDao接口中的findAllStudent()方法。

package org.example.dao.impl;
import org.example.dao.StudentDao;
import org.example.entity.Student;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
//在StudentDaoImpl类中实现StudentDao接口中的findAllStudent()方法。
public class StudentDaoImpl implements StudentDao {//实现数据库private JdbcTemplate jdbcTemplate;public JdbcTemplate getJdbcTemplate() {return jdbcTemplate;}public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}@Overridepublic Student findStudentByUsernameAndPassword(String username, String password) {
//        数据库操作String sql = "select * from student where username=? and password=?";Student student = null;try {student = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Student.class), username, password);} catch (EmptyResultDataAccessException e) {
//            如果没查到数据就返回空return null;}return student;}
}

6、编写Controller层:

创建StudentController类,用于实现用户登录操作。

package org.example.controller;
import org.example.dao.StudentDao;
import org.example.entity.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import java.util.Scanner;//实现业务
public class StudentController {public static void main(String[] args) {
//关联配置,实现dao层接口ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext-student.xml");StudentDao studentDao=(StudentDao) ac.getBean("studentDao");Scanner sc= new Scanner(System.in);System.out.println("欢迎来到学生管理系统");System.out.println("请输入用户名:");
//        接收输入String username=sc.next();System.out.println("请输入用户密码:");String password=sc.next();
//        逻辑查询,从数据库中查询Student student= studentDao.findStudentByUsernameAndPassword(username,password);if (student == null) {
//            没有查询到数据,查询的用户或密码有误System.out.println("没有查询到数据,查询的用户或密码有误");}else {
//         查询到数据,查询的用户或密码正确System.out.println("登入成功");System.out.println(username+"是"+student.getCourse()+"班的");}}
}

7、查看运行结果:

在IDEA中启动StudentController类,在控制台按照提示输入账号密码进行登录。

三、总结spring jdbc知识

 数据库用于处理持久化业务产生的数据,应用程序在运行过程中经常要操作数据库。一般情况下,数据库的操作由持久层(Dao层)来实现。作为扩展性较强的一站式开发框架,Spring也提供了持久层Spring JDBC功能,Spring JDBC可以管理数据库连接资源,简化传统JDBC的操作,进而提升程序数据库操作的效率

1、JDBCTemplate作用

针对数据库操作,Spring框架提供了JdbcTemplate类,JdbcTemplate是一个模板类,Spring JDBC中的更高层次的抽象类均在JdbcTemplate模板类的基础上创建。 JdbcTemplate类提供了操作数据库的基本方法,包括添加、删除、查询和更新。在操作数据库时,JdbcTemplate类简化了传统JDBC中的复杂步骤,这可以让开发人员将更多精力投入到业务逻辑中。

2、Spring JDBC的配置

Spring对数据库的操作都封装在了core、dataSource、object和support这4个包中,想要使用Spring JDBC,就需要对这些包进行配置。 在Spring中,JDBC的配置是在配置文件applicationContext.xml中完成的,包括配置数据源、配置JDBC模板和配置注入类。

3、 excute()方法

在Spring JDBC中,execute()方法是JdbcTemplate类的一部分。该方法允许您执行任何SQL语句,无论是查询还是更新操作。execute()方法是一种多功能方法,可用于执行任何类型的SQL操作。

基本语法格式:jdTemplate.execute("SQL 语句");

4、update()方法

update()方法是JdbcTemplate类的一个重要方法,用于执行SQL语句来更新数据库中的数据。这个方法通常用于执行INSERT、UPDATE、DELETE等需要修改数据库记录的操作

5、query()方法

query()方法是JdbcTemplate类的一个重要方法,用于执行SELECT查询并返回一个结果集。这个方法通常用于从数据库中检索数据

6、 事务管理的核心接口

spring-tx-5.2.8.RELEAS依赖包的3个接口

    PlatformTransactionManager接口:可以根据属性管理事务。  

    TransactionDefinition接口:用于定义事务的属性。    

    TransactionStatus接口:用于界定事务的状态

7、事务管理的方式

  Spring中的事务管理分为两种方式,一种是传统的编程式事务管理,另一种是声明式事务管理。        编程式事务管理:通过编写代码实现的事务管理,包括定义事务的开始、正常执行后的事务提交和异常时的事务回滚。    

   声明式事务管理:通过AOP技术实现的事务管理,其主要思想是将事务管理作为一个“切面”代码单独编写,然后通过AOP技术将事务管理的“切面”代码植入到业务目标类中。

 其中声明式事务管理有两种解决方式:基于xml的配置和基于注解的实现,如:

1.创建配置文件:创建配置文件applicationContext-annotation.xml,在该文件中声明事务管理器等配置信息。

<!-- 1.配置数据源:数据库驱动;连接数据库的url;连接数据库的用户名;连接数据库的密码 -->
<!-- 2.配置JDBC模板:默认必须使用数据源 -->
<!--3.定义id为accountDao的Bean:将jdbcTemplate注入到AccountDao实例中 -->		
<!-- 4.事务管理器,依赖于数据源 -->
<!-- 5.注册事务管理器驱动 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

2、修改Dao层实现类:在AccountDaoImpl类的某实现方法上添加事务注解@Transactional。

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false)

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

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

相关文章

爬取博客的图片并且将它存储到响应的目录

目录 前言 思想 注意 不多说解释了&#xff0c;贴代码吧 config.json Get_blog_img.py 把之前的写的代码也贴上 Get_blog_id.py 主函数 main.py 运行结果 前言 在上一篇博客中我们介绍了如何爬取博客链接 利用python爬取本站的所有博客链接-CSDN博客文章浏览阅读74…

【Vue3】函数式编程(h 函数)

h 函数的原理就是 createVNode。可以使用 h 函数封装一些小组件。 <template><table border><tr><th>name</th><th>age</th><th>操作</th></tr><tr v-for"item in list" :key"item.age"&…

《TCP/IP详解 卷一》第8章 ICMPv4 和 ICMPv6

目录 8.1 引言 8.1.1 在IPv4和IPv6中的封装 8.2 ICMP 报文 8.2.1 ICMPv4 报文 8.2.2 ICMPv6 报文 8.2.3 处理ICMP报文 8.3 ICMP差错报文 8.3.1 扩展的ICMP和多部报文 8.3.2 目的不可达和数据包太大 8.3.3 重定向 8.3.4 ICMP 超时 8.3.5 参数问题 8.4 ICMP查询/信息…

如何优化阿里云幻兽帕鲁/Palworld的多人联机性能,并避免内存溢出导致的异常退出游戏?

优化阿里云幻兽帕鲁/Palworld的多人联机性能并避免内存溢出导致的异常退出游戏&#xff0c;可以采取以下几种方法&#xff1a; 选择合适的内存配置&#xff1a;由于幻兽帕鲁是一个对内存需求较高的游戏&#xff0c;建议选择至少16GB的内存。对于不同的玩家数量&#xff0c;可以…

高维中介数据:基于贝叶斯推断的因果中介效应估计方法

摘要 该博客介绍一种基于贝叶斯推断的高维因果中介效应估计方法&#xff0c;适用于omics研究中的大量潜在中介变量分析。在贝叶斯框架下&#xff0c;利用连续收缩先验扩展了传统的因果中介分析技术&#xff0c;以处理高维数据。这种方法提高了全局中介分析的统计功效&#xff…

Unity 游戏设计模式:单例模式

本文由 简悦 SimpRead 转码&#xff0c; 原文地址 mp.weixin.qq.com 单例模式 在 C# 游戏设计中&#xff0c;单例模式是一种常见的设计模式&#xff0c;它的主要目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。单例模式在游戏开发中具有以下几个作用&#xf…

AutoDev 1.5.3:精准的自动化测试生成、本地模型强化与流程自动化优化

去年年初&#xff0c;我们开源 AutoDev 的初衷是&#xff1a; AutoDev 是一款基于 JetBrains IDE 的开源 AI 辅助编程插件。AutoDev 能够与您的需求管理系统&#xff08;例如 Jira、Trello、Github Issue 等&#xff09;直接对接。在 IDE 中&#xff0c;您只需简单点击&#x…

802.11局域网的 MAC 帧

目录 802.11 局域网的 MAC 帧 802.11 数据帧的三大部分 1.关于 802.11 数据帧的地址 最常用的两种情况 2.序号控制字段、持续期字段和帧控制字段 802.11 局域网的 MAC 帧 802.11 帧共有三种类型&#xff1a;控制帧、数据帧和管理帧。 802.11 数据帧的三大部分 MAC 首部&…

多层控制上身姿态的方法

1选择要施加的clip并调出层控制窗口 2点选motion层控制 3选择并复制pose&#xff08;注意在哪个层中选中的情况下复制的是那个层中的pose&#xff09; 4在新建层中分别选择头帧粘贴pose和尾帧粘贴pose因是上半身&#xff0c;因此mask中把下半身去掉即变灰

【K8S类型系统】一文梳理 K8S 各类型概念之间的关系(GVK/GVR/Object/Schema/RestMapper)

参考 k8s 官方文档 https://kubernetes.io/zh-cn/docs/reference/https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/ 重点 Kubernetes源码学习-kubernetes基础数据结构 - 知乎 重点 Kubernetes类型系统 | 李乾坤的博客 重点 k8s源码学习-三大核心数…

uni-app去除页面头部的标题栏

uniapp项目 每个界面都会有一个标题栏 配置在我们项目根目录的 pages.json中 我们将它全部去掉 上面还是有一条黑的 体验非常差 我们只需要在pages.json中 指定page的 style中加入 "navigationStyle": "custom"对应的page 就没有这个标题栏了

rk3568-一种基于wifi的网络环境搭建方案

前言&#xff1a; PC--Ubuntu--开发板 三者之间的网络互相ping通很重要&#xff0c;尤其是ubuntu和开发板互ping成功最关键&#xff0c;关系到nfs&#xff0c;tftp等常用的开发手段。现在大多数开发板都带有wifi芯片&#xff0c;现在提供一种方案可以三个设备无线地搭建网络环境…