10.1数据库驱动

驱动: 声卡、显卡、数据库
![image.png](https://img-blog.csdnimg.cn/img_convert/1b886a87bdd5a7eda36b1cd117f6224e.png#clientId=uedcbeb34-6132-4&from=paste&height=237&id=ud2c661ba&margin=[object Object]&name=image.png&originHeight=314&originWidth=520&originalType=binary&ratio=1&size=45206&status=done&style=none&taskId=u3895af98-f318-49e0-a476-d0a3cb9bf59&width=392)
我们的程序会通过数据库驱动, 和数据库打交道

10.2、JDBC

什么是JDBC : Java连接数据库!
SUN公司为了简化开发人员的(对数据库的统一)操作, 提供了一个(Java操作数据库的)规范, 俗称JDBC这些规范的实现由具体的厂商去做~
对于开发人员来说, 我们只需要掌握JDBC接口的操作即可
![image.png](https://img-blog.csdnimg.cn/img_convert/3ff3bea4d70a4a4a50d38685ea8b2422.png#clientId=uedcbeb34-6132-4&from=paste&height=436&id=ub841620e&margin=[object Object]&name=image.png&originHeight=393&originWidth=572&originalType=binary&ratio=1&size=58061&status=done&style=none&taskId=u8b99899d-627b-417e-b6f5-ef41d457493&width=634)

需要导包:
java.sql
javax.sql
还需要导入一个数据库驱动包 musql-connector-java-5.1.47.jar(根据数据库的版本来)

10.3、第一个JDBC程序

步骤:

1、创建一个普通数据库项目

-- 创建数据库
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` data
);-- 插入数据
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');-- 查询语句
select * from `users`;

2、导入数据库驱动
![image.png](https://img-blog.csdnimg.cn/img_convert/c4b78890f16f234522d6052381f04ead.png#clientId=uedcbeb34-6132-4&from=paste&height=712&id=u912015c0&margin=[object Object]&name=image.png&originHeight=624&originWidth=526&originalType=binary&ratio=1&size=235090&status=done&style=none&taskId=u4b825891-dad6-4a3a-96da-4967d77fc63&width=600)

3、编写代码

package com;import java.sql.*;//我的第一个JDBC程序
public class JDBC {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1.加载驱动Class.forName("com.mysql.jdbc.Driver");//固定写法, 加载驱动//2.用户信息和url//格式: jdbc:mysql://地址(主机:端口号)/数据库?useUnicode=true&characterEncoding=utf8&useSSL=falseString url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=false";String username = "root";//用户名String password = "123456";//密码//3.连接成功, 数据库对象 Connection 代表数据库Connection connection = DriverManager.getConnection(url, username, password);//4.执行SQL的对象 StatementStatement statement = connection.createStatement();//5.用Statement 执行 SQL语句 查看返回结果String sql = "select * from `users`";ResultSet resultSet = statement.executeQuery(sql);// 返回结果集, 结果集中封装了我们全部的查询出来的结果//更新(修改、删除)用executeUpdate(), 查询用executeQuery()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("birthday: " + resultSet.getObject("birthday"));//参数是列名!!System.out.println();}//6.释放链接resultSet.close();statement.close();connection.close();}
}

4、步骤总结:
1.加载驱动
2.用户信息和url
3.连接数据库 对象 onnection 代表数据库
4.执行SQL的对象 Statement
5.用Statement 执行 SQL语句 查看返回结果
6.释放链接

DriverManager

//1.加载驱动
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Class.forName
(“com.mysql.jdbc.Driver”);//固定写法, 加载驱动

Connection connection = DriverManager.getConnection(url, username, password);
_//数据库的自动提交 connection.commit();
//事务提交 connection.setAutoCommit();
//事务回滚 _connection.rollback();

URL

//2.用户信息和url
//mysql端口: 3306(默认)
//格式: jdbc:mysql://地址(主机:端口号)/数据库?useUnicode=true&characterEncoding=utf8&useSSL=false

//格式: 协议://地址(主机:端口号)/数据库?参数1&参数2&参数3……

//oralce端口: 1521(默认)
_//jabc:oracle:thin:@localhost:1521:sid

_

Statement执行SQL的对象 PrepareStatement执行SQL的对象

String sql = "select * from users";
ResultSet resultSet = statement.executeQuery(sql)

statement.executeQuery(sql); //执行查询操作、返回Resultset
statement.execute(sql); //执行任何操作、返回操作是否成功(true/false)
statement.executeUpdate(sql); //执行更新、插入、删除操作、返回收影响的行数

获得指定的数据类型

resultSet.getObject() //在不知道什么类型的情况下使用
//如果知道则使用指定的类型
resultSet.getString();
resultSet.getInt();
resultSet.getFloat();
resultSet.getDate();

遍历、指针

resultSet.beforeFirst();//移动到最前面
resultSet.afterLast();//移动到最后面
resultSet.next();//移动到下一个数据
resultSet.previous();//移动到前一个数据
resultSet.absolute(row);//移动到指定行

释放资源

必须释放资源
尤其是Connection十分耗资源

10.4、Statement对象

jdbc中的Statement对象用于向数据库发送SQL语句, 想完成对数据库的增删改查, 只需要通过这个对象向数据库发送增删改查的SQL语句即可。

Statement对象的executeUpdate方法, 用于向数据库发送增、删、改的SQL语句, executeUpdate执行完后, 将返回一个整数(即该语句影响了几行数据)

Statement.executeQuery方法用于向数据库发送查询语句, executeQuery方法返回代表查询结果的Resultset对象。

CRUD操作-create

使用executeUpdate(String sql)方法完成数据添加操作, 示例操作:

Statement statement = connection.createStatemen
String sql1 = "INSERT INTO `users`(id,`NAME`,`PASSWORD`,email,birthday) VALUES(6,'ssys','123456','zs@sina.com','1980-12-04')";
int num = statement.executeUpdate(sql1);
if(num>0){System.out.println("插入成功");
}

CRUD操作-delete

使用executeUpdate(String sql)方法完成数据删除操作, 示例操作:

Statement statement = connection.createStatemen
String sql1 = "delete from user where id=1";
int num = statement.executeUpdate(sql1);
if(num>0){System.out.println("删除成功");
}

CRUD操作-update

使用executeUpdate(String sql)方法完成数据修改操作, 示例操作:

Statement statement = connection.createStatemen
String sql1 = "update user set name='' where name=''";
int num = statement.executeUpdate(sql1);
if(num>0){System.out.println("修改成功");
}

CRUD操作-read

Statement statement = connection.createStatemen
String sql1 = "select * from user where id=1";
ResultSet rs=  statement.executeQuery(sql1);
while (resultSet.next()) {//结果可拆分
}

代码实现:


// 提取根据类
package com;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("dp.properties");Properties properties = new Properties();properties.load(in);driver = properties.getProperty("driver");url = properties.getProperty("url");username = properties.getProperty("username");password = properties.getProperty("password");//驱动只用加载一次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) throws SQLException {if (rs != null) {rs.close();}if (st != null) {st.close();}if (conn != null) {conn.close();}}
}
//插入语句练习
package com;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class jdbc1 {public static void main(String[] args) throws SQLException {Connection conn = null;Statement st = null;ResultSet re = null;conn = JdbcUtils.getConnection();//获取数据库连接st = conn.createStatement();//获取SQL执行对象String sql = "INSERT INTO `users`(id,`NAME`,`PASSWORD`,email,birthday) VALUES(7,'ssys','123456','zs@sina.com','1980-12-04')";st.executeUpdate(sql);JdbcUtils.release(conn,st,re);//释放资源}
}

SQL注入问题

sql存在漏洞, 会导致数据泄露(sql语句会被拼接 or)

package com;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class SQL_injection {public static void main(String[] args) throws SQLException {// login("ssys", "123456"); 正常登陆方式login("'or '1=1", "123456");// 非法登陆//这就是SQL注入问题}//SQL注入//登陆业务public static void login(String username, String password) throws SQLException {Connection conn = null;Statement st = null;ResultSet re = null;conn = JdbcUtils.getConnection();//获取数据库连接st = conn.createStatement();//获取SQL执行对象String sql = "select * from `users` where `NAME` ='" + username + "' AND `PASSWORD` = '" + password+"'";re = st.executeQuery(sql);while (re.next()) {System.out.println(re.getObject("NAME"));System.out.println(re.getObject("password"));System.out.println();}JdbcUtils.release(conn,st,re);//释放资源}
}

10.5、PreparedStatement对象

PreparedStatement可以防止SQL注入。效率更好!

package com;import java.sql.*;
import java.util.Date;public class PreparedStatement_ {//插入public static void main(String[] args) throws SQLException {Connection conn = null;PreparedStatement st = null;ResultSet re = null;conn = JdbcUtils.getConnection();//区别: 使用? 占位符答题参数()String sql = "INSERT INTO `users`(id,`NAME`,`PASSWORD`,email,birthday) VALUES(?,?,?,?,?)";st = conn.prepareStatement(sql);//需要预编译, 先写sql, 然后不填写//手动给参数赋值st.setInt(1, 8);st.setString(2, "身伤易逝");st.setString(3, "123456");st.setString(4, "1472580@qq.com");//注意: sql.Data    数据库   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("执行成功!!");}JdbcUtils.release(conn, st, re);//释放资源}
}

总结: 以后都用PreparedStatement不要用Statement

PreparedStatement 防止SQL注入的本质, 就是把传递进来的参数当成字符
如果其中存在转义字符吗比如说 ‘’ 就会呗直接转义然后忽略掉

10.6、使用IDEA连接数据库

必须要先导入一个数据库驱动包 musql-connector-java-5.1.47.jar
1、连接MySQL
![image.png](https://img-blog.csdnimg.cn/img_convert/cfc4d09fadd795b2f89ed6ffa7620ef4.png#clientId=u8a7085ae-dcf7-4&from=paste&height=459&id=u7d6b7d9b&margin=[object Object]&name=image.png&originHeight=917&originWidth=650&originalType=binary&ratio=1&size=79623&status=done&style=none&taskId=u40ed6885-cea7-4a9a-86f7-7df165c8c69&width=325)

2、idea修改数据:
![image.png](https://img-blog.csdnimg.cn/img_convert/260bbe8030a84bd1ca2ab176855f833a.png#clientId=u8a7085ae-dcf7-4&from=paste&height=270&id=uff5bb679&margin=[object Object]&name=image.png&originHeight=342&originWidth=974&originalType=binary&ratio=1&size=200268&status=done&style=none&taskId=u2989c0d5-505d-4e6c-9706-41262494973&width=769)

3、编写SQL语句
![image.png](https://img-blog.csdnimg.cn/img_convert/a1c42d813046ad59099a7a9bd748925b.png#clientId=u8a7085ae-dcf7-4&from=paste&height=459&id=u38858517&margin=[object Object]&name=image.png&originHeight=576&originWidth=961&originalType=binary&ratio=1&size=202303&status=done&style=none&taskId=u7c674a66-e506-4500-8e4d-f95d07c578e&width=765.5)

4、如果版本不对就:
![image.png](https://img-blog.csdnimg.cn/img_convert/db26367e1920f7fe84d5c61b157d2d1f.png#clientId=u8a7085ae-dcf7-4&from=paste&height=520&id=u9b8256b5&margin=[object Object]&name=image.png&originHeight=552&originWidth=827&originalType=binary&ratio=1&size=263084&status=done&style=none&taskId=u6ea43fe3-255b-4566-bb4f-1f7e7da2e5f&width=779.5)

10.7、JDBC操作事务

原子性(A):要么全成功,要么全失败!
一致性(C):SQL执行前后的数据完整性一致!
持久性(D):事务一旦提交就不可逆,不受外部因素影响(如断电之类的)!
隔离性(I):并发事务时,不能被其它事务的操作数据所干扰,业务之间要相互隔离

脏读:指一个事务读取了另外一个事务未提交的数据。
不可重复读:在一个事务内读取表的某一行数据,多次读取结果不同(不一定是错误,只是某些场合不对)
虚读(幻读):指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致

package com;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class transferAccounts {public static void main(String[] args) throws SQLException {Connection conn = null;PreparedStatement st = null;ResultSet re = null;try {conn = JdbcUtils.getConnection();// 关闭数据库的自动提交, 就会自动开启事务conn.setAutoCommit(false);String sql1 = "update account set money = money-100 where name ='A'";st = conn.prepareStatement(sql1);st.executeUpdate();String sql2 = "update account set money = money+100 where name ='B'";st = conn.prepareStatement(sql2);st.executeUpdate();//如果超过就提交conn.commit();System.out.println("转账成功");} catch (SQLException e) {//如果失败就回滚conn.rollback();e.printStackTrace();} finally {JdbcUtils.release(conn, st, re);}}
}

![image.png](https://img-blog.csdnimg.cn/img_convert/377d30d6598a27aac4a3498f3ea1b312.png#clientId=uaf39e372-1b10-4&from=paste&height=196&id=ub326b1ef&margin=[object Object]&name=image.png&originHeight=196&originWidth=651&originalType=binary&ratio=1&size=67729&status=done&style=none&taskId=ufb59f999-d18e-4238-a1e2-f4f58e9423e&width=651)

10.8、数据库连接池

数据库连接 — 执行完毕 — 释放
连接 – 释放 十分浪费系统资源
池化技术: 准备一些预先的资源, 过来就接预先准备好的

编写连接池, 实现一个接口 DataSource

开源数据源实现(拿来就用)

DBCP
C3P0
Druid: 阿里巴巴

DBCP

需要用到的jar包
commons-pool-1.6.jar、commons-dbcp-1.4.jar

C3P0

需要用到的jar包
c3p0-0.9.5.5.jar、mchange-commons-java-0.2.19.jar

10、JDBC(重点)相关推荐

  1. java jax_Java,Microsoft和Pizza:2019年JAX伦敦会议的10个重点

    java jax 要点1:微软是一家Java商店 程序主席Sebastian Meyen打开了JAX London,他指出了一个有趣的事实:Microsoft对Java的了解越来越深. 同时,许多知名 ...

  2. 【数据库】MySQL入门

    文章目录 1. 初识MySQL 1.1.为什么学习数据库 1.2.什么是数据库 1.3.数据库分类 1.4.MySQL简介 1.5.安装MySQL(简单) 1.6.安装Navicate 1.7.连接数 ...

  3. 狂神 MYSQL 笔记整理

    文章目录 1. 初识MySQL 为什么学习数据库 什么是数据库 数据分类 MySQL简介 连接数据库 2. 操作数据库 操作数据库 数据库的列类型 数据库的字段属性 (重点) 创建数据库表 数据表的类 ...

  4. 1.SQL的基本入门

    1.初识MySQL JavaEE 企业级java开发 Web 前端(页面 展示 数据!) 后台(连接点 连接数据库JDBC 连接前端(控制视图的跳转 和给前端传递数据)) 数据库(存数据,) 只会写代 ...

  5. 三部委明确能源互联网建设10重点

    据新华社消息,由国家发展改革委.×××.工业和信息化部联合制定的<关于推进"互联网+"智慧能源发展的指导意见>日前发布.意见提出,能源互联网建设近中期将分为两个阶段推进 ...

  6. mysql和jdbc的区别_JDBC详解

    一. JDBC 简介 1 什么是 JDBC •JDBC(JavaDataBaseConnectivity)java 数据库连接 • 是 JavaEE 平台下的技术规范 • 定义了在 Java 语言中连 ...

  7. mysql学习总结-初识+数据管理+增删改查+常用函数+事务理解+数据库设计+JDBC引入

    1.初识MySQL 1.1数据库的定义 数据库(DataBase,简称DB),是一个按数据结构来存储和管理数据的计算机软件系统.每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制 ...

  8. MySQL Java JDBC

    文章目录 前言 一.了解MySQL 1.1数据库分类 关系型数据库:(SQL) 非关系型数据库:(no SQL) DBMS(数据库管理系统) MySQL,一个数据库管理系统 二.初识MySQL 2.1 ...

  9. 狂神说Mysql课堂学习笔记,jdbc(含代码,下载链接)

    连接数据库 命令行连接! mysql -uroot -p123456 命令行连接 mysql -uroot -p123456 --连接数据库show databases; -- 查看所有的数据库mys ...

  10. MySql+JDBC

    MySql学习笔记 1.数据引擎:InnoDB和MYISAM的区别 1.1 SQL语句分类 2.修改和删除表 3.SQL数据管理 3.1 DML语言 3.2 添加 3.3 修改 3.4 删除 3.5 ...

最新文章

  1. Android6.0------权限申请管理(单个权限和多个权限申请)
  2. php ci框架中载入css和js文件失败的原因及解决方法
  3. 使用存储过程的优点.
  4. 大剑无锋之Hadoop的三个作业调度器【面试推荐】
  5. leetcode 128最长连续序列
  6. 食品安全--牛奶和蛋白质浅谈
  7. Win10安装 WSL Ubuntu Linux系统,非双系统,完美兼容超详细版本
  8. python怎么读取图像的txt标注_使用包含文件名的.txt文件读取图像数据
  9. linux 打zip gz tar,linux把文件压缩成.tar.gz的命令 | PT Ubuntu Blog
  10. 面试 | #面试面试面试 做#Java 就是要这种不要脸的…
  11. 去除html标签的工具类,Java正则匹配过滤移除html标签以及获取img完整标签工具类...
  12. springboot- jsp访问404的问题解决
  13. Qt学习之路(37): Qt容器类之关联存储容器
  14. 【Python3】【爬虫】bilibili摄影板块
  15. VB入门在线视频教程大全学习
  16. 红旗Linux中文教程
  17. android studio 添加 ignored files 忽略文件
  18. python爬虫系列之下载在线文档Excel(石墨)
  19. histogram loss笔记
  20. HTML中enter键触发事件

热门文章

  1. Egret Engine(二十六):MovieClip序列帧动画
  2. js做gif动画【MovieClip插件】
  3. 【CANdelaStudio编辑CDD】-0.2-将CDD转换成ODX/PDX诊断描述文件
  4. 无人机边缘计算中的计算卸载——Stackelberg博弈方法论文复现附matlab代码
  5. 猫和老鼠:博弈论——记忆化搜索
  6. Nature综述:宏基因组时代的病毒分类
  7. 求过指定点和指定方向的直线方程
  8. windbg 常用调试命令总结
  9. 日常食物软分类与烹饪方法的思考——预防肥胖
  10. 生成器(generator)理解