1.6 初探JdbcTemplate操作

news2024/12/23 10:56:37

一、JdbcTemplate案例演示

1、创建数据库与表

(1)创建数据库

执行命令:CREATE DATABASE simonshop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
或者利用菜单方式创建数据库 - simonshop
在这里插入图片描述

打开数据库simonshop
在这里插入图片描述

(2)创建用户表

创建用户表 - t_user
在这里插入图片描述

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
  `password` varchar(20) DEFAULT NULL,
  `telephone` varchar(11) DEFAULT NULL,
  `register_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `popedom` int(11) DEFAULT NULL COMMENT '0:管理员;1:普通用户',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;

(3)用户表添加记录

给用户表添加4条记录
在这里插入图片描述

INSERT INTO `t_user` VALUES ('1', 'admin', '12345', '15734345678', '2016-12-02 08:40:35', '0');
INSERT INTO `t_user` VALUES ('2', '郑晓红', '11111', '13956567889', '2016-12-20 09:51:43', '1');
INSERT INTO `t_user` VALUES ('3', '温志军', '22222', '13956678907', '2016-12-20 09:52:36', '1');
INSERT INTO `t_user` VALUES ('4', '涂文艳', '33333', '15890905678', '2016-12-05 09:52:56', '1');

(4)查看用户表内容

用户表 - t_user有4条记录
在这里插入图片描述

2、打开Spring项目

Spring项目 - SpringDemo
在这里插入图片描述

3、添加数据库相关依赖

在pom.xml文件里添加相关依赖
在这里插入图片描述

<!--Spring数据库支持-->                                  
<dependency>                                        
    <groupId>org.springframework</groupId>          
    <artifactId>spring-jdbc</artifactId>            
    <version>5.3.25</version>            
</dependency>                                       
<!--数据库驱动工具包-->                                     
<dependency>                                        
    <groupId>mysql</groupId>                        
    <artifactId>mysql-connector-java</artifactId>   
    <version>5.1.49</version>                       
</dependency>                                       
<!--数据库连接池框架-->                                     
<dependency>                                        
    <groupId>com.alibaba</groupId>                  
    <artifactId>druid</artifactId>                  
    <version>1.2.16</version>                       
</dependency>       

4、创建用户实体类

ORM(Object Relation Mapping)对象关系映射
用户表t_user对应的用户实体类User ,表里的字段对应实体类的属性,一条表记录对应一个实体对象
在net.hf.spring包里创建day06.bean子包,然后在子包里面创建User类
在这里插入图片描述

package net.hf.spring.day06.bean;

import java.util.Date;

/**
 * 功能:用户实体类
 * 作者:hf
 * 日期:2023年03月01日
 */
public class User {
    private int id;
    private String username;
    private String password;
    private String telephone;
    private Date registerTime;
    private int popedom;

    public int getId() {
        return id;
    }

    public void setId(int 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 getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    public Date getRegisterTime() {
        return registerTime;
    }

    public void setRegisterTime(Date registerTime) {
        this.registerTime = registerTime;
    }

    public int getPopedom() {
        return popedom;
    }

    public void setPopedom(int popedom) {
        this.popedom = popedom;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", telephone='" + telephone + '\'' +
                ", registerTime=" + registerTime +
                ", popedom=" + popedom +
                '}';
    }
}

5、创建用户数据访问接口

DAO(Data Access Object)数据访问对象
在net.hf.spring包里创建day06.dao子包,在子包里创建UserDao接口
在这里插入图片描述

package net.hf.spring.day06.dao;

import net.hf.spring.day06.bean.User;

import java.util.List;

/**
 * 功能:用户数据访问接口
 * 作者:hf
 * 日期:2023年03月01日
 */
public interface UserDao {
    int insert(User user);
    int deleteById(int id);
    int update(User user);
    User findById(int id);
    List<User> findAll();
    User login(String username, String password);
}


6、创建用户数据访问接口实现类

Impl - Implementation 实现
在net.hf.spring.day06.dao包里创建impl子包,然后在子包里创建UserDaoImpl类
在这里插入图片描述

package net.hf.spring.day06.dao.impl;

import net.hf.spring.day06.bean.User;
import net.hf.spring.day06.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 功能:用户数据访问接口实现类
 * 作者:hf
 * 日期:2023年03月01日
 */
@Repository("userDao")
public class UserDaoImpl implements UserDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    /**
     * 插入用户记录
     *
     * @param user
     * @return 插入记录数
     */
    public int insert(User user) {
        // 定义字符串
        String strSQL = "INSERT INTO t_user (username, password, telephone, " +
                "register_time, popedom) VALUES (?, ?, ?, ?, ?)";
        // 调用模板的更新方法执行SQL语句
        return jdbcTemplate.update(strSQL, user.getUsername(),
                user.getTelephone(), user.getRegisterTime(), user.getPopedom());
    }

    /**
     * 按编号删除用户记录
     *
     * @param id
     * @return 删除记录数
     */
    public int deleteById(int id) {
        // 定义SQL字符串
        String strSQL = "DELETE FROM t_user WHERE id = ?";
        // 调用模板的更新方法执行SQL语句
        return jdbcTemplate.update(strSQL, id);
    }

    /**
     * 更新用户记录
     *
     * @param user
     * @return 更新记录数
     */
    public int update(User user) {
        // 定义SQL字符串
        String strSQL = "UPDATE t_user SET username = ?, password = ?, " +
                "telephone = ?, register_time = ?, popedom = ? WHERE id = ?";
        // 调用模板的更新方法执行SQL语句
        return jdbcTemplate.update(strSQL, user.getUsername(), user.getPassword(),
                user.getTelephone(), user.getRegisterTime(), user.getPopedom(), user.getId());
    }

    /**
     * 按编号查询用户记录
     *
     * @param id
     * @return 用户对象
     */
    public User findById(int id) {
        String strSQL = "SELECT * FROM t_user WHERE id = ?";
        return jdbcTemplate.queryForObject(strSQL, new RowMapper<User>() {
            // 行映射方法(将用户表记录映射成用户实体)
            @Override
            public User mapRow(ResultSet rs, int row) throws SQLException {
                // 创建用户表
                User user = new User();
                // 从结果获取字段值设置用户对象属性
                user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setTelephone(rs.getString("telephone"));
                user.setRegisterTime(rs.getTimestamp("register_time"));
                user.setPopedom(rs.getInt("popedom"));
                // 返回用户对象
                return null;
            }
        }, id);
    }

    /**
     * 查询全部用户记录
     *
     * @return 用户列表
     */
    public List<User> findAll() {
        // 创建用户列表
        List<User> users = new ArrayList<>();
        // 定义SQL字符串
        String strSQL = "SELECT * FROM t_user";
        // 查询获取行列表
        List<Map<String, Object>> rows = jdbcTemplate.queryForList(strSQL);
        // 遍历行列表,生成用户列表
        for (Map<String, Object> row : rows) {
            // 创建用户对象
            User user = new User();
            // 从行获取列值设置用户对象属性
            user.setId((Integer) row.get("id"));
            user.setUsername((String) row.get("username"));
            user.setPassword((String) row.get("password"));
            user.setTelephone((String) row.get("telephone"));
            user.setRegisterTime((Date) row.get("register_time"));
            user.setPopedom((Integer) row.get("popedom"));
            // 将用户对象添加到用户列表
            users.add(user);
        }
        // 返回用户列表
        return null;
    }

    /**
     * 用户登录
     *
     * @param username
     * @param password
     * @return 用户实体(null:登录失败,not null:登录成功)
     */
    public User login(String username, String password) {
        String strSQL = "SELECT * FROM t_user WHERE username = ? AND password = ?";
        return jdbcTemplate.queryForObject(strSQL, new RowMapper<User>() {
            // 行映射方法(将用户表记录映射成用户实体)
            public User mapRow(ResultSet rs, int row) throws SQLException {
                // 创建用户对象
                User user = new User();
                // 从结果集获取字段值设置用户对象属性
                user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setTelephone(rs.getString("telephone"));
                user.setRegisterTime(rs.getTimestamp("register_time"));
                user.setPopedom(rs.getInt("popedom"));
                // 返回用户对象
                return user;
            }
        }, username, password);
    }
}

7、创建用户服务类

在net.hf.spring.day06包里创建service子包,然后在子包里创建UserService类
在这里插入图片描述

package net.hf.spring.day06.service;

import net.hf.spring.day06.bean.User;
import net.hf.spring.day06.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 功能:用户服务类
 * 作者:hf
 * 日期:2023年03月07日
 */

@Service("userService")
public class UserService {
    @Autowired
    private UserDao userDao;

    public int addUser(User user) {
        return userDao.insert(user);
    }

    public int deleteUserById(int id) {
        return userDao.deleteById(id);
    }

    public int updateUser(User user) {
        return userDao.update(user);
    }

    public User findUserById(int id) {
        return userDao.findById(id);
    }

    public List<User> findAllUsers() {
        return userDao.findAll();
    }

    public User login(String username, String password) {
        return userDao.login(username, password);
    }
}

8、创建数据库配置属性文件

在resources目录里创建数据库配置属性文件 - jdbc.properties
在这里插入图片描述

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/simonshop?useSSL=false
jdbc.username=root
jdbc.password=p@ssw0rd

注意密码要改成你安装MySQL时候设置的密码

9、创建Spring配置文件

在resources里创建Spring配置文件 - spring-config.xml
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd">

    <!--组件扫描-->
    <context:component-scan base-package="net.hf.spring.day06"/>
    <!--声明属性占位符-->
    <context:property-placeholder location="jdbc.properties"/>
    <!--定义数据源Bean-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    <!--定义JDBC模板Bean-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>

10、创建用户服务测试类

在test/java目录的net.hf.spring包里创建day06.service子包,然后在子包里创建TestUserService类
在这里插入图片描述

package net.hf.spring.day06.service;

import org.junit.After;
import org.junit.Before;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 功能:测试用户服务类
 * 作者:hf
 * 日期:2023年03月07日
 */
public class TestUserService {
    private UserService userService; // 用户服务对象
    private ClassPathXmlApplicationContext context; // 基于类路径XML配置文件的应用容器

    @Before
    public void init() {
        // 基于Spring配置文件创建应用容器
        context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 根据名称从应用容器里获取用户服务对象
        userService = (UserService) context.getBean("userService");
    }

    @After
    public void destroy() {
        // 关闭应用容器
        context.close();
    }
}


(1)测试按编号查询用户方法

创建testFindUserById()方法
在这里插入图片描述

运行测试方法testFindUserById(),查看结果
在这里插入图片描述

修改测试方法里的id值,再运行,查看结果
在这里插入图片描述

在这里插入图片描述

修改测试方法,捕获异常,再运行,查看结果
在这里插入图片描述

(2)测试查询全部用户方法

创建testFindAllUsers()方法
在这里插入图片描述

在这里插入图片描述

(3)测试添加用户方法

创建testAddUser()方法
在这里插入图片描述

运行测试方法,查看结果
在这里插入图片描述

查看用户表记录
在这里插入图片描述

(4)测试更新用户方法

创建testUpdateUser()方法
在这里插入图片描述

运行测试方法testUpdateUser(),查看结果
在这里插入图片描述

查看用户表记录
在这里插入图片描述

(5)测试删除用户方法

创建testDeleteUserById()方法
在这里插入图片描述

运行测试方法testDeleteUserById(),查看结果
在这里插入图片描述

查看用户表记录,哇哈哈记录不见了
在这里插入图片描述

4、测试用户登录方法

创建testLogin()方法
在这里插入图片描述

运行测试方法testLogin(),查看结果
在这里插入图片描述

修改testLogin()方法
在这里插入图片描述

运行测试方法,查看结果
在这里插入图片描述

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

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

相关文章

边缘计算盒子在视觉分析领域的优势

边缘计算盒子在视觉分析领域有广泛的应用。边缘计算盒子是一种集成了计算、存储和网络连接功能的设备&#xff0c;通常部署在物理环境中的边缘位置&#xff0c;如工厂、城市、交通系统等。它们能够在离数据源更近的位置进行实时数据处理和分析&#xff0c;从而提供更低的延迟和…

使用Docker安装Kafka

第一步&#xff1a;使用下述命令从Docker Hub查找镜像&#xff0c;此处我们要选择的是zookeeper官网的镜像 docker search zookeeper 第二步&#xff1a;拉取zookeeper镜像 docker pull zookeeper:latest 第三步&#xff1a;启动zookeeper容器 docker run -d --name zookee…

微服务-Elasticsearch基础篇【内含思维导图】

Elasticsearch官网&#xff1a;欢迎来到 Elastic — Elasticsearch 和 Kibana 的开发者 | Elastic 注意&#xff1a;Elasticsearch官网访问和加载的耗时很长&#xff01;&#xff01;&#xff01; Lucene官网&#xff1a;Apache Lucene - Welcome to Apache Lucene 目录 一、E…

Docker基本操作与自定义镜像Docker-Compose与Docker镜像仓库

目录 一.基本操作 1.镜像操作 1.1.镜像名称 1.2.镜像命令 1.3.案例-拉取、查看镜像 1.4.案例-保存、导入镜像 2.容器操作 2.1.容器相关命令 2.2.案例-创建并运行一个容器 2.3.案例-进入容器&#xff0c;修改文件 2.4.小结 3.数据卷&#xff08;容器数据管理&#x…

挑选在线帮助文档协作工具的技巧与要点

随着互联网的发展&#xff0c;越来越多的公司和团队开始使用在线帮助文档协作工具来共同编辑和维护文档。这些工具可以让多个用户同时协作编辑同一篇文档&#xff0c;从而提高工作效率和减少沟通成本。然而&#xff0c;在选择在线帮助文档协作工具时&#xff0c;需要注意一些技…

低代码平台投票榜揭晓:这些平台最受欢迎

低代码平台是软件开发工具&#xff0c;允许用户快速轻松地创建和部署应用程序&#xff0c;只需最少的编程知识。对于寻求在不需要大量IT资源的情况下构建自定义应用程序的企业来说&#xff0c;这些平台非常有用。在本文中&#xff0c;我们将讨论低代码平台排行榜投票榜&#xf…

注解和反射复习

注解 注解&#xff1a;给程序和人看的&#xff0c;被程序读取&#xff0c;jdk5.0引用 内置注解 override:修饰方法&#xff0c;方法声明和重写父类方法&#xff0c; Deprecated:修饰&#xff0c;不推荐使用 suppressWarnings用来抑制编译时的警告,必须添加一个或多个参数s…

外贸客户背调的几种干货技巧

外贸人要想做到知己知彼&#xff0c;那背调是必不可少的。 有经验的外贸人会通过关键词、邮箱等开展模糊搜索&#xff0c;然而这种方式不光效率低&#xff0c;而且搜索到的信息也不全。今天小编分享的这几种背调组合工具&#xff0c;不光收集到的客户信息全面&#xff0c;而且…

Nginx网络服务的配置(叫不醒和睡不着的是两个世界)

文章目录 一、Nginx概述二、Nginx相对于Apache的优点三、配置Nginx网络服务1.编译安装和启用Nginx服务&#xff08;1&#xff09;关闭防火墙和selinux&#xff08;2&#xff09;安装依赖包&#xff08;3&#xff09;创建运行用户、组&#xff08;Nginx 服务程序默认以 nobody 身…

华为OD机试真题B卷 Java 实现【机房布局】,附详细解题思路

一、题目描述 小明正在规划一个大型数据中心机房&#xff0c;为了使得机柜上的机器都能正常满负荷工作&#xff0c;需要确保在每个机柜边上至少要有一个电箱。 为了简化题目&#xff0c;假设这个机房是一整排&#xff0c;M表示机柜&#xff0c;I表示间隔&#xff0c;请你返回…

北斗RTK差分定位技术原理、优势及应用领域

北斗卫星导航系统是中国自主建设的卫星导航系统&#xff0c;是继美国GPS、俄罗斯GLONASS和欧盟Galileo之后&#xff0c;全球第四个卫星导航系统。北斗系统非常重要&#xff0c;可用于国防、公共安全、民生等多个领域&#xff0c;包括交通运输、环境保护、渔业等。差分定位则是北…

【Springboot系列】springboot扩展点大整理,赶紧收藏起来

系列文章&#xff1a;Spring Boot学习大纲&#xff0c;可以留言自己想了解的技术点 1、aware系列 在Spring Boot中&#xff0c;有一些可以实现的Aware接口&#xff0c;用于在应用程序中获取特定的上下文或对象。这些接口允许您的组件意识到它们所在的环境&#xff0c;并与之进…

和数集团元宇宙场景落地 催生新机遇

现代社会随着科技不断发展&#xff0c;人们对于虚拟现实的需求日益提高。随着互联网进入Web3.0时代&#xff0c;越来越多的人开始进入虚拟世界&#xff0c;探索虚拟现实的无限可能。 在这个充满未知的广阔世界中&#xff0c;和数集团旗下包括【神念无界源起山海】、【神宠岛】…

国内使用chatGPT插件

无需任何繁琐操作&#xff0c;只要你一打开edge浏览器就能使用chatGPT&#xff0c;还要什么自行车&#xff01; 那么如何使用呢&#xff1f;其实操作是非常简单的&#xff01; 步骤 第一步&#xff1a;下载edge浏览器 edge浏览器一般Windows10系统都自带了&#xff0c;没有的…

ChatGPT 提示的艺术 —— 如何编写清晰有效提示指南

ChatGPT 提示的作用 正如我们之前提到的那样&#xff0c;ChatGPT 对话中使用的提示的质量可以显著影响对话的成功。定义清晰的提示可以确保对话保持在正确的轨道上&#xff0c;并涵盖用户感兴趣的主题&#xff0c;从而产生更引人入胜和信息丰富的体验。 那么什么样的 ChatGPT…

计算机网络实验:认识Packet Tracer软件

目录 前言实验目的实验内容及要求相关知识点实验指导实验过程总结 前言 计算机网络是当今信息技术的重要组成部分&#xff0c;它涉及到多种硬件和软件的协同工作&#xff0c;以实现数据的传输和交换。为了更好地理解和掌握计算机网络的基本原理和技术&#xff0c;我们需要进行…

关于分数的二进制原反补码的求解

话不多说&#xff0c;上例子 求-53/64的原反补&#xff1b; 前奏&#xff1a;-53/64可以分解为符号位“-”和数字位53/64&#xff1b; 第一步&#xff1a;在计算机中&#xff0c;符号位用0表示“”用1表示“-” 第二步&#xff1a;求53/64的二进制数&#xff0c;过程如下图…

如何回馈 Elastic 社区

作者&#xff1a;Ully Sampaio 在 Elastic 社区中拥有前排座位最美妙的事情之一就是见证人们互相帮助。 从讨论和 Elastic Community Slack 工作区到 Elastic YouTube 官方频道&#xff0c;无论你走到哪里&#xff0c;你都会看到 Elasticsearch 专家和初学者分享他们的知识。 这…

图解LeetCode——543. 二叉树的直径

一、题目 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 二、示例 2.1> 示例 1&#xff1a; 【输入】roo…

Vision Transformer (ViT)及各种变体

目录 0.Vision Transformer介绍 1.ViT 模型架构 1.1 Linear Projection of Flattened Patches 1.2 Transformer Encoder 1.3 MLP Head 1.4 ViT架构图 1.5 model scaling 2.Hybrid ViT 4.其他Vision Transformer变体 5.Vit代码 6.参考博文 0.Vision Transformer介绍 …