MySQL 数据库 JDBC 简化 JDBCTemplate

news2024/12/25 2:28:47

JDBCTemplate编程

场景:使用JdbcTemplate技术向MySQL中插入一条数据

  • 表结构如下

create table t_person(
    person_id int primary key auto_increment,
    person_name varchar(20),
    age tinyint,
    sex  enum('男','女','奥特曼'),
    height  decimal(4,1),
    birthday  datetime
)
  1. API介绍

    API含义
    Connection数据库连接作为Java程序向MySQL发送SQL和返回结果数据的网络连接
    DataSource连接池Connection的管理者,内部有多个Connection,可以重复使用,免去了销毁和创建Connection所消耗的时间和CPU资源,可以提高性能。
    JdbcTemplate封装了JDBC的操作代码,相当于MySQL的客户端,可以发送SQL语句。
    resultSet结果集里面封装了MySQL数据库返回的查询结果。
  2. 编程思路

    1. 创建连接池DataSource
    2. 创建JdbcTemplate对象
    3. 发送SQL
  3. 编码实现

    ① 准备工作

    • 使用IDEA创建一个的java项目

    • 加入如下依赖

      ② 具体编码

    package com.xx.test;
    ​
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.datasource.DriverManagerDataSource;
    ​
    import javax.sql.DataSource;
    ​
    public class InsertTest {
        public static void main(String[] args) {
           // 1. 创建数据库连接池(可以辅助我们获取连接管理连接)
            //连接路径: 连接途径:数据库类型://ip:port/数据库名?k=v&k=v(编码集&时区)
            String url = "jdbc:mysql://localhost:3306/xx2304?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai";
            String username = "root";
            String password = "root";
            DataSource dataSource=new DriverManagerDataSource(url,username,password);
           // 2. 创建JDBCTemplate (创建操作数据库的工具)
            JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
           // 3. 书写SQL
            String sql = "insert into t_person(person_name,age) values('lisi',20)";
           // 4. 发送执行SQL
            int n = jdbcTemplate.update(sql);
           // 5. 处理结果
            if (n == 1) {
                //如果受影响行数为1,证明操作成功
                System.out.println("添加成功!");
            } else {
                System.out.println("添加失败");
            }
        }
    }

二 结果集处理

场景:查询t_person表中的数据,并逐条地将每个字段输出在控制台。

ResultSet说明:

# 注意:
1. ResultSet表示的是查询结果,其数据已经是MySQL返回,并保存在Java程序中的。
2. ResultSet查询结果的列名,不是原表列名,而是select查询结果列名,可以由as进行别名定义。
​

1. RowMapper

功能: 用来把SQL查询结果集ResultSet,映射(转化)为Java对象,便于java程序的后续数据管理和处理。

语法:

  • ① 定义一个类

class Java类{
  1. 类名与对应表名相关
  2. 一个属性对应一个字段
  3. 属性类型必须与字段类型一致
  4. 属性名必须与字段名相关
    - 字段名只由一部分组成,属性名保持一致  age--age
    - 字段名由多个部分组成,属性名采用小驼峰命名  person_id--personId
  5. 进行正常封装
  6. 提供有参无参的构造
  7. 数据类型声明为引用类型 
}
  • ② 映射查询结果

List<Java类> personList = jdbcTemplate.query("查询的SQL语句", new RowMapper<Java类>() {
    /**
      功能:作为JdbcTemplate,将查询结果的每个字段映射为一个ORM对象的属性的实现。
      执行时机:查询结果的每条数据的映射,都会调用一次mapRow方法。
      参数:
        ResultSet:结果集,封装了MySQL返回的查询结果。可以看作是之前MySQL客户端返回的行结果。
        rowNum:当前映射的行,在整体本次查询结果的行号。
    */
    @Override
    public Java类 mapRow(ResultSet rs, int rowNum) throws SQLException {
        //获取当前行数据
        rs.getXxxx("查询结果列名");
        rs.getString("");
        rs.getInt("");
        rs.getDouble("");
        // 将结果封装成Java对象,并返回。
        
    }
});

示例代码:

  • ① 定义一个类

package com.xx.entity;
​
import java.util.Date;
​
/**
 * 对应t_person表
 */
public class Person {
    private Integer personId;
    private String personName;
    private Integer age;
    private String sex;
    private Double height;
    private Date birthday;
​
    //省略getter、setter、有参构造、无参构造
​
}
  • ② 映射查询结果

package com.xx.test;
​
import com.xx.entity.Person;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
​
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
​
/**
 * 需求:查询person表的所有数据
 */
public class SelectTest {
    public static void main(String[] args) {
        //创建数据库连接池
        String url = "jdbc:mysql://localhost:3306/xx2304?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai";
        String username = "root";
        String password = "root";
        DataSource dataSource = new DriverManagerDataSource(url, username, password);
        //创建JDBCTemplate
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        //书写SQL
        String sql = "select * from t_person";
        //发送SQL处理结果
        List<Person> list=jdbcTemplate.query(sql, new RowMapper<Person>() {
            /**
             * RowMapper:更改当前操作的行号-->按照我们书写的代码处理结果集指定行的内容-->将返回的对象添加进集合
             *
             * @param rs 结果集 存放着所有的查询数据
             * @param i 当前被处理的行号  RowMapper执行时自动使用,无需手动处理
             * @return 本行数据对应的对象
             * @throws SQLException
             */
            @Override
            public Person mapRow(ResultSet rs, int i) throws SQLException {
                //获取字段值
                Integer personId = rs.getInt("person_id");
                String personName = rs.getString("person_name");
                Integer age = rs.getInt("age");
                String sex = rs.getString("sex");
                Double height = rs.getDouble("height");
                Date birthday = rs.getDate("birthday");
                //组装当前行的Person对象
                Person p = new Person(personId, personName, age, sex, height, birthday);
                return p;
            }
        });
        //查看集合数据
        System.out.println("查询结果为:");
        list.forEach(person -> System.out.println(person));
    }
}
2. BeanPropertyRowMapper

💡JdbcTemplate还提供了内置的BeanPropertyRowMapper,简化查询结果和实体类对象的转换RowMapper的操作。

要求:

1. 如果查询结果(select后的字段名)的字段由一个单词构成,则Java类的属性名要和列名一致。
2. 如果查询结果(select后的字段名)的字段由n个单词构成,则Java类的属性名要变成驼峰命名法
​

如图:

语法:

jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(与查询结果对应的Java类.class));

编码:

package com.xx.test;
​
import com.xx.entity.Person;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
​
import javax.sql.DataSource;
import java.util.List;
​
/**
 * 需求:查询person表的所有数据-BeanPropertyRowMapper
 */
public class SelectTest_2 {
    public static void main(String[] args) {
        //创建数据库连接池
        String url = "jdbc:mysql://localhost:3306/xx2304?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai";
        String username = "root";
        String password = "root";
        DataSource dataSource = new DriverManagerDataSource(url, username, password);
        //创建JDBCTemplate
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        //书写SQL
        String sql = "select * from t_person";
        //发送SQL处理结果
        List<Person> list=jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Person.class));
        //查看集合数据
        System.out.println("查询结果为:");
        list.forEach(person -> System.out.println(person));
​
    }
}

                

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

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

相关文章

勤学苦练“prompts“,如沐春风“CodeArts Snap“

前言 CodeArts Snap 上手一段时间了&#xff0c;对编程很有帮助。但是&#xff0c;感觉代码编写的不尽人意。 我因此也感到困惑&#xff0c;想要一份完整的 CodeArts Snap 手册看看。 就在我感觉仿佛"独自彷徨在这条悠长、悠长又寂寥的雨巷"时&#xff0c;我听了大…

Ubuntu+Apache+MySQL+PHP+phpstorm+xdebug下的debug环境搭建(纯小白笔记)

关键词 一、win10双系统装Ubuntu&#xff08;Deepin&#xff09; 参考文章&#xff1a; https://www.cnblogs.com/masbay/p/11627727.html 1.1 首先需要确定自己操作系统的引导方式 1.1.1 查看BIOS模式 “winr"快捷键进入"运行”&#xff0c;输入"msinfo32…

微软 AD |域控制器 | 组件 | 域服务 | 对象解析

介绍 Active Directory&#xff08;AD&#xff09;&#xff0c;是微软的目录服务&#xff0c;提供强大的功能和管理体系&#xff0c;用于组织管理和安全存储网络上的资源和用户、计算机、服务对象等信息。 AD 功能&#xff1a; 身份验证和访问控制&#xff1a; 提供集中式的身…

2024 高级前端面试题之 CSS 「精选篇」

该内容主要整理关于 CSS 的相关面试题&#xff0c;其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 CSS模块精选篇 1. 盒模型2. BFC3. 层叠上下文4. 居中布局5. 选择器权重计算方式6. 清除浮动7. link 与 import 的区别8. CSS3的新特性9. CSS动画和过渡10. 有哪些…

Mac中java jdk、android sdk、flutter sdk目录

1、Java JDK 目录 &#xff08;1&#xff09;官网下载的 Java JDK Java JDK下载官网 /Library/Java/JavaVirtualMachines&#xff08;2&#xff09;Android Studio下载的 Java JDK /Users/用户名/Library/Java/JavaVirtualMachines2、Android SDK 目录 /Users/用户名/Libr…

以梦为码,CodeArts Snap 缩短我与算法的距离

背景 最近一直在体验华为云的 CodeArts Snap&#xff0c;逐渐掌握了使用方法&#xff0c;代码自动生成的准确程度大大提高了。 自从上次跟着 CodeArts Snap 学习用 Python 编程&#xff0c;逐渐喜欢上了 Python。 我还给 CodeArts Snap 起了一个花名&#xff1a; 最佳智能学…

SQL注入实战:二阶注入

一、二阶注入的原理 1、二阶注入也称为SOL二次注入。 2、二次注入漏洞是一种在Web应用程序中广泛存在的安全漏洞形式:相对于一次注入漏洞而言&#xff0c;二次注入漏洞更难以被发现&#xff0c;但是它却具有与一次注入攻击漏洞相同的攻击威力。 3、简单的说&#xff0c;二次…

GitHub国内打不开(解决办法有效)

最近国内访问github.com经常打不开&#xff0c;无法访问。 github网站打不开的解决方法 1.打开网站http://tool.chinaz.com/dns/ &#xff0c;在A类型的查询中输入 github.com&#xff0c;找出最快的IP地址。 2.修改hosts文件。 在hosts文件中添加&#xff1a; # localhost n…

Leetcode—2807. 在链表中插入最大公约数【中等】

2023每日刷题&#xff08;九十九&#xff09; Leetcode—2807. 在链表中插入最大公约数 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val…

Datawhale 组队学习之大模型理论基础 Task7 分布式训练

第8章 分布式训练 8.1 为什么分布式训练越来越流行 近年来&#xff0c;模型规模越来越大&#xff0c;对硬件&#xff08;算力、内存&#xff09;的发展提出要求。因为内存墙的存在&#xff0c;单一设持续提高芯片的集成越来越困难&#xff0c;难以跟上模型扩大的需求。 为了…

力扣每日一题 ---- 1039. 多边形三角剖分的最低得分

这题的难点在哪部分呢&#xff0c;其实是怎么思考。这道题如果之前没做过类似的话&#xff0c;还是很难看出一些性质的&#xff0c;这题原本的话是没有图片把用例显示的这么详细的。这题中有个很隐晦的点没有说出来 剖出来的三角形是否有交叉&#xff0c;这题中如果加一个三角…

企业级大数据安全架构(六)数据授权和审计管理

作者&#xff1a;楼高 本节详细介绍企业级大数据架构中的第六部分&#xff0c;数据授权和审计管理 1.Ranger简介 Apache Ranger是一款被设计成全面掌管Hadoop生态系统的数据安全管理框架&#xff0c;为Hadoop生态系统众多组件提供一个统一的数据授权和管理界面&#xff0c; 管…

Redis为什么速度快:数据结构、存储及IO网络原理总结

Redis&#xff0c;作为内存数据结构存储的佼佼者&#xff0c;其高性能表现一直备受赞誉。那么&#xff0c;Redis究竟是如何实现这一点的呢&#xff1f;接下来&#xff0c;我们将更深入地探讨其背后的关键技术&#xff0c;并提供进一步的优化策略。 一、内存存储与数据结构设计…

【Linux】进程概述

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

FlashInternImage实战:使用FlashInternImage实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构编译安装DCNv4环境安装过程配置CUDAHOME解决权限不够的问题 按装ninja编译DCNv4 计算mean和std生成数据集 摘要 https://arxiv.org/pdf/2401.06197.pdf 论文介绍了Deformable Convolution v4&#xff08;DCNv4&…

单片机学习笔记---动态数码管显示

上一节我们得出一个结论&#xff0c;多位一体的数码管不可能在同一时刻显示多个不同数字&#xff0c;即使有多位选中的话&#xff0c;那显示的数字也会是相同的。这是由于他们共用引脚导致的这个现象。当然这也是为了节省引脚的连接方式&#xff0c;方便操作。 那这样的连接方式…

React中使用LazyBuilder实现页面懒加载方法二

前言&#xff1a; 在一个表格中&#xff0c;需要展示100条数据&#xff0c;当每条数据里面需要承载的内容很多&#xff0c;需要渲染的元素也很多的时候&#xff0c;容易造成页面加载的速度很慢&#xff0c;不能给用户提供很好的体验时&#xff0c;懒加载是优化页面加载速度的方…

NC开发客户端(前端)连接启动失败can‘t connect to server, please wait

效果图 解决方法 IP地址和端口要对应 1-IP地址中间启动&#xff0c;肯定是这个127.0.0.1 2-端口号&#xff0c;要对应中间件启动在控制台输出的端口 或者是在home目录-》bin-》sysConfig.bat这里面的服务器&#xff0c; 里面可以看到对应启动ip地址和端口

浪花 - 响应拦截器(强制登录)

1. 配置响应拦截器 import axios from axios;const myAxios axios.create({baseURL: http://localhost:8080/api/, });myAxios.defaults.withCredentials true;// 请求拦截器 myAxios.interceptors.request.use(function (config) {// Do something before request is sentc…

【C++】list讲解及模拟

目录 list的基本介绍 list模拟实现 一.创建节点 二.迭代器 1.模版参数 2.迭代器的实现&#xff1a; a. ! b. c. -- d. *指针 e.&引用 整体iterator (与const复用)&#xff1a; 三.功能实现 1.模版参数 2.具体功能实现&#xff1a; 2.1 构造函数 2.2 begi…