Java中JDBC详解
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 点击跳转浏览。
JDBC是什么
概念:Java DataBase Connectivity
- JDBC本质::其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。 Java 访问数据库的标准规范.
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
JDBC能做什么
连接数据库
为什么有JDBC
- 程序员如果要开发访问数据库的程序, 只需要会调用 JDBC 接口中的方法即可, 不用关注类是如何实现的。
- 使用同一套 Java 代码,进行少量的修改就可以访问其他 JDBC 支持的数据库
操作步骤
1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下2.右键-->Add As Library2. 注册驱动3. 获取数据库连接对象 Connection4. 定义sql5. 获取执行sql语句的对象 Statement6. 执行sql,接受返回结果7. 处理结果8. 释放资源
//1. 导入驱动jar包//2.注册驱动Class.forName("com.mysql.jdbc.Driver");//3.获取数据库连接对象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");//4.定义sql语句String sql = "update account set balance = 500 where id = 1";//5.获取执行sql的对象 StatementStatement stmt = conn.createStatement();//6.执行sqlint count = stmt.executeUpdate(sql);//7.处理结果System.out.println(count);//8.释放资源stmt.close();conn.close();
JDBC 的核心 API
DriverManager:驱动管理对象
- 管理和注册驱动
- 创建数据库的连接
类中的方法:
使用 JDBC 连接数据库的四个参数:
连接数据库的 URL 地址格式:
协议名:子协议://服务器名或 IP 地址:端口号/数据库名?参数=参数值
乱码的处理
如果数据库出现乱码,可以指定参数: ?characterEncoding=utf8,表示让数据库以 UTF-8 编码来处理数据。
jdbc:mysql://localhost:3306/数据库?characterEncoding=utf8
Connection 接口:
Connection 接口,具体的实现类由数据库的厂商实现,代表一个连接对象。
- 功能:
1. 获取执行sql 的对象
* Statement createStatement()
* PreparedStatement prepareStatement(String sql)
2. 管理事务:
* 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
* 提交事务:commit()
* 回滚事务:rollback()
Statement 接口
Statement 作用:
代表一条语句对象,用于发送 SQL 语句给服务器,用于执行静态 SQL 语句并返回它所生成结果的对象。
Statement 中的方法:
释放资源
- 需要释放的对象: ResultSet 结果集, Statement 语句, Connection 连接
- 释放原则:先开的后关,后开的先关。 ResultSet Statement Connection
- 放在哪个代码块中: finally 块
ResultSet:结果集对象,封装查询结果
- boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
* getXxx(参数):获取数据
* Xxx:代表数据类型 如: int getInt() , String getString()
* 参数:
1. int:代表列的编号,从1开始 如: getString(1)
2. String:代表列名称。 如: getDouble(“balance”)
PreparedStatement:执行sql的对象
- SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
三、SQL注入攻击实例比如在一个登录界面,要求输入用户名和密码:可以这样输入实现免帐号登录:用户名: ‘or 1 = 1 –密 码:点登陆,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题)这是为什么呢? 下面我们分析一下:从理论上说,后台认证程序中会有如下的SQL语句:String sql = "select * from user_table where username=' "+userName+" ' and password=' "+password+" '";当输入了上面的用户名和密码,上面的SQL语句变成:SELECT * FROM user_table WHERE username='’or 1 = 1 -- and password='’分析SQL语句:条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。这还是比较温柔的,如果是执行SELECT * FROM user_table WHEREusername='' ;DROP DATABASE (DB Name) --' and password=''….其后果可想而知…
2. 解决sql注入问题:使用PreparedStatement对象来解决3. 预编译的SQL:参数使用?作为占位符4. 步骤:1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar2. 注册驱动3. 获取数据库连接对象 Connection4. 定义sql* 注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;5. 获取执行sql语句的对象 PreparedStatement Connection.prepareStatement(String sql) 6. 给?赋值:* 方法: setXxx(参数1,参数2)* 参数1:?的位置编号 从1 开始* 参数2:?的值7. 执行sql,接受返回结果,不需要传递sql语句8. 处理结果9. 释放资源
- 注意:后期都会使用PreparedStatement来完成增删改查的所有操作
1. 可以防止SQL注入
2. 效率更高
案例
需求:确保数据库中有 3 条以上的记录,查询所有的学员信息
/**
* 查询所有的学生信息
*/
public class Demo6DQL {
public static void main(String[] args) throws SQLException {//1) 得到连接对象Connection connection =DriverManager.getConnection("jdbc:mysql://localhost:3306/day24","root","root");//2) 得到语句对象Statement statement = connection.createStatement();//3) 执行 SQL 语句得到结果集 ResultSet 对象ResultSet rs = statement.executeQuery("select * from student");//4) 循环遍历取出每一条记录while(rs.next()) {int id = rs.getInt("id");String name = rs.getString("name");boolean gender = rs.getBoolean("gender");Date birthday = rs.getDate("birthday");//5) 输出的控制台上System.out.println("编号: " + id + ", 姓名: " + name + ", 性别: " + gender + ", 生日: " +birthday);}//6) 释放资源rs.close();statement.close();connection.close();}
}
关于 ResultSet 接口中的注意事项:
- 如果光标在第一行之前,使用 rs.getXX()获取列值,报错: Before start of result set
- 如果光标在最后一行之后,使用 rs.getXX()获取列值,报错: After end of result set
- 使用完毕以后要关闭结果集 ResultSet,再关闭 Statement,再关闭 Connection
新创建一个公众号 Rockey小何同学 想相互交流的同学可以关注一下哈! 感谢支持!
Java中JDBC详解相关推荐
- Java中CAS详解
转载自 Java中CAS详解 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换 ...
- Java中LinkedList详解
Java中LinkedList详解 LinkedList底层是双向链表 单向链表 双向链表 LinkedList新增的方法 主要增加了针对头结点与尾结点进行操作的方法, 即针对第一个元素和最后一个元素 ...
- Java中super详解
目录 Java中super详解 super的作用: 1. 通过super可以访问父类的构造方法 2. 通过super可以访问父类的属性(非私有) 3. 通过super可以访问 ...
- java中匿名内部类详解_java 中匿名内部类的实例详解
搜索热词 java 中匿名内部类的实例详解 原来的面貌: class TT extends Test{ void show() { System.out.println(s+"~~~哈哈&q ...
- java中priorityqueue_详解JAVA中priorityqueue的具体使用
Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示.本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度, ...
- java中implement_详解JAVA中implement和extends的区别
详解JAVA中implement和extends的区别 extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,Java中不支持多重继承,但是可以用接口来实 ...
- java中final详解_Java中final用法与详解
Java中final用法与详解 final作为Java中经常用到的关键字,了解final的使用方法是非常有必要的.这里从final关键字在数据域.方法和类中三个方面分析final关键字的主要用法. f ...
- java中getclass_详解java中this.getClass()和super.getClass()的实例
详解java中this.getClass()和super.getClass()的实例 前言: 遇到this.getClass()和super.getClass()的返回值感到疑惑,经过探索豁然开朗. ...
- java中File详解
#第六部分:IO流 ##1. File类的作用 File类是Java.io包中唯一代表磁盘我呢见本身的对象.File类定义类一些与平台无关的方法 来操作文件,File类主要用来获取或处理与磁盘文件相关 ...
最新文章
- 手把手教你安装深度学习软件环境(附代码)
- python基础知识笔记简书_Python学习笔记01——基础知识
- (转)jQuery.fn.extend与jQuery.extend到底区别在哪?
- 10分钟让你明白什么是ERP
- 深入理解Openstack自动化部署
- vs2017 linux so导出函数,将Visual Studio 2017中的Assembly和C ++与命令行和输出相结合
- git提取和拉取的区别_git fetch和git pull的区别
- WIN10远程连接时提示内部错误
- 本机连接opc server有部分数据不刷新_实时数据库PI在企业MES系统中的应用
- Android仿网易头条评论,仿网易/今日头条滑动视图
- phpstudy+TP5隐藏入口文件
- 【通讯录自动导入】txt格式转vcf格式
- “值得”关注公司:我们应该向优衣库学习什么?
- 麦当劳可以免费添加可乐的!
- prometheus服务配置Altermanager监控告警
- 已知函数fx=sin(wx+φ)_考点13 y=sin(wx+φ)的图像与性质(解析版)
- 传感器和变送器的区别
- 设计模式学习-工厂模式
- 腾讯云·部署Eclipse Che(云原生IDE)(CSDN云通用)
- c# 设置桌面图标_C#:设置图标