文章目录

  • 数据库驱动
  • JDBC
    • 下载jar包
  • 第一个 JDBC 案例
    • 1、创建一个 普通的java 项目
    • 2、引入jar 包
    • 3、编写测试代码
  • statement 对象
  • 抽取JDBC工具类
  • SQL注入
  • prepareStatement 对象
  • 使用 JDBC 操作 事务

数据库驱动

我们的程序会通过数据库驱动连接数据库,这样的话,连接不同的数据库就需要不同的数据库驱动,显得很繁琐。

JDBC

SUN 公司 为了简化 开发人员对数据库的操作,提供了一个规范 — JDBC

这些规范的具体实现由厂商去做。对于开发人员,只需要掌握JDBC 的操作就行。

下载jar包

java 程序连接数据库需要一个jar 包 mysql-connector-java ,不同的数据库版本找对应的jar包版本

jar :

依赖 :

<!-- mysql-connector-java 连接数据库,版本最好和数据库的版本一致 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version>
</dependency>

第一个 JDBC 案例

1、创建一个 普通的java 项目

2、引入jar 包

步骤 :

1、在项目根目录创建 lib 文件夹,将jar 包放进去

2、右键文件夹–> add as library

注意: 当jar包可以打开时,表明jar包已被加载进项目里

3、编写测试代码

步骤 :

1、加载驱动

2、创建连接

3、创建 statement 对象

4、使用 statement 去执行 SQL

5、查看返回结果

6、释放资源

package com.hkp.jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;/*** 第一个 JDBC 程序*/
public class Demo1 {public static void main(String[] args) throws Exception {//1、加载驱动// mysql5 : com.mysql.jdbc.Driver// mysql8 : com.mysql.cj.jdbc.DriverClass.forName("com.mysql.cj.jdbc.Driver");//2、用户信息和 URlString url = "jdbc:mysql://localhost:3306/schooldb?useUnicode=true&characterEncoding=utf8&useSSL=true";String userName = "root";String password = "admin";//3、连接成功,返回数据库对象    connection 代表数据库Connection connection = DriverManager.getConnection(url, userName, password);//4、创建 statement 对象,去执行SQLStatement statement = connection.createStatement();//5、执行SQL,返回结果集String sql = "select * from student";ResultSet resultSet = statement.executeQuery(sql);//6、查看结果集while(resultSet.next()){System.out.print("学号 : "+resultSet.getObject("sid"));System.out.print("姓名 : "+resultSet.getObject("sname"));System.out.println();}//7、释放连接resultSet.close();statement.close();connection.close();}
}

statement 可以执行SQL

statement.executeQuery(sql); //查询,返回一个结果集 resultSet
statement.execute(sql); // 可以执行任何SQL
statement.executeUpdate(sql); // 修改、插入、删除 ,返回受影响行数

resultSet : 查询返回的结果集,封装了所有的结果

resultSet.getObject(); // 不知道什么数据类型,使用 object
// 知道是什么数据类型,使用具体的数据类型
resultSet.getString();
resultSet.getInt();

statement 对象

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

statement 对象的 executeQuery 方法,用于向数据库发送查询语句,返回一个结果集 resultSet
statement 对象的 executeUpdate 方法,用于向数据库发送修改、插入、删除语句 ,返回受影响行数

create

//使用 executeUpdate 方法完成数据库添加操作
Statement sta = con.createStatement();
String sql = "INSERT INTO `student`(`sname`, `sex`, `age`) VALUES ('test', '男', 42);";
int num = sta.executeUpdate(sql);
if(num>0){System.out.println("添加成功");
}else{System.out.println("添加失败");
}

update

//使用 executeUpdate 方法完成数据库修改操作
Statement sta = con.createStatement();
String sql = "UPDATE `student` SET `sname` = 'Tom'WHERE `sname` = 'test';";
int num = sta.executeUpdate(sql);
if(num>0){System.out.println("修改成功");
}else{System.out.println("修改失败");
}

delete

//使用 executeUpdate 方法完成数据库删除操作
Statement sta = con.createStatement();
String sql = "delete from student where sid = 6";
int num = sta.executeUpdate(sql);
if(num>0){System.out.println("删除成功");
}else{System.out.println("删除失败");
}

select

//使用 executeQuery  方法完成数据库查询操作
Statement statement = connection.createStatement();
String sql = "select * from student";
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()){System.out.print("学号 : "+resultSet.getObject("sid"));System.out.print("姓名 : "+resultSet.getObject("sname"));System.out.println();
}

抽取JDBC工具类

package com.hkp.jdbc;import java.sql.*;public class JdbcUtil {private static final String DRIVERNAME="com.mysql.cj.jdbc.Driver";private static final String URL = "jdbc:mysql://localhost:3306/schooldb?useUnicode=true&characterEncoding=utf8&useSSL=true";private static final String USER="root",PASSWORD="admin";//连接数据库public static Connection getConnection(){try {Class.forName(DRIVERNAME);return DriverManager.getConnection(URL, USER, PASSWORD);} catch (Exception e) {e.printStackTrace();}return null;}//增删改方法public static int executeUpdate(String sql){Connection conn=null;Statement sta=null;try {conn=getConnection();sta=conn.createStatement();return sta.executeUpdate(sql);} catch (SQLException e) {e.printStackTrace();return e.getErrorCode()*(-1);}finally{closeAll(conn,sta,null);}}//释放资源public static void closeAll(Connection conn, Statement sta, ResultSet set) {try {if(set!=null)set.close();if(sta!=null)sta.close();if(conn!=null)conn.close();} catch (SQLException e) {e.printStackTrace();}}
}

使用工具类写增删改查

// 增加
public static void main(String[] args) {String sql = "INSERT INTO `student`(`sname`, `sex`, `age`) VALUES ('test_create', '男', 42);";int num = JdbcUtil.executeUpdate(sql);if(num>0){System.out.println("添加成功");}else{System.out.println("添加失败");}
}// 删除
public static void main(String[] args) {String sql = "delete from student where sid = 8";int num = JdbcUtil.executeUpdate(sql);if(num>0){System.out.println("删除成功");}else{System.out.println("删除失败");}
}//修改
public static void main(String[] args) {String sql = "UPDATE `student` SET `sname` = 'test_update' WHERE `sid` = 8";int num = JdbcUtil.executeUpdate(sql);if(num>0){System.out.println("修改成功");}else{System.out.println("修改失败");}
}//查询
//注意一定要关闭资源
public class TestSelect {public static void main(String[] args) {Connection con = null;Statement sta = null;ResultSet res= null;try {con = JdbcUtil.getConnection();sta = con.createStatement();String sql = "select * from student";res = sta.executeQuery(sql);while(res.next()){System.out.print("学号 : "+res.getObject("sid"));System.out.print("姓名 : "+res.getObject("sname"));System.out.println();}}catch (Exception e){e.printStackTrace();System.out.println("出错了");}finally {//关闭资源JdbcUtil.closeAll(con,sta,res);}}
}

SQL注入

参考博客 :https://www.cnblogs.com/myseries/p/10821372.html

SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。

SQL 注入会获取用户表里的所有的用户信息

public class Sql {public static void main(String[] args) {//login("admin","admin");  正常登陆//SQL 注入式登陆login("' or '1=1","' or '1=1");}public static void login(String username,String pwd){Connection con = null;Statement sta = null;ResultSet res= null;try {con = JdbcUtil.getConnection();sta = con.createStatement();String sql = "select * from user where login_name='"+username+"' and password = '"+pwd+"'";res = sta.executeQuery(sql);while(res.next()){System.out.print("用户名 : "+res.getObject("login_name")+"\t");System.out.print("密码 : "+res.getObject("password"));System.out.println();}}catch (Exception e){e.printStackTrace();System.out.println("出错了");}finally {//关闭资源JdbcUtil.closeAll(con,sta,res);}}
}

prepareStatement 对象

prepareStatement 与 statement 对象一样,都可以执行 SQL 语句,但是prepareStatement 对象可以防止 SQL注入,效率更高!并且可以使用 ? 做占位符

案例 :增加、修改、删除都是类似的

 public static void main(String[] args) {Connection con = null;PreparedStatement st = null;con = JdbcUtil.getConnection();// 使用 ? 占位符String sql = "INSERT INTO `schooldb`.`user`(`id`, `login_name`, `password`) VALUES (?,?,?);";try {// 预编译 :先写SQL 不执行st = con.prepareStatement(sql);// 手动给参数赋值st.setInt(1,12);st.setString(2,"root");st.setString(3,"admin");//执行int num = st.executeUpdate();if(num>0){System.out.println("添加成功");}else{System.out.println("添加失败");}} catch (SQLException throwables) {throwables.printStackTrace();}finally {try {con.close();st.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}

案例 :查询

public class Test {public static void main(String[] args) {Connection con = null;PreparedStatement st = null;ResultSet res = null;try {con = JdbcUtil.getConnection();// 使用 ? 占位符String sql = "select * from user where id = ?";// 预编译 :先写SQL 不执行st = con.prepareStatement(sql);// 手动给参数赋值st.setInt(1, 12);res = st.executeQuery();while(res.next()){System.out.println(res.getString("login_name"));}} catch (SQLException throwables) {throwables.printStackTrace();} finally {JdbcUtil.closeAll(con,st,res);}}
}

PreparedStatement防止 SQL 注入的本质 :把传递过来的参数,当做一个字符,参数中的转义字符均无效。

使用 JDBC 操作 事务

public class Transaction {public static void main(String[] args)  {Connection con = null;PreparedStatement st=null;try {con = JdbcUtil.getConnection();// 关闭数据库的自动提交,自动会开启事务con.setAutoCommit(false);String sql1 = "UPDATE `acount` SET `money` = money-100 WHERE name = 'jack';";st=con.prepareStatement(sql1);st.executeUpdate();// 模拟失败案例int x = 1/0;String sql2 = "UPDATE `acount` SET `money` = money+100 WHERE name = 'tom';";st=con.prepareStatement(sql2);st.executeUpdate();// 业务完成,提交事务con.commit();System.out.println("成功");} catch (SQLException throwables) {// 失败默认回滚try {con.rollback();} catch (SQLException e) {e.printStackTrace();}throwables.printStackTrace();}finally {JdbcUtil.closeAll(con,st,null);}}
}

javaweb -- jdbc相关推荐

  1. 基于javaweb+mysql的学生选课系统(java+javaweb+jdbc)

    基于javaweb+mysql的学生选课系统(java+javaweb+jdbc) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/idea/myeclipse ...

  2. 基于javaweb的学生选课系统(java+javaweb+jdbc)

    基于javaweb的学生选课系统(java+javaweb+jdbc) 功能介绍: 用户菜单.学生管理.教师管理.课程管理.成绩排名查询 适用 课程设计,大作业,毕业设计,项目练习,学习演示等 //验 ...

  3. JavaWeb JDBC初步连接和JDBC连接规范化

    感谢传智播客提供的学习视频 ,希望传智播客越来越好 package cn.itcast.jdbc;import java.sql.Connection; import java.sql.DriverM ...

  4. JavaWeb——jdbc与dbcp数据库连接

    一.引言 最近在学习使用mybatis调用数据库,顺便总结了下java连接数据库的历史发展.从非常传统的jdbc连接,到数据库连接池(dbcp.c3p0)封装后的jdbc连接,再到各种框架对数据库连接 ...

  5. 20210213 黑马javaweb JDBC

    # 今日内容 1. JDBC基本概念     2. 快速入门     3. 对JDBC中各个接口和类详解 ## JDBC:     1. 概念:Java DataBase Connectivity   ...

  6. JavaWeb JDBC

    1.实现第一个JDBC程序 在MySQL中创建一个名称为jdbc的数据库,然后在该数据库中创建一个users表,创建 数据库和表的SQL语句如下所示. CREATE DATABASE jdbc;USE ...

  7. JavaWeb——JDBC

    package jdbc;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;pu ...

  8. Java项目:医院管理系统(java+javaweb+jdbc+Mysql+lw)

    源码获取:博客首页 "资源" 里下载! 功能介绍: 登录.注册.用户/管理员(角色).用户信息管理.科系信息管理.查看所有科系.新增科系信息.删除指定科系.修改科系信息.病房信息管 ...

  9. Java项目:人事管理系统(java+javaweb+jdbc)

    源码获取:博客首页 "资源" 里下载! 功能介绍: 登录.新增.修改.离职 员工管理控制层: @Controller @RequestMapping("/employee ...

最新文章

  1. ASP.NET 自定义404错误页面
  2. (转载)为什么欧美拿金牌不感谢祖国
  3. 图像拼接 python c++
  4. Wordpress 更新时 不输入ftp相关信息的方法
  5. 001 Servlet 介绍
  6. 从CSRF原理到CMS漏洞利用
  7. ::在sql语句中是什么写法_不懂就问:SQL 语句中 where 条件后 写上1=1 是什么意思...
  8. go语言web开发 排坑指南
  9. unity 镜面反射_Unity | Diffuse Light漫反射光照
  10. Facebook 会沦落为二十年前的微软吗?
  11. mongodb副本集维护
  12. 预处理、const、static与sizeof-static全局变量与普通的全局变量有什么区别
  13. linux系统资源信息监控
  14. c4d安装没有出现语言文字,关于C4D以及渲染器插件安装时遇到的问题以及解决方法...
  15. 境外业务性能优化实践
  16. 老男孩Day1作业(二):三级菜单
  17. 牛客 | C 选择颜色
  18. N沟道的Vgs是正的,P沟道的Vgs是负的
  19. 2010年系统架构师考试题详解
  20. python 爬取拉钩网数据

热门文章

  1. JAVA基础入门(4)—— 标识符、关键字和字面值
  2. 【小米2018-09-20在线笔试】小米大礼包
  3. 门槛越低,越容易引起共鸣
  4. Dell服务器重设远程管理卡密码操作
  5. 电脑回收站删除的文件怎么恢复?(2个方案任选)
  6. JavaScript DOM 编程艺术 (第二版)学习之3-4章
  7. win10电脑默认快捷键
  8. 地下城英雄 java_地下城英雄手游Java
  9. 政府网站用什么浏览器打开,除了ie还能哪些浏览器
  10. 抖音做美食自媒体的变现模式都有哪些?