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(驱动管理器)的作用有两个:
- 注册驱动:这可以让JDBC知道要使用的是哪个驱动;
- 获取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]填写具体的值