JDBC(一)——statement对象、PreparedStatement对象
文章目录
- 1. 数据库驱动
- 2. JDBC
- 3. 第一个JDBC程序
- 4. statement对象
- 4.1 简述
- 4.2 CRUD操作
- 4.3 代码实现
- 5. PreparedStatement对象
1. 数据库驱动
驱动:声卡,显卡、数据库
我们的程序会通过 数据库 驱动,和数据库打交道!
2. JDBC
Java数据库连接(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
这些规范的实现由具体的厂商去做
对于开发人员来说,我们只需要掌握 JDBC 接口的操作即可
3. 第一个JDBC程序
(1)SQLyog中创建测试数据库
CREATE DATABASE jdbcStudy CHARACTER SET utf8 COLLATE utf8_general_ci;
USE jdbcStudy;
CREATE TABLE users(
id INT PRIMARY KEY,
NAME VARCHAR(40),
PASSWORD VARCHAR(40),
email VARCHAR(60),
birthday DATE
);INSERT INTO users(id,NAME,PASSWORD,email,birthday)
VALUES(1,'zhansan','123456','zs@sina.com','1980-12-04'),
(2,'lisi','123456','lisi@sina.com','1981-12-04'),
(3,'wangwu','123456','wangwu@sina.com','1979-12-04');
(2)IDEA中创建项目
①创建一个普通项目
②导入数据库驱动
③编写测试代码
package com.kuang.lesson01;import java.sql.*;// 我的第一个JDBC程序
public class JdbcFirstDemo {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1. 加载驱动// DriverManager.registerDriver(new com.mysql.jdbc.Driver());Class.forName("com.mysql.jdbc.Driver"); // 固定写法,加载驱动//2. 用户信息和url// useUnicode=true&characterEncoding=utf8&useSSL=trueString url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";String username = "root";String password = "123456";//3. 连接成功,数据库对象 Connection 代表数据库Connection connection = DriverManager.getConnection(url, username, password);//4. 执行SQL的对象 Statement 执行sql的对象Statement statement = connection.createStatement();//5. 执行SQL的对象 去 执行SQL,可能存在结果,查看返回结果String sql = "SELECT * FROM users";ResultSet resultSet = statement.executeQuery(sql); //返回的结果集,结果集中封装了我们全部的查询出来的结果while (resultSet.next()){System.out.println("id=" + resultSet.getObject("id"));System.out.println("name=" + resultSet.getObject("NAME"));System.out.println("pwd=" + resultSet.getObject("PASSWORD"));System.out.println("email=" + resultSet.getObject("email"));System.out.println("birth=" + resultSet.getObject("birthday"));System.out.println("==================================");}//6、释放连接resultSet.close();statement.close();connection.close();}
}
运行结果
步骤总结:
①加载驱动
②连接数据库 DriverManager
③获得执行sql的对象 Statement
④获得返回的结果集
⑤释放连接DriverManager
// DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Class.forName("com.mysql.jdbc.Driver"); // 固定写法,加载驱动
Connection connection = DriverManager.getConnection(url, username, password); // connection 代表数据库
// 数据库设置自动提交
// 事务提交
// 事务滚回
connection.rollback();
connection.commit();
connection.setAutoCommit();
- URL
String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true"; // mysql -- 3306
// 协议 :
//主机地址:端口号/数据库名?参数1&参数2&参数3
// oralce -- 1521 //jdbc:oracle:thin:@localhost:1521:sid
- Statement 执行SQL 的对象 PrepareStatement 执行SQL 的对象
String sql = "SELECT * FROM users"; // 编写SQL statement.executeQuery(); //查询操作返回 ResultSet
statement.execute(); // 执行任何SQL
statement.executeUpdate(); // 更新、插入、删除。都是用这个,返回一个受影响的行数
- ResultSet 查询的结果集:封装了所有的查询结果
获得指定的数据类型
resultSet.getObject(); // 在不知道列类型的情况下使用
// 如果知道列的类型就使用指定的类型
resultSet.getString();
resultSet.getInt();
resultSet.getFloat();
resultSet.getDate();
resultSet.getObject();
....
遍历,指针
resultSet.beforeFirst(); // 移动到最前面
resultSet.afterLast(); // 移动到最后面
resultSet.next(); //移动到下一个数据
resultSet.previous(); //移动到前一行
resultSet.absolute(row); //移动到指定行
- 释放资源
//6、释放连接
resultSet.close();
statement.close();
connection.close(); // 耗资源,用完关掉!
4. statement对象
4.1 简述
- Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
- Statement对象的executeUpdate方法,用于向数据库发送增、删、改的语句,executeUpdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)。
- Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象。
4.2 CRUD操作
- CRUD是指在做计算处理时的增加(Create)、读取(Read)、更新(Update)和删除(Delete) 几个单词的首字母简写。CRUD主要被用在描述软件系统中数据库的基本操作功能。
(1)CRUD操作-create
使用executeUpdate(String sql)方法完成数据添加操作,示例操作:
Statement st = conn.createStatement();
String sql = "insert into user(….) values(…..) ";
int num = st.executeUpdate(sql);
if(num>0){ System.out.println("插入成功!!!");}
(2)CRUD操作-read
使用executeQuery(String sql)方法完成数据查询操作,示例操作:
Statement st = conn.createStatement();
String sql = "select * from user where id=1";
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
//根据获取列的数据类型,分别调用rs的相应方法映射到java对象中
}
(3)CRUD操作-update
使用executeUpdate(String sql)方法完成数据修改操作,示例操作:
Statement st = conn.createStatement();
String sql = "update user set name='' where name=''";
int num = st.executeUpdate(sql);
if(num>0){
System.out.println(“修改成功!!!");
}
(4)CRUD操作-delete
使用executeUpdate(String sql)方法完成数据删除操作,示例操作:
Statement st = conn.createStatement();
String sql = "delete from user where id=1";
int num = st.executeUpdate(sql);
if(num>0){
System.out.println(“删除成功!!!");
}
4.3 代码实现
(1)在 src 下建立资源文件 db.properties
(2)提取工具类
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;public class JdbcUtils {private static String driver = null;private static String url = null;private static String username = null;private static String password = null;static {try{InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");Properties properties = new Properties();properties.load(in);driver = properties.getProperty("driver");url = properties.getProperty("url");username = properties.getProperty("username");password = properties.getProperty("password");//1.驱动只用加载一次Class.forName(driver);} catch (Exception e) {e.printStackTrace();}}//获取连接public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url, username, password);}//释放连接资源public static void release(Connection conn, Statement st, ResultSet rs){if (rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (st!=null){try {st.close();} catch (SQLException e) {e.printStackTrace();}}if (conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}
}
(3)编写增删改的方法, executeUpdate
- TestInsert(增)
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class TestInsert {public static void main(String[] args) {Connection conn = null;Statement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection(); //获取数据库连接st = conn.createStatement(); //获得SQL的执行对象String sql = "INSERT INTO users(id,`NAME`,`PASSWORD`,`email`,`birthday`)" +"VALUES(4,'dalao','123456','24736743@qq.com','2020-01-01')";int i = st.executeUpdate(sql);if (i>0){System.out.println("插入成功!");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,rs);}}
}
- TestDelete(删)
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class TestDelete {public static void main(String[] args) {Connection conn = null;Statement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection(); //获取数据库连接st = conn.createStatement(); //获得SQL的执行对象String sql = "DELETE FROM users WHERE id = 2";int i = st.executeUpdate(sql);if (i>0){System.out.println("删除成功!");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,rs);}}
}
- TestUpdate(改)
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class TestUpdate {public static void main(String[] args) {Connection conn = null;Statement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection(); //获取数据库连接st = conn.createStatement(); //获得SQL的执行对象String sql = "UPDATE users SET `NAME`='xiaohua',`email`='24736743@qq.com' WHERE id=1";int i = st.executeUpdate(sql);if (i>0){System.out.println("更新成功!");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,rs);}}
}
(3)查询 executeQuery
- TestSelect(查)
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TestSelect {public static void main(String[] args) {Connection conn =null;Statement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();st = conn.createStatement();//SQLString sql = "select * from users where id = 1";rs = st.executeQuery(sql); //查询完毕会返回一个结果集while (rs.next()){System.out.println(rs.getString("NAME"));}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,rs);}}
}
(4)SQL 注入的问题
sql 存在漏洞,会被攻击导致数据泄露,SQL会被拼接 or
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class SQL注入 {public static void main(String[] args) {// login("kuangshen","123456");login(" 'or '1=1"," 'or'1=1"); // 技巧}// 登录业务public static void login(String username,String password){Connection conn =null;Statement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();st = conn.createStatement();// SELECT * FROM users WHERE `Name` = 'kuangshen' AND `password` = '123456';// SELECT * FROM users WHERE `Name` = '' or '1=1' AND `password` = '' or '1=1';String sql = "select * from users where `NAME`='"+username+"' AND `password` ='"+password+"'";rs = st.executeQuery(sql); //查询完毕会返回一个结果集while (rs.next()){System.out.println(rs.getString("NAME"));System.out.println(rs.getString("password"));System.out.println("============================");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,rs);}}
}
5. PreparedStatement对象
PreparedStatement 可以防止SQL注入,效率更好!
(1)新增
import java.sql.Connection;
import java.util.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class TestInsert {public static void main(String[] args) {Connection conn = null;PreparedStatement st = null;try {conn = JdbcUtils.getConnection();// 区别// 使用? 占位符代替参数String sql = "insert into users(id,`NAME`,`PASSWORD`,`email`,`birthday`) values(?,?,?,?,?)";st = conn.prepareStatement(sql); //预编译SQL,先写sql,然后不执行// 手动给参数赋值st.setInt(1,4); //idst.setString(2,"xiaopang");st.setString(3,"1232112");st.setString(4,"24734673@qq.com");// 注意点: sql.Date 数据库 java.sql.Date()// util.Date Java new Date().getTime() 获得时间戳st.setDate(5,new java.sql.Date(new Date().getTime()));//执行int i = st.executeUpdate();if (i>0){System.out.println("插入成功!");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,null);}}
}
(2)删除
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class TestDelete {public static void main(String[] args) {Connection conn = null;PreparedStatement st = null;try {conn = JdbcUtils.getConnection();// 区别// 使用? 占位符代替参数String sql = "delete from users where id=?";st = conn.prepareStatement(sql); //预编译SQL,先写sql,然后不执行// 手动给参数赋值st.setInt(1,4);//执行int i = st.executeUpdate();if (i>0){System.out.println("删除成功!");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,null);}}
}
(3)更新
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class TestUpdate {public static void main(String[] args) {Connection conn = null;PreparedStatement st = null;try {conn = JdbcUtils.getConnection();// 区别// 使用? 占位符代替参数String sql = "update users set `NAME`=? where id=?;";st = conn.prepareStatement(sql); //预编译SQL,先写sql,然后不执行// 手动给参数赋值st.setString(1,"xiaohuang");st.setInt(2,1);//执行int i = st.executeUpdate();if (i>0){System.out.println("更新成功!");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,null);}}
}
(4)查询
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class TestSelect {public static void main(String[] args) {Connection conn = null;PreparedStatement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();String sql = "select * from users where id = ?"; // 编写SQLst = conn.prepareStatement(sql); // 预编译st.setInt(1,2); //传递参数rs = st.executeQuery(); //执行if (rs.next()){System.out.println(rs.getString("NAME"));}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,rs);}}
}
(5)防止SQL注入
import java.sql.*;
public class SQL注入 {public static void main(String[] args) {// login("lisi","123456");login("'' or 1=1","123456"); //}// 登录业务public static void login(String username,String password){Connection conn =null;PreparedStatement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();// PreparedStatement 防止SQL注入的本质,把传递进来的参数当做字符// 假设其中存在转义字符,比如说 ' 会被直接转义String sql = "select * from users where `NAME`=? and `PASSWORD`=?"; // Mybatisst = conn.prepareStatement(sql);st.setString(1,username);st.setString(2,password);rs = st.executeQuery(); //查询完毕会返回一个结果集while (rs.next()){System.out.println(rs.getString("NAME"));System.out.println(rs.getString("password"));System.out.println("============================");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,rs);}}
}
如下所示 查询不到数据
JDBC(一)——statement对象、PreparedStatement对象相关推荐
- JDBC中Statement与PreparedStatement的区别
http://www.blogjava.net/redcoatjk/archive/2012/07/20/383583.html 1. statement每次执行sql语句,相关数据库都要执行sql语 ...
- 由数据库对sql的执行说JDBC的Statement和PreparedStatement
1.每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要 ...
- Statement和PreparedStatement深入学习总结
最近在看java安全编码方面的书籍,在看到SQL注入漏洞的问题时,引发了我对Statement和PreparedStatement深入总结的欲望,废话少说,下面咱们就正式开始. 当初始的SQL查询被修 ...
- Statement和PreparedStatement之间的区别(转)
转自http://www.cnblogs.com/raymond19840709/archive/2008/10/13/1309657.html 1.PreparedStatement是预编译的,对于 ...
- Statement与PreparedStatement的区别
Statement与PreparedStatement的区别 PreparedStatement预编译SQL语句,性能好. PreparedStatement无序拼接SQL语句,编程更简单. Prep ...
- Statement和PreparedStatement的区别及联系
两者之间的联系: Statement和PreparedStatement两者都是用来执行SQL查询语句的API之一 PreparedStatement接口继承了Statement接口 两者之间的区别: ...
- Java数据库连接(JDBC)之二:Statement对象和PreparedStatement对象的使用
1,Statement对象是Java 执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.Statement对象,用于执行不带参数的简单SQL语句. Sta ...
- jdbc 批量insert_037 深入JDBC中PreparedStatement对象使用
1. 什么是SQL注入 (1) 什么是SQL注入? 所谓SQL注入,就是通过把含有SQL语句片段的参数插入到需要执行的SQL语句中,最终达到欺骗数据库服务器执行恶意操作的SQL命令. (2) 如何解决 ...
- 2020-08-02 Mysql数据库索引初识、备份、设计原则、JDBC连接、SQL注入、PreparedStatement对象使用、事务处理、连接池
------------------------索引---------------------- 定义:帮助MYSQL高效获取数据的数据结构 ----------主键索引----------prima ...
最新文章
- 【camera】自动驾驶感知系统实现(车道线检测和拟合、目标检测与跟踪、道路可行驶区域分割、深度估计、图像视野到BEV空间映射、像平面到地平面映射)
- php7 swoole 扩展,PHP7.2加入swoole扩展
- eclipse 插件扩展新建java页面_java-Eclipse插件-弹出菜单扩展
- Android 利用addView 动态给Activity添加View组件
- 内部错误:无法加载 ABAP 报表 LVBRKF0I
- linux mysql makefile_Linux安装库文件(环境变量和makefile)
- MATLAB语言算法实验报告,机械工程实验——matlab实验报告.doc
- 图书管理系统~简单流程
- mysql 只读权限 不能访问函数_通用mysql只读函数
- 紫外线测试仪软件,紫外线强度检测仪-紫外线灯管强度监测方法
- 泰森怎么会输给道格拉斯_巅峰泰森为何遭遇六连败?日本女孩不是主因,而是这位黑人超模...
- 让人深思:句法真的重要吗?邱锡鹏组提出一种基于Aspect的情感分析的强大基线...
- 好!今天开始研读《嵌入式Linux驱动程序设计从入门到精通》!
- arduino:废旧光驱DIY激光雕刻机(完善中……)
- android 如何把.swf作为开机动画,win10系统将PPT幻灯片转为SWF动画的操作方法
- js 获取浏览器 滚动的高度
- java程序员面试自我介绍范文
- iOS:基于Photos框架的图片选择器以及创建自定义相册
- Python爬虫实战 | (13) 爬取新浪滚动新闻
- win7系统设置无线临时(计算机到计算机)网络 手机,Win7无线临时网络允许移动WIFI和“启用Internet连接共享”...