JDBC知识点全面总结2:JDBC实战编写CRUD
二.JDBC知识点全面总结1:JDBC实战编写CRUD
1.JDBC重要接口?
2.Driver和DriverMangement的关系?
3.JAVA与数据库连接
4.JAVA中使用statement来执行sql语句时,拼接字符串的sql注入问题?
5.使用preparedstatement进行增删改查
6.自定义通用查询方法
未更新
二.JDBC知识点全面总结1:JDBC实战编写CRUD
1.JDBC重要接口?
①装载驱动接口
- Driver接口:对接MySQL提供的Driver具体实现类
- DriverManager类:封装Driver实例。
②连接
- Connetion接口:获取和MySQL服务器的连接
- 获取connection实例的方式:
driver.connect();
DriverManger.getConnection();
③执行SQL语句
- Statement类(执行静态SQL语句并接受返回结果)
Statement类:SQL语句无参数
PreparedStatement类继承Statement类:SQL语句有参数(防止sql注入) - 执行方法
execute()运行无返回值
executeQuery()运行select语句有返回集
executeUpdate()运行Insert/delete/Update语句返回影响的行数
2.Driver和DriverManger的关系?
①对比
- Driver是所有JDBC驱动类实现的接口
- DriverMangement封装Driver
②使用
- Driver创建驱动实例后直接获取连接
driver.connect() - DriverMangement初始化(注册)Driver后直接获取连接
DriverMangement.getConnetion
③实战使用
- Class.forName()加载类而且执行静态代码快。数据库驱动(Driver)中有静态代码块即注册驱动到DriverMangement
- 故实战可以使用DriverMangement,在加载驱动类后直接获取连接。
3.JAVA与数据库连接
①获取连接注意事项
- properties的编写,注意直接连接的具体数据库
- class.forName在加载驱动类时执行类中静态代码,已经从DriverMangement中注册(初始化)
②获取连接代码
- mytest是具体数据库名称
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:13306/mytest?useUnicode=true&characterEncoding=utf8&useSSL=false
user=root
password=abc123
- 注意我的mysql版本是5.7的
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.37</version></dependency>
package com.likejin;import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.Properties;public class MyTest2 {public static void main(String[] args) throws Exception {InputStream resourceAsStream = MyTest2.class.getClassLoader().getResourceAsStream("jdbc.properties");Properties properties = new Properties();properties.load(resourceAsStream);String driverClass = properties.getProperty("driverClass");String url = properties.getProperty("url");String user = properties.getProperty("user");String password = properties.getProperty("password");Class.forName(driverClass);Connection connection = DriverManager.getConnection(url, user, password);}
}
4.JAVA中使用statement来执行sql语句时,拼接字符串的sql注入问题?
①statement
- 是通过获取连接之后利用其来执行sql语句
- 原理:字符串拼接(由于数据必须通过’'来包含)
②sql注入问题
- 实例场景:判断学生在数据库中是否有。
- 代码
package com.likejin;import com.likejin.util.Utils;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;public class MyTest3 {public static void main(String[] args) throws Exception {Connection conn = Utils.getconn();Statement statement = conn.createStatement();Scanner scanner = new Scanner(System.in);System.out.println("请输入ID");String id =scanner.nextLine();System.out.println("请输入年龄");String age = scanner.nextLine();String sql = "select * from student where id = '"+ id + "' and age = '" +age+"'";System.out.println(sql);ResultSet resultSet = statement.executeQuery(sql);if(resultSet.next()){System.out.println("您找的学生在这个班级");}else{System.out.println("您找的学生不在这个班级");}}
}
- 数据表
- 正常情况下
- sql注入问题加上单引号
- sql注入 不加单引号
5.使用preparedstatement进行增删改查
①preparedstatement的方法
- setObject 来填充占位符
- execute() 来执行增删改,返回boolean类型是否成功
- executeQuery()来执行查,返回ResultSet结果集
②ResultSet的方法
- next() 判断下一个是否存在,存在指正下移,返回true,不存在指正不动,返回false
- getObject(i) 参数为行数据的第几列,返回的是某一行数据的某一列的具体数值
- getMetaData()获取到ResultSetMetaData类型,该类型有方法:
getColumnCount()返回具体列数
getColumnName(i)返回某一列的名称
②注意事项
- 注意数据库中列从第一列开始,而JAVA数据一般从0开始,故计算时注意+1。
- 注意sql注入时参数也是从第一个开始的。
- 注意封装类时需要设置属性为public,否则无法利用反射初始化值。
- 注意如果要编写未知数据的查找(封装为该类的list),需要知道数据的类型:
可以用泛型方法来传入封装的数据类型
Class <T> clazz
T t
②代码
package com.likejin.util;import com.likejin.MyTest2;
import com.likejin.Student;import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;public class Utils {public static Connection getconn() throws Exception {InputStream resourceAsStream = MyTest2.class.getClassLoader().getResourceAsStream("jdbc.properties");Properties properties = new Properties();properties.load(resourceAsStream);String driverClass = properties.getProperty("driverClass");String url = properties.getProperty("url");String user = properties.getProperty("user");String password = properties.getProperty("password");Class.forName(driverClass);Connection connection = DriverManager.getConnection(url, user, password);return connection;}//针对学生表的通用更新操作public static boolean updateData(String sql, Object... args) throws Exception {Connection conn = getconn();PreparedStatement preparedStatement = conn.prepareStatement(sql);for (int i = 0; i < args.length; i++) {preparedStatement.setObject(i + 1, args[i]);}boolean execute = preparedStatement.execute();preparedStatement.close();conn.close();return execute;}//针对学生表的通用查询操作(已知列数,已知对象,已知列名)public static List selectData(String sql, Object... args) throws Exception {Connection conn = getconn();PreparedStatement preparedStatement = conn.prepareStatement(sql);for (int i = 0; i < args.length; i++) {preparedStatement.setObject(i + 1, args[i]);}ResultSet resultSet = preparedStatement.executeQuery();ArrayList<Student> students = new ArrayList<>();int i = 0;while (resultSet.next()) {Student student = new Student();student.setId(resultSet.getInt(1));student.setAge(resultSet.getInt(2));student.setGrade(resultSet.getInt(3));i = i + 1;students.add(student);}return students;}//针对任何表的查询操作public static <T> List<T> selectData(Class<T> clazz,String sql, Object... args) throws Exception {Connection conn = getconn();PreparedStatement preparedStatement = conn.prepareStatement(sql);for (int i = 0; i < args.length; i++) {preparedStatement.setObject(i + 1, args[i]);}ArrayList<T> ts = new ArrayList<>();ResultSet resultSet = preparedStatement.executeQuery();ResultSetMetaData metaData = resultSet.getMetaData();int columnCount = metaData.getColumnCount();while(resultSet.next()){T t = clazz.newInstance();for(int i = 0;i<columnCount;i++){Field dd = clazz.getDeclaredField(metaData.getColumnName(i+1));dd.set(t,resultSet.getObject(i+1));}ts.add(t);}return ts;}
}
6.自定义通用查询方法
①缺点
- 运行时类和类类型不同,无法在方法中就强转为需要的类类型。
stuent.getClass() 或者Student.class都和 Student不同 - 故如果想获得类类型,就需要运用泛型。
- 举例说明
如果想在传入方法中获取该类的类型如何获取?
利用泛型 T t或者 Class<T> clazz都可获取类型为T
利用Object o 获取不到类类型,最多获取运行时类的实例,故需要在获取方法的返回值后手动进行强转。 - 对象获取到类类型的数据是什么?为什么不能强转?
即最多获取到类类型字符串
String typeName = o1.getClass().getTypeName();由于编译的限制,无法去利用字符串强转对象。
②代码
//针对任何表的查询操作public static List selectData5(Object o,String sql, Object... args) throws Exception {//获取连接(拿到配置文件中的内容+注册driver+DriverMangement获取连接)InputStream resourceAsStream = Utils.class.getClassLoader().getResourceAsStream("jdbc.properties");Properties properties = new Properties();properties.load(resourceAsStream);final String url = properties.getProperty("url");String user = properties.getProperty("user");String password = properties.getProperty("password");Class.forName(properties.getProperty("driverClass"));Connection connection = DriverManager.getConnection(url, user, password);//连接的sql注入获取结果集PreparedStatement preparedStatement = connection.prepareStatement(sql);for(int i = 0;i<args.length;i++){preparedStatement.setObject(i+1,args[i]);}ResultSet resultSet = preparedStatement.executeQuery();//处理结果集利用反射获取结果的列表ResultSetMetaData metaData = resultSet.getMetaData();ArrayList arrayList = new ArrayList();int columnCount = metaData.getColumnCount();while(resultSet.next()){Object o1 = o.getClass().newInstance();for(int i =0;i<columnCount;i++){String columnName = metaData.getColumnName(i + 1);Field field = o1.getClass().getField(columnName);field.set(o1, resultSet.getObject(i+1));}//无法转换为目标对象的类//因为o.getClass获取的是运行时类的类型,而不是实际类类型//故实际使用时需要转换类型输出arrayList.add(o1);}return arrayList;}public static void main(String[] args) throws Exception {String sql = "select * from student where id<?" ;List students1 =null;List list = selectData5(new Student(), sql, 10);Iterator iterator = list.iterator();while(iterator.hasNext()){System.out.println((Student)iterator.next());}}
未更新
相关文章:

JDBC知识点全面总结2:JDBC实战编写CRUD
二.JDBC知识点全面总结1:JDBC实战编写CRUD 1.JDBC重要接口? 2.Driver和DriverMangement的关系? 3.JAVA与数据库连接 4.JAVA中使用statement来执行sql语句时,拼接字符串的sql注入问题? 5.使用preparedstatement进行…...

java - 数据结构,算法,排序
一、概念 1.1、排序 排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 平时的上下文中,如果提到排序,通常指的是排升序(非降序)。 通常意义上的排序&#…...

二叉树经典14题——初学二叉树必会的简单题
此篇皆为leetcode、牛客中的简单题型和二叉树基础操作,无需做过多讲解,仅付最优解。有需要的小伙伴直接私信我~ 目录 1.二叉树的节点个数 2.二叉树叶子节点个数 3.二叉树第K层节点个数 4.查找值为X的节点 5.leetcode——二叉树的最大深度 6.leetc…...

基于NMOSFET的电平转换电路设计
一、概述: 在单片机系统中,5V、3.3V是芯片常用的电平。而在传输协议中(如IIC、SPI等协议),存在芯片与芯片的高电平和低电平定义的范围不一样,所以需要存在一个电平转换电路,来使芯片与芯片之间顺利的传输。 二、前置…...
mongoDB搭建集群
(学习自黑马)下载对应linux版本MongoDB源码下载地址:https://www.mongodb.com/download-center#community目前在一台服务器开三个端口模拟三个mongodb, 配置一个主节点27017,一个从节点27018,一个仲裁者27019配置主节点,副节点,仲裁节点(下面的创建文件一共有三份,通…...

[深入理解SSD系列 闪存2.1.5] NAND FLASH基本读操作及原理_NAND FLASH Read Operation源码实现
前言 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义, 下面先来个热身: 问1. 原理图上NAND FLASH只有数据线,怎么传输地址? 答1.在DATA0~DATA7上既传输数据,又传输地址 当ALE为高电平时传输的是地址, 问2. 从NAND FLASH芯片手册可知,要…...
最新 JVM 面试经典问题
文章目录 说说JVM的内存布局?知道new一个对象的过程吗?知道双亲委派模型吗?说说有哪些垃圾回收算法?标记-清除复制算法标记-整理那么什么是GC ROOT?有哪些GC ROOT?垃圾回收器了解吗?年轻代和老年代都有哪些垃圾回收器?G1的原理了解吗?什么时候会触发YGC和FGC?对象什么…...

HTML5 和 CSS3 的新特性
目标能够说出 3~5 个 HTML5 新增布局和表单标签能够说出 CSS3 的新增特性有哪些HTML5新特性概述HTML5 的新增特性主要是针对于以前的不足,增加了一些新的标签、新的表单和新的表单属性等。 这些新特性都有兼容性问题,基本是 IE9 以上版本的浏览器才支持&…...

Vulnhub系列:FristLeaks
一、配置靶机环境以往的靶机,本人是在virtual box中,去配置,和vm上的kali进行联动,但是这个靶机需要DHCP,以往的方式可能不太行了,或者可以在virtual box中桥接成统一网卡。下面介绍下本人最有用的方法&…...

XWiki Annotation Displayer 存在任意代码执行漏洞(CVE-2023-26475)
漏洞描述 XWiki 是一个开源的企业级 Wiki 平台,Annotation Displayer 是 XWiki 中的一个插件,用于在 XWiki 页面上显示注释和其他相关内容。 该项目受影响版本存在任意代码执行漏洞,由于Annotation Displayer 对 Groovy 宏的使用没有限制&a…...

数字孪生GIS智慧风场Web3D可视化运维系统
随着国家双碳目标的实施,新能源发电方式逐渐代替了污染大气层的火力发电,其中风力发电相比于光伏发电具有能量密度高、发电小时数长、生命周期达20-25年之久等独特的优势。风能取之不尽、用之不竭,在新型能源互联网下,风力发电有可…...
Retrofit核心源码分析(二)- 网络请求和响应处理
在上一篇文章中,我们详细分析了 Retrofit 中的注解解析和动态代理实现,本篇文章将继续深入研究 Retrofit 的核心源码,重点分析 Retrofit 如何进行网络请求和响应处理。 网络请求 在使用 Retrofit 发起网络请求时,我们可以通过定…...

STM32启动模式讲解与ICP下载电路
一、官方提供的启动模式说明硬件BOOT引脚接法表格从表格可以看出有三种启动模式,然后对应这不同的存储器启动,那我们现在疑问为啥有三种不能只有一种就好,还有存储器启动区域怎么区分,有些乱,带着这些疑问,…...

5款小巧好用的电脑软件,让你的工作生活更加高效!
不得不说良心好软件让大家好评连连,爱不释手,不像某些软件自带广告弹窗。这期就由我给大家安利几款电脑中的得力助手,看看你都用过几个? 1.桌面管理神器——Coodesker Coodesker是一款免费小巧、无广告,功能简单的桌…...
python线程池
假设我们必须多线程任务创建大量线程。 由于线程太多,因此可能会有很多性能问题,这在计算上会是最昂贵的。 一个主要问题可能是吞吐量受限。 我们可以通过创建一个线程池来解决这个问题。 一个线程池可以被定义为一组预先实例化和空闲的线程,…...
深入浅出PaddlePaddle函数——paddle.ones_like
分类目录:《深入浅出PaddlePaddle函数》总目录 相关文章: 深入浅出PaddlePaddle函数——paddle.Tensor 深入浅出PaddlePaddle函数——paddle.ones 深入浅出PaddlePaddle函数——paddle.zeros 深入浅出PaddlePaddle函数——paddle.full 深入浅出Padd…...

计算机组成原理(海明码效验)(3)-软件设计(二十四)
计算机组成原理(2)-软件设计(二十三)https://blog.csdn.net/ke1ying/article/details/129394115 一、总线 分为 内部总线、系统总线、外部总线。 内部总线:指芯片级别的总线,连接各个芯片。 系统总线&a…...
Linux2.2网络驱动程序编写
一.Linux系统设备驱动程序概述1.1 Linux设备驱动程序分类1.2 编写驱动程序的一些基本概念二.Linux系统网络设备驱动程序2.1 网络驱动程序的结构2.2 网络驱动程序的基本方法2.3 网络驱动程序中用到的数据结构2.4 常用的系统支持三.编写Linux网络驱动程序中可能遇到的问题3.1 中断…...

像素密度提升33%,Quest Pro动态注视点渲染原理详解
在Connect 2022上,Meta发布了Quest Pro,并首次在VR中引入动态注视点渲染(ETFR)功能,这是一种新型图形优化技术,特点是以用户注视点为中心,动态调节VR屏幕的清晰度(注视点中心最清晰、…...

【Linux实战篇】二、在Linux上部署各类软件
一、实战章节:在Linux上部署各类软件 二、MySQL数据库管理系统安装部署【简单】 简介 MySQL数据库管理系统(后续简称MySQL),是一款知名的数据库系统,其特点是:轻量、简单、功能丰富。 MySQL数据库可谓是…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...