文章目录

  • 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对象相关推荐

  1. JDBC中Statement与PreparedStatement的区别

    http://www.blogjava.net/redcoatjk/archive/2012/07/20/383583.html 1. statement每次执行sql语句,相关数据库都要执行sql语 ...

  2. 由数据库对sql的执行说JDBC的Statement和PreparedStatement

    1.每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要 ...

  3. Statement和PreparedStatement深入学习总结

    最近在看java安全编码方面的书籍,在看到SQL注入漏洞的问题时,引发了我对Statement和PreparedStatement深入总结的欲望,废话少说,下面咱们就正式开始. 当初始的SQL查询被修 ...

  4. Statement和PreparedStatement之间的区别(转)

    转自http://www.cnblogs.com/raymond19840709/archive/2008/10/13/1309657.html 1.PreparedStatement是预编译的,对于 ...

  5. Statement与PreparedStatement的区别

    Statement与PreparedStatement的区别 PreparedStatement预编译SQL语句,性能好. PreparedStatement无序拼接SQL语句,编程更简单. Prep ...

  6. Statement和PreparedStatement的区别及联系

    两者之间的联系: Statement和PreparedStatement两者都是用来执行SQL查询语句的API之一 PreparedStatement接口继承了Statement接口 两者之间的区别: ...

  7. Java数据库连接(JDBC)之二:Statement对象和PreparedStatement对象的使用

    1,Statement对象是Java 执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.Statement对象,用于执行不带参数的简单SQL语句. Sta ...

  8. jdbc 批量insert_037 深入JDBC中PreparedStatement对象使用

    1. 什么是SQL注入 (1) 什么是SQL注入? 所谓SQL注入,就是通过把含有SQL语句片段的参数插入到需要执行的SQL语句中,最终达到欺骗数据库服务器执行恶意操作的SQL命令. (2) 如何解决 ...

  9. 2020-08-02 Mysql数据库索引初识、备份、设计原则、JDBC连接、SQL注入、PreparedStatement对象使用、事务处理、连接池

    ------------------------索引---------------------- 定义:帮助MYSQL高效获取数据的数据结构 ----------主键索引----------prima ...

最新文章

  1. 【camera】自动驾驶感知系统实现(车道线检测和拟合、目标检测与跟踪、道路可行驶区域分割、深度估计、图像视野到BEV空间映射、像平面到地平面映射)
  2. php7 swoole 扩展,PHP7.2加入swoole扩展
  3. eclipse 插件扩展新建java页面_java-Eclipse插件-弹出菜单扩展
  4. Android 利用addView 动态给Activity添加View组件
  5. 内部错误:无法加载 ABAP 报表 LVBRKF0I
  6. linux mysql makefile_Linux安装库文件(环境变量和makefile)
  7. MATLAB语言算法实验报告,机械工程实验——matlab实验报告.doc
  8. 图书管理系统~简单流程
  9. mysql 只读权限 不能访问函数_通用mysql只读函数
  10. 紫外线测试仪软件,紫外线强度检测仪-紫外线灯管强度监测方法
  11. 泰森怎么会输给道格拉斯_巅峰泰森为何遭遇六连败?日本女孩不是主因,而是这位黑人超模...
  12. 让人深思:句法真的重要吗?邱锡鹏组提出一种基于Aspect的情感分析的强大基线...
  13. 好!今天开始研读《嵌入式Linux驱动程序设计从入门到精通》!
  14. arduino:废旧光驱DIY激光雕刻机(完善中……)
  15. android 如何把.swf作为开机动画,win10系统将PPT幻灯片转为SWF动画的操作方法
  16. js 获取浏览器 滚动的高度
  17. java程序员面试自我介绍范文
  18. iOS:基于Photos框架的图片选择器以及创建自定义相册
  19. Python爬虫实战 | (13) 爬取新浪滚动新闻
  20. win7系统设置无线临时(计算机到计算机)网络 手机,Win7无线临时网络允许移动WIFI和“启用Internet连接共享”...

热门文章

  1. 窗口缩小 怎么让定位的盒子不动_盒子模型
  2. [转载]我的博后申请经历从陶瓷到Offer过程
  3. matlab中的矩阵
  4. [codevs 1916] 负载平衡问题
  5. 【NOIP2015模拟10.27】魔道研究
  6. 最短路径问题(Floyd算法)
  7. go 获取内核个数_图解Go运行时调度器
  8. android设置通知在屏幕横幅显示,Android推送通知横幅未显示在某些设备中
  9. delphi设置鼠标图形
  10. RPAD()和LPAD()函数进行字符串的填充