上海网站排名优化/新媒体seo培训
二.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数据库可谓是…...

基于SpringBoot的学生会管理系统 源码
StudentUnionManagementSystem 基于SpringBoot的学生会管理系统 源码 链接 目录StudentUnionManagementSystem介绍软件架构使用说明1.页面登录2.首页3.成员信息管理4.角色信息管理5.权限管理6.活动管理7.文件管理8.活动展示介绍 学生会管理系统 SpringBoot Mybatis-plus shir…...

[league/glide]两行代码实现一套强大的图片处理HTTP服务
只要两行代码,就能实现类似对象存储云提供的基于参数的图片处理,比如裁剪、放大、水印、旋转等等。 我们经常使用第三方的对象存储服务,比如七牛云或阿里云,他们都提供了“智能媒体服务”,其实就是在链接上加上各种参…...

Kafka 消费者组
Kafka 消费者组Consumer数位移重平衡消费者组 (Consumer Group) : 可扩展且容错性的消费者机制 一个组内可能有多个消费者 (Consumer Instance) : 共享一个公共 ID (Group ID)组内的所有消费者协调消费订阅主题 (Subscribed Topics) 的所有分区 (Partition)每个分区只能由同个…...

高效学 C++|组合类的构造函数
设计好MyString类后,就可以像使用普通类型一样使用它了。例如,类的对象可以像普通的变量一样作为另一个类的数据成员。【例1】 MyString类的对象作为CStudent类的数据成员。1. //MyString类的定义省略 2. //注意:保留其构造函数、析构函数、…...

Java使用Springboot+Mybatis构建第一个项目
一、java安装:安装 Java1.8环境 maven3.6.1环境 Gradle-6.9.1环境 IntelliJ IDEA 2022.1.3 下载旗舰版(因为包含springboot)二、项目构建-数据库是sqlserver:1、打开idea,点击File->New->Project,选中…...

L2-007 家庭房产 L1-007 念数字
给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。 输入格式: 输入第一行给出一个正整数N(≤1000),随后N行,每行按下列格式给出一个人的房产: 编…...

1/4、1/2、整车悬架天棚主动控制仿真分析合集
目录 前言 1. 1/4悬架系统 1.1数学模型 1.2仿真分析 2. 1/2悬架系统 2.1数学模型 2.2仿真分析 3. 整车悬架系统 3.1数学模型 3.2仿真分析 4.总结 参考文献 前言 对于天棚控制相比大家不陌生,它是由美国的Karnopp提出,利用假设的与天棚固连…...

【微信小程序项目实战】TodoList-项目主体搭设(2)
目录JS 部分数据 dataonShow输入框双向绑定保存与读取添加新的待办事项完成待办事项删除待办事项WXML顶部输入框主体回到顶部按钮完整代码JSWXMLWXSSJS 部分 为便于分析各个组件的相互作用与原理,故先从 JS 入手,而后再完善 HTML 部分 以下所有代码&…...

23种设计模式-迭代器模式(安卓应用场景介绍)
迭代器模式是一种行为型设计模式,它允许你在不暴露集合对象内部结构的情况下遍历集合中所有元素。在本文中,我们将介绍迭代器模式的概念和原理,提供一个基于Java的示例,并探讨在Android应用程序开发中的实际应用。 迭代器模式的概…...

面试 - 软件工程体系
今天是我人生中的第二次面试,第一次面试到技术问题。 面试公司:无锡信捷电气股份有限公司 面试时间:2023 年 3 月 6 日 15:30 面试地点:西安工程大学(临潼校区)D-188 在技术面中,我表现的不是很…...