javaweb -- jdbc
文章目录
- 数据库驱动
- 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相关推荐
- 基于javaweb+mysql的学生选课系统(java+javaweb+jdbc)
基于javaweb+mysql的学生选课系统(java+javaweb+jdbc) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/idea/myeclipse ...
- 基于javaweb的学生选课系统(java+javaweb+jdbc)
基于javaweb的学生选课系统(java+javaweb+jdbc) 功能介绍: 用户菜单.学生管理.教师管理.课程管理.成绩排名查询 适用 课程设计,大作业,毕业设计,项目练习,学习演示等 //验 ...
- JavaWeb JDBC初步连接和JDBC连接规范化
感谢传智播客提供的学习视频 ,希望传智播客越来越好 package cn.itcast.jdbc;import java.sql.Connection; import java.sql.DriverM ...
- JavaWeb——jdbc与dbcp数据库连接
一.引言 最近在学习使用mybatis调用数据库,顺便总结了下java连接数据库的历史发展.从非常传统的jdbc连接,到数据库连接池(dbcp.c3p0)封装后的jdbc连接,再到各种框架对数据库连接 ...
- 20210213 黑马javaweb JDBC
# 今日内容 1. JDBC基本概念 2. 快速入门 3. 对JDBC中各个接口和类详解 ## JDBC: 1. 概念:Java DataBase Connectivity ...
- JavaWeb JDBC
1.实现第一个JDBC程序 在MySQL中创建一个名称为jdbc的数据库,然后在该数据库中创建一个users表,创建 数据库和表的SQL语句如下所示. CREATE DATABASE jdbc;USE ...
- JavaWeb——JDBC
package jdbc;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;pu ...
- Java项目:医院管理系统(java+javaweb+jdbc+Mysql+lw)
源码获取:博客首页 "资源" 里下载! 功能介绍: 登录.注册.用户/管理员(角色).用户信息管理.科系信息管理.查看所有科系.新增科系信息.删除指定科系.修改科系信息.病房信息管 ...
- Java项目:人事管理系统(java+javaweb+jdbc)
源码获取:博客首页 "资源" 里下载! 功能介绍: 登录.新增.修改.离职 员工管理控制层: @Controller @RequestMapping("/employee ...
最新文章
- ASP.NET 自定义404错误页面
- (转载)为什么欧美拿金牌不感谢祖国
- 图像拼接 python c++
- Wordpress 更新时 不输入ftp相关信息的方法
- 001 Servlet 介绍
- 从CSRF原理到CMS漏洞利用
- ::在sql语句中是什么写法_不懂就问:SQL 语句中 where 条件后 写上1=1 是什么意思...
- go语言web开发 排坑指南
- unity 镜面反射_Unity | Diffuse Light漫反射光照
- Facebook 会沦落为二十年前的微软吗?
- mongodb副本集维护
- 预处理、const、static与sizeof-static全局变量与普通的全局变量有什么区别
- linux系统资源信息监控
- c4d安装没有出现语言文字,关于C4D以及渲染器插件安装时遇到的问题以及解决方法...
- 境外业务性能优化实践
- 老男孩Day1作业(二):三级菜单
- 牛客 | C 选择颜色
- N沟道的Vgs是正的,P沟道的Vgs是负的
- 2010年系统架构师考试题详解
- python 爬取拉钩网数据