JavaWeb笔记:JDBC总结

JavaWeb笔记:JDBC总结

目录

JavaWeb笔记:JDBC总结

一、JDBC概述

二、开发一个JDBC程序(重要)

三、JDBC常用的类和接口详解

1、java.sql.Drivermanager类 : 创建连接

2、java.sql.Connection接口:一个连接

3、java.sql.Statement接口: 操作sql语句,并返回相应结果的对象(小货车)

4、java.sql.ResultSet接口: 结果集(客户端存表数据的对象)

5、释放资源 

四、使用JDBC实现CRUD操作

五、实现一个用户登录的功能 ​

六、SQL注入问题:preparedStatement


一、JDBC概述


为什么要使用JDBC?

JDBC:java database connectivity SUN公司提供的一套操作数据库的标准规范。
JDBC与数据库驱动的关系:接口与实现的关系。

JDBC规范(掌握四个核心对象):
DriverManager:用于注册驱动
Connection: 表示与数据库创建的连接
Statement: 操作数据库sql语句的对象
ResultSet: 结果集或一张虚拟表


开发一个JDBC程序的准备工作:
> JDBC规范在哪里:
 JDK中:
java.sql.*;
javax.sql.*;


> 数据库厂商提供的驱动:jar文件
  *.jar

二、开发一个JDBC程序(重要)


实现查询数据库中的数据显示在java的控制台中

1、创建数据库表,并向表中添加测试数据
create database day06;
use day06;

create table users(
    id int primary key auto_increment,
    name varchar(40),
    password varchar(40),
    email varchar(60),
    birthday date
)character set utf8 collate utf8_general_ci;

insert into users(name,password,email,birthday) values('zs','123456','zs@sina.com','1980-12-04');
insert into users(name,password,email,birthday) values('lisi','123456','lisi@sina.com','1981-12-04');
insert into users(name,password,email,birthday) values('wangwu','123456','wangwu@sina.com','1979-12-04');

2、创建java project项目,添加数据库驱动(*.jar)

3、实现JDBC操作
        //1、注册驱动
        //2、创建连接
        //3、得到执行sql语句的Statement对象
        //4、执行sql语句,并返回结果
        //5、处理结果
        //6关闭资源
 

三、JDBC常用的类和接口详解


1、java.sql.Drivermanager类 : 创建连接

a、注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用
原因有2个:
> 导致驱动被注册2次。
> 强烈依赖数据库的驱动jar
解决办法:
Class.forName("com.mysql.jdbc.Driver");
b、与数据库建立连接
static Connection getConnection(String url, String user, String password) 
          试图建立到给定数据库 URL 的连接。

getConnection("jdbc:mysql://localhost:3306/day06", "root", "root");

URL:SUN公司与数据库厂商之间的一种协议。
jdbc:mysql://localhost:3306/day06
协议 子协议  IP :端口号 数据库
mysql: jdbc:mysql://localhost:3306/day14 或者 jdbc:mysql:///day14(默认本机连接)
oracle: jdbc:oracle:thin:@localhost:1521:sid


        Properties info = new Properties();//要参考数据库文档
        info.setProperty("user", "root");
        info.setProperty("password","root");

getConnection(String url, Properties info) 

getConnection(String url) 
DriverManager.getConnection("jdbc:mysql://localhost:3306/day14?user=root&password=root");

 

2、java.sql.Connection接口:一个连接


接口的实现在数据库驱动中。所有与数据库交互都是基于连接对象的。

Statement  createStatement(); //创建操作sql语句的对象

3、java.sql.Statement接口: 操作sql语句,并返回相应结果的对象(小货车)


接口的实现在数据库驱动中。用于执行静态 SQL 语句并返回它所生成结果的对象。 
ResultSet  executeQuery(String sql) 根据查询语句返回结果集。只能执行select语句。
 int executeUpdate(String sql) 根据执行的DML(insert update delete)语句,返回受影响的行数。
boolean execute(String sql)  此方法可以执行任意sql语句。返回boolean值,表示是否返回ResultSet结果集。仅当执行select语句,且有返回结果时返回true, 其它语句都返回false;


4、java.sql.ResultSet接口: 结果集(客户端存表数据的对象)


a、封装结果集的。
提供一个游标,默认游标指向结果集第一行之前。
调用一次next(),游标向下移动一行。
提供一些get方法。

封装数据的方法
Object getObject(int columnIndex); 根据序号取值,索引从1开始
Object getObject(String ColomnName); 根据列名取值。

将结果集中的数据封装到javaBean中
java的数据类型与数据库中的类型的关系
byte          tityint
short         smallint
int           int
long          bigint
float         float
double        double
String        char varchar 
        Date         date


boolean next()    将光标从当前位置向下移动一行
int getInt(int colIndex)    以int形式获取ResultSet结果集当前行指定列号值
int getInt(String colLabel)    以int形式获取ResultSet结果集当前行指定列名值
float getFloat(int colIndex)    以float形式获取ResultSet结果集当前行指定列号值
float getFloat(String colLabel)    以float形式获取ResultSet结果集当前行指定列名值
String getString(int colIndex)    以String 形式获取ResultSet结果集当前行指定列号值
String getString(String colLabel)    以String形式获取ResultSet结果集当前行指定列名值
Date getDate(int columnIndex);  
Date getDate(String columnName);
void close()    关闭ResultSet 对象

b、可移动游标的方法
 boolean next()  将光标从当前位置向前移一行。 
     boolean previous() 
             将光标移动到此 ResultSet 对象的上一行。 
     boolean absolute(int row) 参数是当前行的索引,从1开始
             根据行的索引定位移动的指定索引行。
 void afterLast() 
          将光标移动到末尾,正好位于最后一行之后。 
 void beforeFirst() 
          将光标移动到开头,正好位于第一行之前。 

 

5、释放资源 


资源有限,要正确关闭。
      


四、使用JDBC实现CRUD操作

import org.junit.Test;import javax.jws.soap.SOAPBinding;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;public class testCRUD {@Testpublic void testSelect() throws Exception {//1.注册驱动/*不建议使用,会导致驱动被创建两次,强烈依赖数据库的驱动jarDriverManager.registerDriver(new com.mysql.jdbc.Driver());*///用反射加载驱动Class.forName("com.mysql.jdbc.Driver");//2.获取连接ConnectionConnection connection;connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/day06","root","ylh013954");//3.得到执行sql语句的对象StatementStatement statement;statement=connection.createStatement();//4.执行sql语句,并返回结果ResultSet resultSet;resultSet=statement.executeQuery("SELECT *FROM users");List<User> list=new ArrayList<>();//5.处理结果while (resultSet.next()){User user=new User();user.setId(resultSet.getInt("id"));user.setName(resultSet.getString("name"));user.setPassword(resultSet.getString("password"));user.setEmail(resultSet.getString("email"));user.setBirthday(resultSet.getDate("birthday"));list.add(user);}//6.关闭资源resultSet.close();statement.close();connection.close();for (User u:list) {System.out.println(u);}}@Testpublic void testSelect1() throws Exception {//1.注册驱动/*不建议使用,会导致驱动被创建两次,强烈依赖数据库的驱动jarDriverManager.registerDriver(new com.mysql.jdbc.Driver());*///用反射加载驱动Class.forName("com.mysql.jdbc.Driver");//2.获取连接ConnectionConnection connection;connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/day06","root","ylh013954");//3.得到执行sql语句的对象StatementStatement statement;statement=connection.createStatement();//4.执行sql语句,并返回结果ResultSet resultSet;resultSet=statement.executeQuery("SELECT *FROM users");List<User> list=new ArrayList<>();resultSet.afterLast();resultSet.previous();//5.处理结果//while (resultSet.next()){User user=new User();user.setId(resultSet.getInt("id"));user.setName(resultSet.getString("name"));user.setPassword(resultSet.getString("password"));user.setEmail(resultSet.getString("email"));user.setBirthday(resultSet.getDate("birthday"));list.add(user);// }//6.关闭资源resultSet.close();statement.close();connection.close();System.out.println(user);}@Testpublic void testInsert() throws Exception {//1.注册驱动/*不建议使用,会导致驱动被创建两次,强烈依赖数据库的驱动jarDriverManager.registerDriver(new com.mysql.jdbc.Driver());*///用反射Class.forName("com.mysql.jdbc.Driver");//2.获取连接ConnectionConnection connection;connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/day06","root","ylh013954");//3.得到执行sql语句的对象StatementStatement statement;statement=connection.createStatement();//4.执行sql语句,并返回结果int i=statement.executeUpdate("INSERT INTO users VALUES( 4,'tom','123','tom@163.com','2015-09-28')");if (i>0){System.out.println("Success");}//6.关闭资源statement.close();connection.close();}@Testpublic void testUpdate() throws Exception {//1.注册驱动/*不建议使用,会导致驱动被创建两次,强烈依赖数据库的驱动jarDriverManager.registerDriver(new com.mysql.jdbc.Driver());*///用反射Class.forName("com.mysql.jdbc.Driver");//2.获取连接ConnectionConnection connection;connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/day06","root","ylh013954");//3.得到执行sql语句的对象StatementStatement statement;statement=connection.createStatement();//4.执行sql语句,并返回结果int i=statement.executeUpdate("UPDATE users SET NAME='jerry',PASSWORD='333',email='jerry@163.com' WHERE id=4;");if (i>0){System.out.println("Success");}//6.关闭资源statement.close();connection.close();}@Testpublic void testDelete() throws Exception {//1.注册驱动/*不建议使用,会导致驱动被创建两次,强烈依赖数据库的驱动jarDriverManager.registerDriver(new com.mysql.jdbc.Driver());*///用反射Class.forName("com.mysql.jdbc.Driver");//2.获取连接ConnectionConnection connection;connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/day06","root","ylh013954");//3.得到执行sql语句的对象StatementStatement statement;statement=connection.createStatement();//4.执行sql语句,并返回结果int i=statement.executeUpdate("DELETE FROM users WHERE id=4");if (i>0){System.out.println("Success");}//6.关闭资源statement.close();connection.close();}
}

 

 

 

五、实现一个用户登录的功能 

 

这里用dbinfo.properties文件输入JDBC驱动信息。把对应的用户名、密码、URL换成你自己的就OK。

User:

import java.util.Date;public class User {private int id;private String name;private String password;private String email;private Date birthday;public User() {}public User(int id, String name, String password, String email, Date birthday) {this.id = id;this.name = name;this.password = password;this.email = email;this.birthday = birthday;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +", email='" + email + '\'' +", birthday=" + birthday +'}';}
}

 

Login:

import java.util.Scanner;public class Login {public static void main(String[] args) {Scanner in=new Scanner(System.in);System.out.println("请输入用户名:");String name=in.next();System.out.println("请输入密码:");String password=in.next();DoLogin doLogin=new DoLogin();User user=doLogin.findUser(name,password);if (user!=null){System.out.println("欢迎使用"+user.getName());}else {System.out.println("用户名或密码错误");}}
}

 

Dlogin:

import com.xy.jdbc.User;
import com.xy.login.DBUtils;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;public class DoLogin {public User findUser(String name,String password){Connection connection=null;PreparedStatement statement=null;ResultSet resultSet=null;User user=null;try {connection= DBUtils.getConnection();String sql="SELECT *FROM users WHERE name= ? AND password=?";statement=connection.prepareStatement(sql);//给?赋值statement.setString(1,name);statement.setString(2,password);resultSet=statement.executeQuery(sql);if (resultSet.next()){user=new User();user.setId(resultSet.getInt(1));user.setName(resultSet.getString(2));user.setPassword(resultSet.getString(3));user.setEmail(resultSet.getString(4));user.setBirthday(resultSet.getDate(5));}} catch (Exception e) {e.printStackTrace();}finally {DBUtils.closeAll(resultSet,statement,connection);}return null;}}

 

DBUtils:

import java.sql.*;
import java.util.ResourceBundle;public class DBUtils {private static String driverClass;private static String url;private static String user;public static String password;static {//绑定文件ResourceBundle resourceBundle=ResourceBundle.getBundle("dbinfo");//给上面4个变量赋值driverClass=resourceBundle.getString("driverClass");url=resourceBundle.getString("url");user=resourceBundle.getString("user");password=resourceBundle.getString("password");try {Class.forName(driverClass);}catch (Exception e){e.printStackTrace();}}//得到连接的方法public static Connection getConnection() throws Exception {Class.forName("com.mysql.jdbc.Driver");Connection connection= DriverManager.getConnection(url,user,password);return connection;}//关闭资源的方法public static void closeAll(ResultSet resultSet, Statement statement, Connection connection){if (resultSet!=null){try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}resultSet=null;}if (statement!=null){try {statement.close();} catch (SQLException e) {e.printStackTrace();}statement=null;}if (connection!=null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}connection=null;}}}

 

 

dbinfo.properties:

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day06
user=root
password=ylh013954

 

 

 

 

 

六、SQL注入问题:preparedStatement


preparedStatement:预编译对象, 是Statement对象的子类。
特点:
性能要高
会把sql语句先编译
sql语句中的参数会发生变化,过滤掉用户输入的关键字。

补充例子:
 

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

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

相关文章

谷歌街景15年乾坤大挪移!带你穿越法老的金字塔

来源&#xff1a;机器学习研究组订阅最近两年多&#xff0c;整个世界都被一个共同对手折腾得够呛。有人咬牙坚持、有人躺平摆烂&#xff0c;有人祈求上天&#xff0c;还有人离开了这个世界。更多的人们则逐渐意识到&#xff0c;原来所谓「Good Old Times」离我们竟然如此之近&a…

如何构建可信GNN?最新综述来了!可信图神经网络:维度,方法,趋势

来源&#xff1a;Monash University作者&#xff1a;He Zhang&#xff0c;Bang Wu前言在过去的几年里&#xff0c;以神经网络为首的人工智能技术通过对不同类型数据的深入挖掘已经深刻地改变了人类的生活并极大地推动了社会发展的进程 [1]。作为人工智能领域最活跃的研究方向之…

JavaWeb:XML总结

JavaWeb:XML总结 目录 JavaWeb:XML总结 一&#xff1a;什么是XML&#xff1f; 二&#xff1a;xml语法&#xff1a; 三&#xff1a; xml约束&#xff1a; 四&#xff1a;XML解析思想&#xff1a; 一&#xff1a;什么是XML&#xff1f; XML&#xff1a;eXtensible Markup La…

JavaWeb:tomcat服务器安装总结及Http协议

JavaWeb:tomcat服务器安装总结 目录 JavaWeb:tomcat服务器安装总结 一&#xff1a;服务器端概述&#xff1a; 二&#xff1a;Tomcat下载&#xff1a; 三&#xff1a;安装&#xff1a; 四&#xff1a;HTTP问题&#xff1a; 五&#xff1a;深入了解tomcat服务器&#xff1…

深度知识的6个维度:如何让人工智能真正理解世界?

智能的真正标志不是知识&#xff0c;而是想象力。来源&#xff1a;AI科技评论作者&#xff1a;Gadi Singer编译&#xff1a;王玥编辑&#xff1a;陈彩娴什么知识让我们变得聪明&#xff1f;我们用来理解世界、解释新体验和做出深思熟虑的选择的认知结构是什么&#xff1f;定义一…

2013年图灵奖得主Leslie Lamport:如何写出数学上完美的算法

来源&#xff1a;新智元图灵奖得主、分布式系统先驱、LaTeX之父Leslie Lamport认为&#xff0c;对于程序员而言&#xff0c;对数学思维的强调永远不会过分&#xff0c;要写出好代码&#xff0c;不能惧怕数学。Leslie Lamport可能不是一个家喻户晓的名字&#xff0c;但一提到和他…

Python绘制图形之Matplotllib绘图

Python绘制图形之Matplotllib绘图 目录 Python绘制图形之Matplotllib绘图 一、绘制二维函数图 1.1 绘制 f(x)sin2(x−2)e−x2 1.2 、绘制 sigmoid函数图: f(x)11e−x 1.3、绘制正态分布图 二、绘制三维图 2.1 绘制三维螺旋图 2.2 绘制三维线性点图 2.3 绘制三维柱状图 2…

新发现罕见生命密码:基因读取的另一套代码

来源&#xff1a;生物通令人震惊但让人困惑的是&#xff0c;我们所知的生命密码使用了61个不同的三字母密码子&#xff0c;只产生了20个氨基酸&#xff0c;这意味着许多密码子被用来描述同一件事。新的研究表明&#xff0c;大脑和睾丸似乎非常适应使用多种不同种类的遗传密码来…

《自然-机器智能》:神经形态技术可使大型深度学习网络节能16倍

来源&#xff1a; 学术头条受生物大脑机制的启发&#xff0c;研究人员一直在提高人工神经网络的性能效率和计算要求。一项新的研究表明&#xff0c;对于大型深度学习网络&#xff0c;神经形态技术的能源效率有望达到其他人工智能系统的 16 倍。格拉茨技术大学&#xff08;TU Gr…

康奈尔计算计学院院长Kavita Bala:「元宇宙」算什么?上帝之眼或将通过 AI 诞生...

来源&#xff1a;AI科技评论编译&#xff1a;王玥编辑&#xff1a;陈彩娴在今年斯坦福HAI实验室的春季会议上&#xff0c;康奈尔计算机学院院长Kavita Bala以“视觉外观和理解&#xff1a;从微米分辨率到世界级”为题&#xff0c;就她在数字化现实世界方面的研究进行了精彩的演…

王浩:哥德尔思想概说

来源&#xff1a;本文原文刊于《科学文化评论》2004年第6期撰文&#xff1a;王浩翻译&#xff1a;邢滔滔译者按本文选自王浩最后一本著作A Logical Journey—From Gdel to Philosophy (Cambridge: The MIT Press, 1996&#xff09;的引言部分&#xff0c;有删节&#xff0c;题目…

八大排序:Java实现八大排序及算法复杂度分析

目录 QUESTION:八大排序:Java实现八大排序及算法复杂度分析 ANSWER: 一&#xff1a;冒泡排序 1.算法分析 2.时间复杂度分析 3.代码 二&#xff1a;选择排序 1.算法分析 2.时间复杂度分析 3.代码 三&#xff1a;插入排序 1.算法分析 2.时间复杂度分析 3.代码 四&a…

网友:看完Jeff Dean新论文,我再也不相信大厂的鬼话了

来源&#xff1a;数学中国文字&#xff1a;乔叶配图 &#xff1a;乔叶排版&#xff1a;余弟宗璇「我相信他们得到的数字是准确的&#xff0c;他们确实做了工作并得到了结果…… 但这样真的好吗&#xff1f;」一名机器学习研究者的灵魂发问&#xff0c;今天成为了整个社区最热门…

CV未来在这68张图上?Google Brain深扒ImageNet:顶级模型全都预测失败

来源&#xff1a;新智元编辑&#xff1a;LRS【新智元导读】ImageNet的标签问题一直为人诟病&#xff0c;最近Google Brain全面分析了基准内遗留的历史问题&#xff0c;并找出了所有顶级模型全都预测失败的68张图片&#xff0c;或许未来CV想取得突破&#xff0c;先得攻破这68关&…

谷歌夺回AI画语权,机器的想象力达到全新高度,网友:DALL·E 2诞生一个月就过时了?...

来源&#xff1a;量子位在让AI搞创作这件事上&#xff0c;谷歌和OpenAI正面刚起来了。这不&#xff0c;震惊全网的DALLE 2才新鲜出炉一个月&#xff0c;谷歌就派出名为Imagen的选手来打擂台。直接上图对比&#xff0c;左边是谷歌Imagen选手眼中的“猫猫绊倒人类雕像”&#xff…

Linux安装MySQL的完整步骤并有关MySQL8.0版本的问题方法

目录 QUESTION:Linux安装MySQL的完整步骤? ANSWER: 一&#xff1a;使用wget 直接下载 二&#xff1a;安转软件源&#xff0c;将platform-and-version-specific-package-name 替换为你下载的rpm名 三&#xff1a;安装mysql服务端 四&#xff1a;首先启动mysql 五&#x…

研究遭质疑,Jeff Dean回应:我们本就不是为得到新SOTA,成本计算也搞错了

来源&#xff1a;机器之心编辑&#xff1a;杜伟、陈萍对于 Jeff Dean 的回复&#xff0c;你认同吗&#xff1f;昨日&#xff0c;整个社区最热门的话题无外乎是 reddit 上一名机器学习研究者对谷歌 AI 负责人 Jeff Dean 参与论文的质疑。这篇论文是《An Evolutionary Approach t…

全脑地图:单个记忆被拆分存储在多个相连的大脑区域

来源&#xff1a;神经生物学根据一项创新的脑域映射研究&#xff0c;单一的记忆被存储在许多连接的大脑区域。创新的脑成像研究表明&#xff0c;“记忆印记”&#xff0c;编码记忆的神经元集合&#xff0c;广泛分布&#xff0c;包括在以前没有意识到的区域。麻省理工学院皮考尔…

李德毅 | 新一代人工智能如何从传统人工智能中脱颖而出

来源&#xff1a;图灵人工智能 作者&#xff1a;李德毅 中国工程院院士、CAAI名誉理事长、主线科技首席科学家2021年4月10日&#xff0c;“吴文俊人工智能科学技术奖”十周年颁奖盛典在北京举办。颁奖典礼上&#xff0c;中国工程院院士、中国人工智能学会名誉理事长李德毅荣获…

【强基固本】现在的人工智能是否走上了数学的极端?

来源&#xff1a;知乎—谢凌曦地址&#xff1a;https://www.zhihu.com/question/519393525/answer/2430233113“强基固本&#xff0c;行稳致远”&#xff0c;科学研究离不开理论基础&#xff0c;人工智能学科更是需要数学、物理、神经科学等基础学科提供有力支撑&#xff0c;为…