JDBC

JDBC介绍

Sun公司为了简化开发人员的(对数据库的统一)操作,提供了(Java操作数据库的)规范,俗称JDBC,这些规范的由具体由具体的厂商去做

对于开发人员来说,我们只需要掌握JDBC接口的操作即可

所需要的jar包

  • java.sql(默认有)
  • javax.sql(默认有)
    还需要导入数据库驱动包

java程序链接mySQL

注意! 增删改操作都需要提交事务

步骤:

  1. 加载驱动
  2. 登陆链接数据库对象
  3. 创建statement对象,用于执行sql语句 statement(清单)
  4. 执行sql语句
  5. 返回结果集,结果集中封装了我们查询的所有结果
  6. 释放链接
// 1.加载驱动Class.forName("com.mysql.jdbc.Driver");//协议://主机:端口/数据库名?编码设置&使用安全的链接String url = "url=jdbc:mysql://localhost:3306/db01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=true";String use = "root";  //用户名String password = "123456";  //密码//2.登陆链接数据库对象Connection connection = DriverManager.getConnection(url, use, password);//3.创建statement对象,用于执行sql语句   statement(清单)Statement statement = connection.createStatement();//4.执行sql语句String sql = "SELECT * from class"; //sql语句//5.返回结果集,结果集中封装了我们查询的所有结果ResultSet resultSet = statement.executeQuery(sql);while (resultSet.next()){System.out.println("classno:"+resultSet.getNString("classno"));System.out.println("classname:"+resultSet.getNString("classname"));System.out.println("department:"+resultSet.getNString("department"));System.out.println("monitor(班长):"+resultSet.getNString("monitor(班长)"));System.out.println("==========================================================");}//6.释放链接resultSet.close();statement.close();connection.close();}
}

几个重要对象

DirverManager 驱动管理

Class.forName("com.mysql.jdbc.Driver");
DriverManager.registerDriver(new Driver()); //这是Driver源码

URL 资源地址

//协议://主机:端口/数据库名?时区设置&编码设置&使用安全的链接
String url = "url=jdbc:mysql://localhost:3306/db01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=true";

Connection 链接对象,操作数据库的对象

connection.commit();  //提交事务
connection.rollback();   //回滚事务
connection.setAutoCommit();  //自动提交事务/* Statemen 清单,执行sql的对象  */
```java
statement.executeQuery("sql");   //执行查询,返回结果集
statement.executeUpdate("sql");  //执行更新(插入和删除也算更新),返回受影响的行数
statement.execute("sql");  //执行全部的sql语句

ResultSet:查询后的结果集

获取数据:

resultSet.getNString();
resultSet.getObject();  //不知道什么类型的情况下使用
resultSet.getInt();
resultSet.getDate();
resultSet.getFloat();

指针移动:

resultSet.next();
resultSet.previous();
resultSet.absolute();
resultSet.beforeFirst();
resultSet.afterLast();

关闭链接

resultSet.close();
statement.close();
connection.close();

SQL注入的问题

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

即:通过sql语句的漏洞来实现一些非法操作.

// 欲根据用户id来进行获取用户的其他信息,但是使用如下语句就会将所有用户的信息都查询到
select * from db01.user where (id =' 'or 1=1)";   --sql注入

PreparedStatement对象

可以防止sql注入,并且效率更高,如: 在编辑sql语句时使用?代表占位符,并且预编译sql语句,随后在设置参数防止sql注入

常用方法:

preparedStatement.executeQuery();
preparedStatement.executeUpdate();
preparedStatement.setString(); //给参数传递字符串类型的值
preparedStatement.setInt();  //给参数传递 int 类型的值
preparedStatement.setDate();  //给参数传递 Date 类型的值
... 等等

例子:

//带参数的sql语句
String sql = "select * from db01.user where(id = ?)" ;
//预编译sql语句并且返回一个PreparedStatement对象
preparedStatement = con.prepareStatement(sql);
//给参数传递值(适当的使用对应类型的方法能提高效率)
preparedStatement.setString(1,id);  //注意下标从1开始
//运行sql语句
resultSet = preparedStatement.executeQuery();

解藕,封装工具类

我们可以将配置信息编写成配置文件(xxx.properties),然后通过 Properties 类读取文件内容对应参数来配置信息

配置文件db.properties, 我们需要将此配置文件放入字节码的相同路径(maven项目的resources目录下)

# 驱动类名
driver=com.mysql.cj.jdbc.Driver
# //协议://主机:端口/数据库名?设置时区&编码设置&使用安全的链接协议
url=jdbc:mysql://localhost:3306/db01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=true
user=root
password=123456

JdbcUtil类

package SQL_injection;import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;public class JdbcUtility {
// 初始化变量,并且避免作用域问题static Properties properties = new Properties();static Connection con = null;static PreparedStatement preparedStatement = null;static ResultSet resultSet = null;static String username = null;static String password = null;//初始化配置static {// 获取输入流, 通过此类的类加载器获取类加载路径,进而获取到配置文件的输入流InputStream in = JdbcUtility.class.getClassLoader().getResourceAsStream("db.properties");try {// 通过properties对象加载配置文件的输入流properties.load(in);
//相当于加载驱动Class.forName("com.mysql.jdbc.Driver"); 只不过是将配置文件的driver参数获取出来           JdbcUtility.class.forName(properties.getProperty("driver"));} catch (Exception e) {e.printStackTrace();}}//使用配置文件内容信息链接数据库public JdbcUtility(){try {//获取配置文件信息String url = properties.getProperty("url");String user = properties.getProperty("user");String password = properties.getProperty("password");// 根据参数链接数据库con = DriverManager.getConnection(url,user,password);} catch (SQLException throwables) {throwables.printStackTrace();}}//使用自定义的用户名和密码登陆数据库public JdbcUtility(String username,String password){try {con = DriverManager.getConnection(properties.getProperty("url"), username, password);} catch (SQLException throwables) {throwables.printStackTrace();}}public boolean select(String id){String sql = "select * from db01.user where(id = ?)" ;//执行查询语句try {preparedStatement = con.prepareStatement(sql);preparedStatement.setString(1,id);resultSet = preparedStatement.executeQuery();if(!resultSet.next()) {System.out.println("查询失败!");return false;}} catch (SQLException throwables) {throwables.printStackTrace();}return true;}public void getResult(){try {do {System.out.print("id:"+resultSet.getString(1)+"\t");//System.out.println("password:"+resultSet.getString(0)+"\t");System.out.print("name:"+resultSet.getString(3)+"\t");System.out.print("sex:"+resultSet.getString(4)+"\t");System.out.print("birthday:"+resultSet.getString(5)+"\t");System.out.println();}while (resultSet.next());}catch (Exception e){e.printStackTrace();}}public void insert(String id ,String name,String sex ){String sql = "insert into db01.user (id,name,sex,birthday) " +"values(?,?,?,?)" ;try {preparedStatement = con.prepareStatement(sql);preparedStatement.setString(1,id);preparedStatement.setString(2,name);preparedStatement.setString(3,sex);Date date = new Date(new java.util.Date().getTime());preparedStatement.setDate(4,date);int n = preparedStatement.executeUpdate();if (n == 0) System.out.println("插入失败!");} catch (SQLException throwables) {throwables.printStackTrace();}}//删除public void delete(String id){String sql = "delete from db01.user where(id = ?);" ;try {preparedStatement  = con.prepareStatement(sql);preparedStatement.setString(1,id);if (preparedStatement.executeUpdate()==0) System.out.println("删除失败!");} catch (SQLException throwables) {throwables.printStackTrace();}}public void update(String id,String columnname,String value){String sql = "update db01.user set "+columnname +" = ? where (id = ? )" ;try {preparedStatement = con.prepareStatement(sql);//preparedStatement.setString(1,columnname);preparedStatement.setString(1,value);preparedStatement.setString(2,id);if(preparedStatement.executeUpdate()==0) System.out.println("更新失败");} catch (SQLException throwables) {throwables.printStackTrace();}}//关闭public void  close(){try {resultSet.close();con.close();preparedStatement.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}

JDBC操作事务

注意! 增删改操作都需要提交事务

常用方法

connection.setAutoCommit(boolean flag); //设置事务是否自动提交,默认是提交的
connection.commit(); //提交事务
connection.rollback(); //回滚事务,一般不用设置,事务一般发送错误会自动回滚

下面代码是模拟一笔转账操作,A账户减少100元,B账户增加100元,两个sql操作为一个事务,同时执行成功或者失败(失败事务发生回滚)

JdbcUtility jdbc = new JdbcUtility();try {//关闭自动提交事务jdbc.con.setAutoCommit(false);//进行一笔转账操作,其中update()方法,参数1代表付款或者收款人,参数2代表是否收款jdbc.update("A",true);jdbc.update("B",false);//提交一笔转账事务jdbc.con.commit();} catch (SQLException throwables) {try {//实际上事务会自动回滚当出现错误时jdbc.con.rollback();} catch (SQLException e) {e.printStackTrace();}throwables.printStackTrace();}

MySQL JDBC常用知识,封装工具类,时区问题配置,SQL注入问题相关推荐

  1. java回顾:JDBC、工具类、事务、SQL注入

    目录 1.概念 2.JDBC核心API的介绍 2.1 JDBC四个核心对象 2.2  JDBC访问数据库的步骤 3.JDBC注册驱动 3.1 jdbc测试 3.2 注册驱动 4.获取连接 4.1 AP ...

  2. mysql中常用的时间工具

    本文记录下mysql中常用的时间工具 文章目录 概述 概述 sql文件 #查询现在的时间 SELECT now() now#格式化时间为时分秒 SELECT DATE_FORMAT(now(), '% ...

  3. 数据库MySQL基础---JDBC开发步骤--JDBC封装工具类--PreparedStatement实现CRUD操作

    JDBC简介 1.JDBC定义Java数据库连接(Java Database Connectivity,简称JDBC):是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询 ...

  4. Java利用反射封装DBUtil,mysql万能增删改查工具类,附源码

    Java利用反射封装DBUtil,mysql万能增删改查工具类,附源码 等有时间再慢慢写代码注释吧,先把源码放出来.文章最后有整个项目的压缩包. ps:拓展 Java 原生MySQL JDBC 插入后 ...

  5. 后端常用数据持久层模板及框架以及一些工具类模板的配置使用集合

    文章目录 后端常用数据持久层模板及框架以及一些工具类模板的配置使用集合 JDBC.c3p0.hibernate配置模板:JDBC模板方法模式.抽象工厂模式封装模板:Spring+hibernate+c ...

  6. MYSQL数据库常用知识整理

    为什么80%的码农都做不了架构师?>>>    MYSQL数据库常用知识整理 什么是MYSQL MYSQL的特性 MYSQL存储引擎的分类以及数据文件的介绍 MYSQL赋权 MYSQ ...

  7. 常用Apache Commons工具类备忘

    常用Apache Commons工具类 ----------------------------------------------------------------- 例如:commons.lan ...

  8. JDBC概念快速入门工具类Util的写法

    JDBC概念&快速入门&工具类Util的写法 概念 Java Database Connectivity Java 数据库连接,用Java语言操作数据库 JDBC本质:官方定义的一套操 ...

  9. 四、EasyExcel实现Excel读写,封装工具类

    在项目中,我们经常用到EasyExcel框架实现:对Excel文件的读写操作.为了方便后续其他项目中的使用,将对Excel文件的读写操作,封装成工具类. 一.EasyExcel实现Excel读写,封装 ...

最新文章

  1. cloudera hbase集群简单思路
  2. appium框架之bootstrap
  3. 数据库分表时OR Mapping方法
  4. select,poll,epoll区别。
  5. 【Leetcode】62. 不同路径
  6. C++多态案例一计算器类
  7. 联想确认再次裁员 称调整主要分布在海外
  8. 苹果笔记本单独安装win10
  9. java asm methodvisitor 定义局部变量_Java ASM3学习(3)
  10. android项目中导入actionbarsherlock 需要注意的地方
  11. 数学归纳法证明求和公式
  12. 弄明白了清华校训“自强不息 厚德载物”的来龙去脉
  13. arcgis for Android 100.4 面积测量
  14. 数学小课堂:数学思维(从逻辑出发想问题)
  15. 无心剑中译拜伦诗4首
  16. java基础编程学习-1
  17. MCNP xsdir中设置XS文件路径并运行一个inp例子
  18. js网页动画,如何做一款高逼格不失真的动画
  19. UOS如何格式化U盘
  20. java金花_炸金花绝对大小计算、比较及排序算法(Java),包含花色参与和不参与大小比较...

热门文章

  1. MVC模式和MVVC模式
  2. JVM——内存泄漏与内存溢出
  3. UsbAccessory
  4. 百趣代谢组学分享,膜脂代谢对桃果实冷藏过程中冷害的影响
  5. 浅谈c/c++中main(),int main(),void main(),int main(void)四者之间的区别
  6. vim 粘贴文本_Vim:在粘贴模式下按Vim粘贴文本
  7. lisp对excel其他行列写入_Visual_LISP与Excel电子表格
  8. Wannafly挑战赛29-A御坂美琴 (dfs+map)
  9. HTML5系列代码:列与列之间的分隔线
  10. 计算机的乘法用英语怎么说,乘法用英语怎么说