数据库技术之-JDBC

2021-08-13 13:15:14 浏览数 (1)

1.为何要学习JDBC

思考:车想要过河怎么办?

对:桥!

程序中的桥!

说白了:java程序想要和Mysql进行通信,就必须使用到JDBC技术!

需要明确的点:

1)JDBC是java官方推出的,所以可以跨平台

2)JDBC是javaSE程序连接数据库的桥梁,所以跟你使用哪一类程序没有关系,也就是说不管你使用javaSE程序还是以后的JavaWeb程序

2.JDBC的简介

2.1.JDBC概念

JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句的一种技术手段!

2.2.JDBC原理

多态!

早期SUN公司的天才们想编写一套可以连接天下所有数据库的API,但是当他们刚刚开始时就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了。后来SUN开始与数据库厂商们讨论,最终得出的结论是,由SUN提供一套访问数据库的规范(就是一组接口),并提供连接数据库的协议标准,然后各个数据库厂商会遵循SUN的规范提供一套访问自己公司的数据库服务器的API出现。SUN提供的规范命名为JDBC,而各个厂商提供的,遵循了JDBC规范的,可以访问自己数据库的API被称之为驱动!

JDBC是接口,而JDBC驱动才是接口的实现,没有驱动无法完成数据库连接!每个数据库厂商都有自己的驱动,用来连接自己公司的数据库。

当然还有第三方公司专门为某一数据库提供驱动,这样的驱动往往不是开源免费的!

2.3.JDBC核心类(接口)介绍

DriverManager:用于注册驱动

Connection: 表示与数据库创建的连接

Statement: 操作数据库sql语句的对象

ResultSet: 结果集或一张虚拟表

DriverManger(驱动管理器)的作用有两个:

  1. 注册驱动:这可以让JDBC知道要使用的是哪个驱动;
  2. 获取Connection:如果可以获取到Connection,那么说明已经与数据库连接上了。

Connection对象表示连接,与数据库的通讯都是通过这个对象展开的;

Connection最为重要的一个方法就是用来获取Statement对象;

Statement是用来向数据库发送SQL语句的,这样数据库就会执行发送过来的SQL语句;

void executeUpdate(Stringsql):执行更新操作(insert、update、delete等);

ResultSetexecuteQuery(String sql):执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet;

ResultSet对象表示查询结果集,只有在执行查询操作后才会有结果集的产生;

结果集是一个二维的表格,有行有列。操作结果集要学习移动ResultSet内部的“行光标”,以及获取当前行上的每一列上的数据;

booleannext():使”行光标”移动到下一行,并返回移动后的行是否存在;

XXXgetXXX(int col):获取当前行指定列上的值,参数就是列数,列数从1开始,而不是0。

3.JDBC入门程序

3.1.步骤

3.1.1.创建一个普通Java工程

3.1.2.准备Mysql驱动包

3.1.3.将Mysql驱动包变为小奶瓶

3.1.4.编写JDBC程序代码

3.2.JDBC代码实战

3.2.1.注册驱动类

//注册驱动DriverManager.registerDriver(new com.mysql.jdbc.Driver());

3.2.1.2.创建数据库连接对象

//创建连接String url="jdbc:mysql://localhost:3306/mydb1";String user = "root";String pwd ="12345";Connection connection = DriverManager.getConnection(url, user, pwd);

3.2.1.3.创建sql执行器

//创建sql执行器 Statement statement = connection.createStatement();

3.2.1.4.编写sql语句

//编写sqlString sql="select * from tb_user";

3.2.1.5.使用sql执行器执行sql

ResultSet set = statement.executeQuery(sql);

3.2.1.6.处理结果

ResultSet rs = statement.executeQuery(sql); while(rs.next()) { // System.out.println(rs.getInt("id"));// System.out.println(rs.getString("name"));// System.out.println(rs.getInt("age")); System.out.println(rs.getObject(1)); System.out.println(rs.getObject(2)); System.out.println(rs.getObject(3)); System.out.println("========================"); }

3.2.1.7.关闭资源

rs.close(); statement.close(); connection.close();

4.Jdbc其它功能

插入 修改 删除

插入

修改

删除

java.sql.Statement接口用于执行SQL 语句

ResultSet executeQuery(String sql) 根据查询语句返回结果集。只能执行select语句。

int executeUpdate(String sql) 根据执行的DML(insertupdate delete)语句,返回受影响的行数。

booleanexecute(String sql) 此方法可以执行任意sql语句。返回boolean值,表示是否返回ResultSet结果集。仅当执行select语句,且有返回结果时返回true, 其它语句都返回false;

4.1.插入功能

DriverManager.registerDriver(new com.mysql.jdbc.Driver()); String url = "jdbc:mysql://localhost:3306/mydb1"; String user = "root"; String password = "12345"; Connection connection = DriverManager.getConnection(url, user, password); Statement statement = connection.createStatement(); String sql = "INSERT INTO tb_user(id,name,password)values(4,'王五','12345')"; inti = statement.executeUpdate(sql); System.out.println(i);

4.2.修改

/** * 数据库修改操作 * @throws SQLException */ public void update() throws SQLException { //1. 注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //2.获取连接对象 // Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "12345"); //3.创建sql执行器 Statement Statement = connection.createStatement(); //4.编写sql语句 String sql="update tb_user2 SET username='马蓉' where id = 7"; //5.sql执行器执行sql语句 int i = Statement.executeUpdate(sql); System.out.println("i:" i); if(i>0) { System.out.println("更新数据成功!"); } else { System.out.println("更新数据失败!"); } //6.处理结果 //7.关闭资源 Statement.close(); connection.close(); }

4.3.删除

/** * 数据库删除操作 * @throws SQLException */ public void delete() throws SQLException { // DELETE from tb_user2 where id = 9 //1. 注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //2.获取连接对象 // Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "12345"); //3.创建sql执行器 Statement Statement = connection.createStatement(); //4.编写sql语句 String sql="DELETE from tb_user2 where id = 9"; //5.sql执行器执行sql语句 int i = Statement.executeUpdate(sql); System.out.println("i:" i); if(i>0) { System.out.println("删除数据成功!"); } else { System.out.println("删除数据失败!"); } //6.处理结果 //7.关闭资源 Statement.close(); connection.close(); }

4.4.jdbc中插入字符串拼接

/** * 数据库插入操作 * @throws SQLException */ public void add() throws SQLException { //1. 注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //2.获取连接对象 // Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "12345"); //3.创建sql执行器 Statement Statement = connection.createStatement(); //4.编写sql语句 // 将sql语句中 字段对应的值 使用字符串拼接的方式换掉 不要写死 // 替换时候原则 :分类型 字符串(int) 整数类型(int) // 换的语法: " 变量值 " String a = "ccc"; int b = 10; Stringsql="INSERTINTOtb_user2(id,username,password,age,sex)VALUES(" b ",'" a "','1245',180,'坏蛋')"; System.out.println("sql:" sql); //5.sql执行器执行sql语句 int i = Statement.executeUpdate(sql); System.out.println("i:" i); if(i>0) { System.out.println("插入数据成功!"); } else { System.out.println("插入数据失败!"); } //6.处理结果 //7.关闭资源 Statement.close(); connection.close(); }

5.JDBC工具类封装

5.1.jdbc增删改查步骤回顾

查询

@Test publicvoid fun1() throws SQLException { //1.注册驱动 DriverManager.registerDriver(new Driver()); //2.创建连接 String url = "jdbc:mysql://localhost:3306/gb1840"; String username = "root"; String password = "12345"; Connection connection = DriverManager.getConnection(url, username, password); //3.创建sql执行器 Statement Statement = connection.createStatement(); //4.编写sql语句 String sql = "SELECT * from tb_user"; //5.执行sql ResultSet rs = Statement.executeQuery(sql); //6.处理结果 while(rs.next()) { System.out.println("name:" rs.getString("name")); } // 关闭资源 Statement.close(); connection.close(); }

添加

@Test publicvoid fun2() { String url = "jdbc:mysql://localhost:3306/gb1840"; String username = "root"; String password = "12345"; Connection connection = null; Statement Statement = null; try { //1.注册驱动 DriverManager.registerDriver(new Driver()); //2.创建连接 connection = DriverManager.getConnection(url, username, password); //3.创建sql执行器 Statement = connection.createStatement(); //4.编写sql语句 String sql = "INSERT INTO tb_user(id,name,age,gender,department,salary)values(1024,'夏侯阳',21,'男','将军部',1000)"; //5.执行sql inti = Statement.executeUpdate(sql); //6.处理结果 System.out.println("i:" i); } catch (Exception e) { // TODO: handle exception } finally{ if(Statement!=null) { try { Statement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(connection!=null) { try { connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }

修改

删除

……

分析上面这些代码存在什么问题呢?

1.connection中参数重复

2.connection每次都要去创建

3.释放资源每次都要去释放

5.2.抽取工具类步骤

5.2.0.思路分析

5.2.1.抽取字符串

package com.yueqian;publicclass JDBCUtil {public static String url = "mysql:jdbc://localhost:3306/jdbcdemo";public static String username = "root";public static String password = "12345";public static String driverClassName = "com.mysql.jdbc.Driver"; }

5.2.3.抽取connection

publicclass JDBCUtil{ publicstatic String url = "jdbc:mysql://localhost:3306/gb1840"; publicstatic String username = "root"; publicstatic String password = "12345"; public Connection getConnection(){Connection con = null; // 1.注册驱动 try { // 注册驱动 Class.forName(JDBCUntils.DriverClassName); // 2.创建连接 con = DriverManager.getConnection(JDBCUtil.url, JDBCUtil.username, JDBCUtil.password); } catch (SQLException e) { e.printStackTrace(); } returncon; }}

@Test publicvoid fun2(){ Connection connection = null; Statement Statement = null; try { //1.注册驱动 //2.创建连接 connection = JDBCUtil.getConnection(); //3.创建sql执行器 Statement = connection.createStatement(); //4.编写sql语句 String sql = "INSERT INTO tb_user(id,name,age,gender,department,salary)values(1024,'夏侯阳',21,'男','将军部',1000)"; //5.执行sql inti = Statement.executeUpdate(sql); //6.处理结果 System.out.println("i:" i); } catch (Exception e) { // TODO: handle exception } finally{ if(Statement!=null) { try { Statement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(connection!=null) { try { connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }

驱动加载了多次!

5.2.4.抽取注册驱动

publicclass JDBCUntils { publicstatic String DriverClassName = "com.mysql.jdbc.Driver"; publicstatic String url = "jdbc:mysql://localhost:3306/gz1904"; publicstatic String user = "root"; publicstatic String password = "12345"; static { try { Class.forName(JDBCUntils.DriverClassName); } catch (ClassNotFoundException e) { e.printStackTrace(); } } publicstatic Connection getConnection() throws ClassNotFoundException { Connection con = null; try { con = DriverManager.getConnection(JDBCUntils.url,JDBCUntils.user, JDBCUntils.password); } catch (SQLException e) { e.printStackTrace(); } returncon; } }

5.2.5.抽取释放资源

publicstaticvoid close(Statement st,Connection con,ResultSet rs) { if(st!=null) { try { st.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(con!=null) { try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(rs!=null) { try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

@Test publicvoid fun2() { Connection connection = null; Statement Statement = null; try { //1.注册驱动 //2.创建连接 connection = JDBCUtil.getConnection(); //3.创建sql执行器 Statement = connection.createStatement(); //4.编写sql语句 String sql = "INSERT INTO tb_user(id,name,age,gender,department,salary)values(1025,'夏侯阳1212',21,'男','将军部',1000)"; //5.执行sql inti = Statement.executeUpdate(sql); //6.处理结果 System.out.println("i:" i); } catch (Exception e) { // TODO: handle exception } finally{ JDBCUtil.close(st, con, rs); } }

6.JDBC和对象封装结合

publicstaticvoid main(String[] args) throws SQLException { try { Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/gz1904", "root", "12345"); String sql = "SELECT * from tb_test WHERE id = ?"; PreparedStatement prepareStatement = connection.prepareStatement(sql); prepareStatement.setInt(1,12); ResultSet rs = prepareStatement.executeQuery(); while(rs.next()) { Person p = new Person(); p.setId(rs.getInt("id")); p.setName(rs.getString("name")); p.setGender(rs.getString("gender")); System.out.println(p); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }

7.JDBC中预编译模板

7.1.预编译模板简介

仔细观察我们的代码,每次都要自己手动拼接sql语句

Statement接口:用于java程序与数据库之间的数据传输

7.2.预编译模板实战

查询

publicvoid fun2() { Connection connection = null; Statement Statement = null; try { //1.注册驱动 //2.创建连接 connection = JDBCUtil.getConnection(); //4.编写sql语句 String sql = "SELECT * from tb_user where id=?"; //3.创建sql执行器 //Statement = connection.createStatement(); PreparedStatement prepareStatement = connection.prepareStatement(sql); prepareStatement.setInt(1,[n1] 1001[n2] ); //5.执行sql ResultSet rs = prepareStatement.executeQuery(); //6.处理结果 while(rs.next()) { System.out.println("id:" rs.getInt("id")); } } catch (Exception e) { // TODO: handle exception } finally{ // JDBCUtil.close(st, con, rs); } }

删除/修改/添加

intexecuteUpdate = prepareStatement.executeUpdate();

8.用户登录注册

将 IO流版本的注册登录 改为 jdbc版本


[n1]参数顺序

从1 开始,并不是从0

[n2]填写具体的值

0 人点赞