1. JDBC 简介

  • JDBC (Java DataBase Connectivity) 就是 Java 数据库连接, 说白了就是用 Java 语言向

    数据库发送 SQL 语句.
  • JDBC 其实是访问数据库的规范(就是一组接口). 而驱动就是该接口的实现类.

2. java 代码操作数据库步骤:

  1. - jar 包: 驱动!! mysql 对应的是 `mysql-connector-java`
  2. - 加载驱动类: `Class.forName('类名');`
  3. - 给出 url, username, password;
  4. - 使用 DriverManager 类得到 Connection 对象.
  5. - 需要声明两个异常: `ClassNotFoundException` `SQLException`.
  1. public class Demo{
  2. /*
  3. * 连接数据库, 得到 Connection 对象
  4. * 对数据库进行增, 删, 改
  5. *
  6. */
  7. public void fun() throws ClassNotFoundException, SQLException{
  8. // 加载驱动类(注册驱动)
  9. Class.forName("com.mysql.jdbc.Driver");
  10. /*
  11. * 与下面代码等同
  12. * com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();
  13. * DriverManager.registerDriver(driver);
  14. *
  15. * 每种数据库的驱动都需要实现 java.sql.Driver 接口.
  16. * Class.forName 用来加载一个类,在加载类的过程中, 会执行该类的静态代码块.
  17. * 所有的 java.sql.Driver 实现类, 都提供了静态代码块, 块内的代码就是把
  18. * 自己注册到 DriverManager 中.
  19. *
  20. * jdbc 4.0 之后, 每个驱动 jar 包中, 在 META-INF/services 目录下提供了
  21. * 一个名为 java.sql.Driver 的文件, 文件的内容就是 java.sql.Driver 的实现类名称.
  22. *
  23. */
  24. // jdbc 协议的格式, jdbc:厂商的名称:子协议(由厂商自己来规定)
  25. // 对 MySql 而言, 它的子协议结构: //主机:端口号/数据库名称
  26. String url = "jdbc:mysql://localhost:3306/mydb1";
  27. // 数据库用户名和密码
  28. String username = "root";
  29. String password = "root";
  30. // 使用 DriverManager, 得到 Connection. 需要导入 java.sql.Connection 包
  31. Connection con = DriverManager.getConnection(url,username,password);
  32. /*
  33. * 对数据库做增, 删, 改
  34. * 1. 通过 Connection 对象得到 Statement 对象, 它的功能是向数据库发送 sql 语句.
  35. * 2. 调用它的 int executeUpdate(String sql), 发送 DML, DDL 语句.
  36. */
  37. // java.sql.Statement 包
  38. Statement stmt = con.createStatement();
  39. // 向数据库中添加数据
  40. String sql = "INSERT INTO stu VALUES(1113,'zhangsan',24,'male')";
  41. // 返回值为 int 类型, 表示 sql 语句所影响的行数
  42. int r = stmt.executeUpdate(sql);
  43. /*
  44. * 执行查询
  45. * 1. 得到 Connection 对象
  46. * 2. 得到 Statement 对象,发送 select 语句
  47. * 调用 Statement 对象的 ResultSet rs = stmt.executeQuery(String querySql);
  48. * 3. 对查询返回的"表格"进行解析!
  49. * 返回的"表格" rs, 有两个虚拟的位置: beforeFirst, afterLast
  50. * rs 的内部有一个行光标, 默认位置为 beforeFirst.
  51. * ResultSet 的 next() 方法可以把光标向下移动一行.
  52. * next() 返回 boolean 类型的值, 表示当前行是否存在.
  53. * ResultSet 提供了一系列的 getXxxx() 方法, 获取某一列中的数据.
  54. * 其中, getString() 和 getObject() 两个方法较为常用.
  55. * JavaSE java.sql.ResultSet 包
  56. */
  57. // 查询 t_stu 表格
  58. String sql2 = "SELECT * FROM t_stu";
  59. ResultSet rs = stmt.executeQuery(sql2);
  60. // 解析"表格"
  61. while(rs.next()){
  62. String name = rs.getString("sname");
  63. int age = rs.getInt("age");
  64. String gender = rs.getString("gender");
  65. System.out.println(name+','+age+','+gender);
  66. }
  67. /*
  68. * 如果不知道列的内容, 还可以使用下面的方法获取
  69. *
  70. * 获取列数
  71. * int count = rs.getMetaData().getColumnCount();
  72. * while(rs.next()){
  73. * for(int i=1; i<=count; i++){
  74. * 获取列中的数据
  75. * System.out.print(rs.getObject(i));
  76. * 如果不是一行结尾, 则在每个列后面加逗号
  77. * if(i<count){
  78. * System.out.print(", ");
  79. * }
  80. * }
  81. * 每一行之后, 换行
  82. * System.out.println();
  83. * }
  84. */
  85. // 关闭资源
  86. // 倒关: 先得到的对象后关闭, 后得到的对象先关闭.
  87. rs.close();
  88. stmt.close();
  89. con.close(); // 这个东西必须关闭!!
  90. }
  91. }

3. JDBC 之代码规范化

  1. 所谓规范化代码就是无论是否出现异常, 都要关闭 ResultSet, Statement 以及 Connection.
  1. public void query(){
  2. Connection con = null;
  3. Statement stmt = null;
  4. ResultSet rs = null;
  5. try{
  6. con = DriverManager.getConnection();
  7. stmt = con.createStatement();
  8. String sql = "SELECT * FROM user";
  9. rs = stmt.executeQuery(sql);
  10. while(rs.next()){
  11. String username = rs.getString(1); // 获取第一列的值, 参数为列编号或列名
  12. String password = rs.getString(2); // 获取第二列的值
  13. System.out.println(username+","+password);
  14. }
  15. } catch(Exception e){
  16. throw new RuntimeException(e);
  17. } finally{
  18. try{
  19. if(rs != null) rs.close();
  20. if(stmt != null) stmt.close();
  21. if(con != null) con.close();
  22. } catch(SQLException e){
  23. throw new RuntimeException(e);
  24. }
  25. }
  26. }

4. JDBC 对象介绍

  • JavaSE 文档中 java.sql 目录下

1. DriverManager

2. Connection 对象

  • 主要用来获取 Statement 对象: Statement stmt = con.createStatement();

3. Statement 对象

  • int executeUpdate(String sql); 执行更新操作, 即执行 insert, update, delete 语句.

    返回 int 类型, 表示 SQL 操作影响的行数.
  • ResultSet executeQuery(String sql); 执行查询操作, 返回 ResultSet.
  • boolean execute(); 可以用来执行增, 删, 改, 查所有 SQL 语句. 返回的是 boolean 类型,

    表示 SQL 语句是否有结果集.

4. ResultSet 之滚动结果集

  • ResultSet 表示结果集, 它是一个二维的表格! ResultSet 内部维护一个行光标, Result 提供了一系列的

    方法来移动光标.
  • 其他数据库默认的结果集不可滚动,不敏感, 不可更新!! 只能使用 next() 方法来移动光标.

    MySql 获得的默认结果集是可滚动.
  • ResultSet 提供了一系列的 getXxx() 方法, 来获取某一列中的数据.

    其中, getString() 和 getObject() 两个方法较为常用, 参数为列编号或列名.
  • 当使用 Connection 的 createStatement 时, 已经确定了 Statement 生成的结果集是什么特性!
  • 结果集特性: 是否可滚动, 是否敏感, 是否可更新!

5. 获取列相关的内容

  • 获取结果即元数据: rs.getMetaData(); 返回值为 ResultSetMetaData();
  • 获取结果集列数: int getColumnCount();
  • 获取指定列的列名: String getColumnName(int colIndex);

5. PreparedStatement 接口

1. 它是 Statement 接口的子接口.
2. 它的强大之处:
  • 防 SQL 攻击
  • 提高代码的可读性, 可维护性
  • 提高效率
3. 使用步骤:
  • 给出 SQL 模板!! 即 SQL 语句中所有的参数使用问号来替代!
  • 调用 Connection 的 PreparedStatement prepareStatement(String sql模板);
  • 调用 pstmt 的 setXxx() 系列方法, 为 SQL 模板中的 "?" 赋值.
  • 调用 pstmt 的 executeUpdate() 或 executeQuery(), 注意, 这两个方法都不需要参数.
  1. // 示例:查询表中的姓名为张三, 年龄为24 的详细信息
  2. // 给出 SQL 模板
  3. String sql = "SELECT * FROM t_user WHERE username=? AND age=?";
  4. // 获取 PreparedStatement 对象, 注意 con.prepareStatement, 为 prepare
  5. PreparedStatement pstmt = con.prepareStatement(sql);
  6. // 为参数赋值
  7. pstmt.setString(1,"张三"); // 给第一个问号赋值, 值为 "张三"
  8. pstmt.setInt(2,24); // 给第二个问号赋值, 值为 24, 不需要使用引号.
  9. // 向数据库发送查询语句
  10. ResultSet rs = pstmt.executeQuery();
4. 预处理的原理
1. 服务器执行 sql 语句,需要执行的工作:
  • 校验 sql 语句的语法!
  • 编译: 将 sql 语句变成一个与函数相似的东西.
  • 执行: 相当于调用函数.
2. PreparedStatement
  • 使用该接口的前提: 连接的数据库必须支持预处理! 几乎没有不支持的.
  • 每个 pstmt 都与一个 sql 模板绑定在一起, 先把 sql 模板给数据库, 数据库进行校验.

    再进行编译, 执行时,只是把参数传递过去而已!
  • 若二次执行时,就不用再次校验语法, 也不用再次编译! 直接执行!

6. MySql 的预处理

  • MySql 的预处理功能默认是关闭的,需要自己手动打开.

参考资料:

JDBC 入门的更多相关文章

  1. Jdbc入门

    JDBC入门 l  导jar包:驱动! l  加载驱动类:Class.forName(“类名”); l  给出url.username.password,其中url背下来! l  使用DriverMa ...

  2. day17(JDBC入门&jdbcUtils工具介绍)

    day17 JDBC整体思维导图 JDBC入门 导jar包:驱动! 加载驱动类:Class.forName("类名"); 给出url.username.password,其中url ...

  3. Java jdbc入门

    1 jdbc入门 1.1 之前操作数据 1)通过mysql的客户端工具,登录数据库服务器  (mysql -u root -p 密码) 2)编写sql语句 3)发送sql语句到数据库服务器执行 1.2 ...

  4. JAVA企业级开发-jdbc入门(09)

    一. jdbc介绍 JDBC全称为:Java DataBase Connectivity(java数据库连接). SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JD ...

  5. 【JDBC】JDBC入门

    JDBC的入门 搭建开发环境 编写程序,在程序中加载数据库驱动 建立连接 创建用于向数据库发送SQL的Statement对象 从代表结果集的ResultSet中取出数据 断开与数据库的连接,并释放相关 ...

  6. 1 初识数据库操作 2 JDBC 入门

    1 JDBC:Java Database Connectivity(Java 数据库连接) 1.1 JDBC 入门程序 注册驱动:Class.forName("com.mysql.cj.jd ...

  7. JDBC学习一---JDBC入门

    原文链接 今天开始会写一系列 Java 后端学习的笔记,一方面是为了以后翻阅查看,更主要的原因是通过写作输出的方式让自己的印象更深,避免遗忘. 首先是简单记录下自己学习使用 JDBC 的历程,由于目前 ...

  8. JDBC入门学习

    Introduction What's JDBC JDBC stands for Java Database Connectivity, which is a standard Java API fo ...

  9. JDBC入门之一--连接Mysql实验

    工具:mysql-connector-java-5.1.40.eclipse 1)首先要将mysql-connector-java包整合到eclipse中,右击项目,然后选择build path,出现 ...

  10. jdbc java数据库连接 1)jdbc入门

      之前操作数据 1)通过mysql的客户端工具,登录数据库服务器  (mysql -u root -p 密码) 2)编写sql语句 3)发送sql语句到数据库服务器执行 什么是jdbc? 使用jav ...

随机推荐

  1. Oracle学习笔记(5)——查询

    基本查询语句 SELECT [DISTINCT] column_name1,...|* FROM table_name [WHERE conditions] 在SQL*PLUS中设置格式 更改显示字段 ...

  2. oracle备份还原数据库

    首先到对应bin目录下打开cmd(windows),linux用相应终端链接:eg:D:\app\sun\product\11.2.0\dbhome_1\BIN 用户备份:exp u_tdms/p_t ...

  3. css3 animation steps制作饿了么loading

    html代码 <!DOCTYPE html> <html> <head> <title></title> </head> < ...

  4. CentOS设置程序开机自启动的方法

    转自:http://www.centos.bz/2011/09/centos-setup-process-startup-boot/ 在CentOS系统下,主要有两种方法设置自己安装的程序开机启动. ...

  5. VmWare下安装CentOS6

    为什么选择CentOS ? 1. 主流: 目前的Linux操作系统主要应用于生产环境,主流企业级Linux系统仍旧是RedHat或者CentOS 2. 免费: RedHat 和CentOS差别不大,C ...

  6. Codeforces Round #244 (Div. 2)——Checkposts

    题目链接 题意: 给定n个点,每一个点有一个权值的有向图.如今须要选定一些点,使得这些点权值和最小.且满足:假设i能到达j且j能到达i,那么i.j能够仅仅选一个 分析: 强联通模板题 //使用时仅仅更 ...

  7. ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例

    这篇文章主要介绍了ThinkPHP使用PHPExcel实现Excel数据导入导出,非常实用的功能,需要的朋友可以参考下 本文所述实例是使用在Thinkphp的开发框架上,要是使用在其他框架也是同样的方 ...

  8. unity3d 导入google play services插件工程

    最近在给unity工程尝试接入google play services插件,遇到了些问题,记录一下. 之前在做android插件的时候,都是自己创建一个android工程,把生成的.class文件打包 ...

  9. mysql workbench 将查询结果导出 sql 文件

    之前一直使用的是plsql,因为换了家公司所以改成mysql了,我使用的时候mysql免费的客户端工具 workbench, 因为之前没用过,所以有很多功能找不到. 这里将用到的功能记录一下: 1:将 ...

  10. docker下部署spring boot

    第 5 章 Docker + Spring Boot: 快速搭建和部署Java Web应用 0.你需要: JDK 1.8 : java -version Maven 3.0+ : mvn -v Git ...