当前位置: 首页 > news >正文

JDBC常见用法

JDBC中主要的类及常用方法

Class类

Class类全称java.lang.Class,Java程序运行时会自动创建程序中的每个类的Class对象,通过Class类的方法,可以得到程序中每个类的信息。Class类方法主要包括:

public static Class forName(String className):该方法根据给定的字符串参数返回相应的Class对象。例:Class.forName("com.mysql.jdbc.Driver")的作用是加载Oracle驱动。

DriverManager类

DriverManager类在用户程序和数据库系统之间维护着与数据库驱动程序之间的连接。它实现驱动程序的装载、创建与数据库系统连接的Connection类对象。DriverManager类的方法主要包括

public static Connection getConnection(String url, String user, String password)
//根据url、数据库登录的用户名、密码获取一个数据库的连接对象。

Connection接口

Connection用于管理到指定数据库的连接。

Connection con=DriverManager.getConnection (url, username, password);

Connetction类中重要的成员方法包括:

createStatement()方法:创建Statement类的实例。

prepareStatement()方法:创建PreparedStatement类的实例。

close():立即释放此Connection对象的数据库和JDBC资源,而不是等待它们被自动释放

Statement接口

Statement数据库操作类提供执行数据库操作的方法,如更新、查询数据库记录等。

Statement对象的创建方式如下:

Statement stmt=con.createStatement();

Statement类中重要的成员方法包括:

executeQuery()方法:它用来执行一个查询语句,参数是一个String对象,就是一个SELECT语句。它的返回值是ResultSet类的对象,查询结果封装在该对象中

ResultSet接口

ResultSet结果集类提供对查询结果集进行处理的方法。例:

ResultSet rs=stmt.executeQuery(" select * from users ");

ResultSet对象维持着一个指向表格的行的指针,开始时指向表格的起始位置(第一行之前)。 ResultSet类常用的方法包括:

next()方法:光标移到下一条记录,返回一个boolean值。

previous()方法:光标移到前一条记录。

getXXX()方法:获取指定类型的字段的值。调用方式 getXXX("字段名") 或 getXXX(int i)。i值从1开始表示结果集中第一列的字段。

close():关闭ResultSet对象

JDBC的时间处理

  1. 日期类型用java.sql.Date 
  2. 时间类型用java.sql.Time 
  3. 日期/时间类型用java.sql.Timestamp

getTimestamp()可以把年月日时分秒都取出来,getDate()只能取出年月日,getTime()只能取出时分秒。

要把JDBC的日期/时间类型转换为字符串:

Timestamp timeStamp = rs.getTimestamp("birth");		//通过数据库访问获取到该数据
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //格式化日期
String str = sdf.format(timeStamp); 

 JDBC封装工具类

无论是对数据进行查询操作,还是进行增删改操作,都需要打开连接,关闭资源等操作,因此,可以把对把打开连接和关闭连接封装到一个工具类

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtil {//该段代码完成加载数据库驱动,整个程序只需要加载一次,所以放在静态块中。static{try {Class.forName("com.mysql.jdbc.Driver");//oracle数据库驱动程序} catch (ClassNotFoundException e) {e.printStackTrace();}}//获取数据库连接方法public static Connection getConnection() throws SQLException{String url = "jdbc:mysql://127.0.0.1:3306/neuedu";Connection conn = DriverManager.getConnection(url,"root","root");return conn;}//释放资源(方法重载)public static void close(Statement st,Connection conn){try{if(st != null){try {st.close();} catch (SQLException e) {                        e.printStackTrace();}}}finally{if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}public static void close(ResultSet rs, Statement st, Connection conn) {try {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}} finally {try {if (st != null) {try {st.close();} catch (SQLException e) {e.printStackTrace();}}} finally {if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}}
}

SQL注入问题

 使用Statement对象查询数据库时,由于定义的SQL语句是拼接的,有可能出现SQL注入问题。所谓SQL注入,就是通过把SQL命令插入到查询字符串,最终达到欺骗服务器执行恶意的SQL命令

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SqlInject {    public static void login (String name,String pwd) throws SQLException{Connection conn = null;Statement st = null;ResultSet rs = null;try{conn = DBUtil.getConnection();st = conn.createStatement();// 因为拼接SQL语句导致的SQL注入式攻击风险String sql = "SELECT * FROM t_user WHERE NAME='"+name+"' AND PWD='"+pwd+"'";rs = st.executeQuery(sql); if(rs.next()){System.out.println("登录成功..");}else{System.out.println("登录失败..");}}finally{DBUtils.close(rs, st, conn);}}public static void main(String[] args) throws SQLException {login("123123", "sadfsdf or 1=1");//注入SQL                }
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 下载安装VSCode并添加插件作为仓颉编程入门编辑器
  • Tensorflow入门实战 T09进行猫狗识别2
  • maven 私服搭建(tar+docker)
  • conda 复现论文部署环境常用操作
  • 缓存弊处的体验:异常
  • NEEP-EN2-2019-Text4
  • 敲详细的springframework-amqp-rabbit源码解析
  • 通信流程:https【SSL/TLS】,git仓库【https/SSH】,蓝牙【面对面快传/AirDrop】
  • 【BUG】已解决:To update, run: python.exe -m pip install --upgrade pip
  • 【学习css3】使用flex和grid实现等高元素布局
  • 插入排序和希尔排序
  • 【后端开发】身份和访问管理IAM(MFA,OTP,JWT,OAuth,SSO)
  • python—爬虫的初步了解
  • 核函数支持向量机(Kernel SVM)
  • IDEA中常用的快捷键
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【前端学习】-粗谈选择器
  • iOS编译提示和导航提示
  • miaov-React 最佳入门
  • nodejs:开发并发布一个nodejs包
  • SpringCloud集成分布式事务LCN (一)
  • springMvc学习笔记(2)
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • webpack入门学习手记(二)
  • 电商搜索引擎的架构设计和性能优化
  • 订阅Forge Viewer所有的事件
  • 对超线程几个不同角度的解释
  • 浮动相关
  • 基于Android乐音识别(2)
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 思否第一天
  • 探索 JS 中的模块化
  • 在Docker Swarm上部署Apache Storm:第1部分
  • #LLM入门|Prompt#3.3_存储_Memory
  • #QT(TCP网络编程-服务端)
  • (16)Reactor的测试——响应式Spring的道法术器
  • (C语言)fgets与fputs函数详解
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Java数据结构)ArrayList
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (接口自动化)Python3操作MySQL数据库
  • (力扣题库)跳跃游戏II(c++)
  • (南京观海微电子)——示波器使用介绍
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)大型网站架构演变和知识体系
  • ***检测工具之RKHunter AIDE
  • *2 echo、printf、mkdir命令的应用
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET 8.0 发布到 IIS