1. JDBC 简介

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

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

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

- 导 jar 包: 驱动!! mysql 对应的是 `mysql-connector-java`
- 加载驱动类: `Class.forName('类名');`
- 给出 url, username, password;
- 使用 DriverManager 类得到 Connection 对象.
- 需要声明两个异常: `ClassNotFoundException` 和 `SQLException`.
public class Demo{

    /*
* 连接数据库, 得到 Connection 对象
* 对数据库进行增, 删, 改
*
*/ public void fun() throws ClassNotFoundException, SQLException{
// 加载驱动类(注册驱动)
Class.forName("com.mysql.jdbc.Driver");
/*
* 与下面代码等同
* com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();
* DriverManager.registerDriver(driver);
*
* 每种数据库的驱动都需要实现 java.sql.Driver 接口.
* Class.forName 用来加载一个类,在加载类的过程中, 会执行该类的静态代码块.
* 所有的 java.sql.Driver 实现类, 都提供了静态代码块, 块内的代码就是把
* 自己注册到 DriverManager 中.
*
* jdbc 4.0 之后, 每个驱动 jar 包中, 在 META-INF/services 目录下提供了
* 一个名为 java.sql.Driver 的文件, 文件的内容就是 java.sql.Driver 的实现类名称.
*
*/ // jdbc 协议的格式, jdbc:厂商的名称:子协议(由厂商自己来规定)
// 对 MySql 而言, 它的子协议结构: //主机:端口号/数据库名称
String url = "jdbc:mysql://localhost:3306/mydb1"; // 数据库用户名和密码
String username = "root";
String password = "root"; // 使用 DriverManager, 得到 Connection. 需要导入 java.sql.Connection 包
Connection con = DriverManager.getConnection(url,username,password); /*
* 对数据库做增, 删, 改
* 1. 通过 Connection 对象得到 Statement 对象, 它的功能是向数据库发送 sql 语句.
* 2. 调用它的 int executeUpdate(String sql), 发送 DML, DDL 语句.
*/
// java.sql.Statement 包
Statement stmt = con.createStatement(); // 向数据库中添加数据
String sql = "INSERT INTO stu VALUES(1113,'zhangsan',24,'male')"; // 返回值为 int 类型, 表示 sql 语句所影响的行数
int r = stmt.executeUpdate(sql); /*
* 执行查询
* 1. 得到 Connection 对象
* 2. 得到 Statement 对象,发送 select 语句
* 调用 Statement 对象的 ResultSet rs = stmt.executeQuery(String querySql);
* 3. 对查询返回的"表格"进行解析!
* 返回的"表格" rs, 有两个虚拟的位置: beforeFirst, afterLast
* rs 的内部有一个行光标, 默认位置为 beforeFirst.
* ResultSet 的 next() 方法可以把光标向下移动一行.
* next() 返回 boolean 类型的值, 表示当前行是否存在.
* ResultSet 提供了一系列的 getXxxx() 方法, 获取某一列中的数据.
* 其中, getString() 和 getObject() 两个方法较为常用.
* JavaSE java.sql.ResultSet 包
*/ // 查询 t_stu 表格
String sql2 = "SELECT * FROM t_stu";
ResultSet rs = stmt.executeQuery(sql2); // 解析"表格"
while(rs.next()){
String name = rs.getString("sname");
int age = rs.getInt("age");
String gender = rs.getString("gender"); System.out.println(name+','+age+','+gender);
} /*
* 如果不知道列的内容, 还可以使用下面的方法获取
*
* 获取列数
* int count = rs.getMetaData().getColumnCount();
* while(rs.next()){
* for(int i=1; i<=count; i++){
* 获取列中的数据
* System.out.print(rs.getObject(i));
* 如果不是一行结尾, 则在每个列后面加逗号
* if(i<count){
* System.out.print(", ");
* }
* }
* 每一行之后, 换行
* System.out.println();
* }
*/ // 关闭资源
// 倒关: 先得到的对象后关闭, 后得到的对象先关闭.
rs.close();
stmt.close();
con.close(); // 这个东西必须关闭!!
}
}

3. JDBC 之代码规范化

  1. 所谓规范化代码就是无论是否出现异常, 都要关闭 ResultSet, Statement 以及 Connection.
public void query(){
Connection con = null;
Statement stmt = null;
ResultSet rs = null; try{
con = DriverManager.getConnection();
stmt = con.createStatement(); String sql = "SELECT * FROM user";
rs = stmt.executeQuery(sql); while(rs.next()){
String username = rs.getString(1); // 获取第一列的值, 参数为列编号或列名
String password = rs.getString(2); // 获取第二列的值
System.out.println(username+","+password);
}
} catch(Exception e){
throw new RuntimeException(e);
} finally{
try{
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch(SQLException e){
throw new RuntimeException(e);
}
}
}

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(), 注意, 这两个方法都不需要参数.
// 示例:查询表中的姓名为张三, 年龄为24 的详细信息

    // 给出 SQL 模板
String sql = "SELECT * FROM t_user WHERE username=? AND age=?"; // 获取 PreparedStatement 对象, 注意 con.prepareStatement, 为 prepare
PreparedStatement pstmt = con.prepareStatement(sql); // 为参数赋值
pstmt.setString(1,"张三"); // 给第一个问号赋值, 值为 "张三"
pstmt.setInt(2,24); // 给第二个问号赋值, 值为 24, 不需要使用引号. // 向数据库发送查询语句
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. Activity具体解释(生命周期、启动方式、状态保存,全然退出等)

    一.什么是Activity? 简单的说:Activity就是布满整个窗体或者悬浮于其它窗体上的交互界面. 在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的A ...

  2. SpringBoot学习小结

    基于Spring,简化Spring应用开发的框架,整个Spring技术栈的大整合,J2EE开发的一站式解决方案 优点: 快速创建独立运行的Spring项目以及集成主流框架 使用嵌入式的Servlet容 ...

  3. OgnlValueStack:49 - Error setting expression 'sfjmyh.zdyx6' with value '[Ljava.lang.String;@28d320d6'

    作过户管理流程时,提交表单后控制台显示如下错误 : WARN com.opensymphony.xwork2.ognl. OgnlValueStack:60 - Error setting expre ...

  4. JSON——Java中的使用

    1. 构建JSON方法(数据——>JSON) 这里使用Maven构建项目 在pom.xml中添加如下依赖 <dependency> <groupId>org.json&l ...

  5. mac系统中搭建apache+mysql+php的开发环境,安装mysql后,登录报错:mac ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

    php新手在mac系统中搭建apache+mysql+php的开发环境(按照这篇博客来操作的:http://my.oschina.net/joanfen/blog/171109?fromerr=xvC ...

  6. CSS3 稳固而知新: 居中

    水平居中 transform: translateX(-50%); left: 50%; 垂直居中同理 transform: translateY(-50%);   top:50%;     垂直水平 ...

  7. Atitit.wrmi web rmi框架新特性

    Atitit.wrmi web rmi框架新特性 1. V1d  新特性1 1.1. 增加了精确参数1 1.2. 增加了req参数,命名参数模式..1 1.3. 增加了globale  传递隐含参数r ...

  8. Atitit.软件命名空间  包的命名统计 及命名表(2000个名称) 方案java package

    Atitit.软件命名空间  包的命名统计 及命名表(2000个名称) 方案java package 1. 统计的lib jar 列表1 2. Code3 3. 常用包名按找字母排序(2000个)4 ...

  9. Python常见经典 python中if __name__ == '__main__': 的解析

    当你打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__.一个 ...

  10. Android开发学习秘籍笔记(十九)

    吼.花了2天最后做出了一个类似于蓝牙串口助手功能的小程序,事实上也是实习公司的要求---有一个蓝牙无线扫描枪,要求终端能够通过蓝牙连接到该设备,而且蓝牙无线扫描枪扫描二维码或者条形码的时候能够将二维码 ...