JAVA11-JDBC学习
Posted 芒果侠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA11-JDBC学习相关的知识,希望对你有一定的参考价值。
1.JDBC概念
全称:java database connectivity ,JDBC 规范定义接口,
1) JDBC 是 官方(SUN公司)定义的一套操作所有关系型数据库的规则,也就是接口,称之为Java 访问数据库的标准规范;
2)具体的实现由各大数据库厂商来实现这套接口,提供数据库驱动的jar包,我们可以使用这套接口(jdbc)编程,实际上执行的代码是jar包的实现类。操作数据库还需要具体的实现类,也就是数据库驱动。真正执行的代码是驱动jar包中的实现类,比方说之前写的接口
Person接口 worker实现类 写出: Person person = new worker();
含义就是父类引用指向子类对象的方式,而执行person.eat()执行worker实现类的方法,产生了一个多态的调用。因此在jdbc编程当中,都是用接口类型来调用方法,而当我导入了jar包之后,调用的是实现类的实现方法。
3)每个 数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即 可,数据库驱动由数据库厂商提供。
4)jar包一般包含的内容
使用 JDBC 的好处:
1) 程序员如果要开发访问数据库的程序,只需要会调用 JDBC 接口中的方法即可,不用关注类是如何实现的。
2) 使用同一套 Java 代码,进行少量的修改就可以访问其他 JDBC 支持的数据库
1.1.jdbc的快速入门之jdbc执行的基本步骤
- 1)导入驱动jar包,我们目前用的是mysql-connector-java-5.1.37
- 2)去编写代码来注册驱动
- 3)获取数据库的连接对象Connection,它是本地的java代码和数据库之间的桥梁对象
- 4)有了连接对象后,我们就可以定义sql语句
- 5)Connection不能直接执行sql语句,需要获取执行sql语句对象(也就是Statement)
- 6)执行sql,接收返回结果
- 7)有了返回结果,处理这个返回结果。
- 8)释放资源
1 public class jdbcDemo01 { 2 public static void main(String[] args) throws Exception { 3 // 1)导入驱动jar包 4 // 2)注册驱动 5 Class.forName("com.mysql.jdbc.Driver"); 6 //3) 获取数据库的连接对象 7 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "root"); 8 //4) 定义sql语句 9 String sql = "update account set balance = 5000 where id =1 "; 10 // 5) 获取执行sql语句的对象 Statement 11 Statement stmt = conn.createStatement(); 12 // 6)执行sql语句 13 int conut = stmt.executeUpdate(sql); 14 //7)有了结果,处理结果,打印一下 15 System.out.println(conut); 16 // 8)释放资源 17 stmt.close(); 18 conn.close(); 19 } 20 }
2.现在我们针对这里面出现的各个对象进行详细解答
2.1 DriverManager 驱动管理对象
功能1: 注册驱动 为何能注册驱动,因为里面有方法 static void registerDriver(Driver driver) 向 DriverManager 注册给定驱动程序。
我们写代码 Class.forName("com.mysql.jdbc.Driver");来注册加载驱动,为何不是上面的方法呢,,此处com.mysql.jdbc.Driver加载能执行,说明com.mysql.jdbc.Driver这个类里面一定存在一个静态代码块自动执行,我们找寻下这个com.mysql.jdbc.Driver来找寻下这:确实有静态代码块。
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can\'t register driver!");
}
}
mysql5之后的驱动jar包可以不写
功能2:获取数据库连接 方法如下:
static Connection getConnection(String url, String user, String password) 试图建立到给定数据库 URL 的连接。
*url 指定连接的数据库路径 语法 jdbc:mysql://ip地址 ,举例如下:
jdbc:mysql://localhost:3306/db3
* user 用户名
*password:密码
2.2 Connection 数据库连接对象
功能:
1)获取执行sql的对象
方法1:Statement createStatement() 创建一个 Statement 对象来将 SQL 语句发送到数据库。
方法2: PreparedStatement prepareStatement(String sql) 创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
2)管理事务功能,针对开启事务、提交事务和回滚也封装了三个方法
开启事务 void setAutoCommit(boolean autoCommit)
含义:将此连接的自动提交模式设置为给定状态。调用该房屋设置参数为false,即开启事务
提交事务 void commit()
含义:使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当
前持有的所有数据库锁。
回滚事务 void rollback()
含义:取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据
库锁。
2.3 Statement 执行sql的对象 statement在beans和sql两个包下都有, 本次看sql
功能:Statement用于执行静态 SQL 语句并返回它所生成结果的对象。而PreparedStatement执行的是动态预编译sql语句,静态sql含义就是sql语句中的值是给定的就是静态sql。
1)执行sql boolean execute(String sql) 执行给定的 SQL 语句,该语句可能返回多个结果。
返回: 如果第一个结果为 ResultSet 对象,则返回 true;如果其为更新计数或者不存在任何结果,则返回 false
2)执行sql int executeUpdate(String sql) 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。
DML insert update delete
DDL create alter drop
3)ResultSet executeQuery(String sql) 执行给定的 SQL(select) 语句,该语句返回单个 ResultSet 对象。
* int 返回值是影响的行数
练习1 向db2中account表插入一个数据 insert into account values (null,\'王五\',3000)
1 package cn.itcast.demo01.demo01.demo05; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.SQLException; 6 import java.sql.Statement; 7 8 public class JdbcDemo02 { 9 public static void main(String[] args) { 10 Statement stmt = null; 11 Connection conn = null; 12 try { 13 //注册驱动,我们这次抓取异常 14 Class.forName("com.mysql.jdbc.Driver"); 15 //定义sql 16 String sql = "insert into account values (null,\'王五\',3000)"; 17 //获取Connection对象 18 conn = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root"); 19 //获取执行sql的对象Statement 20 stmt = conn.createStatement(); 21 //执行sql 22 int count = stmt.executeUpdate(sql); 23 System.out.println(count); 24 if(count > 0 ){ 25 System.out.println("添加成功"); 26 }else{ 27 System.out.println("添加失败"); 28 } 29 } catch (ClassNotFoundException e) { 30 e.printStackTrace(); 31 } catch (SQLException e) { 32 e.printStackTrace(); 33 }finally{ 34 if (stmt != null){//避免空指针异常 35 try { 36 stmt.close();//stemt原来作用域在try中,因此需要提前定义 37 } catch (SQLException e) { 38 e.printStackTrace(); 39 } 40 } 41 if (conn != null){//避免空指针异常 42 try { 43 conn.close();//stemt原来作用域在try中,因此需要提前定义 44 } catch (SQLException e) { 45 e.printStackTrace(); 46 } 47 } 48 } 49 } 50 } 51
练习2,我们修改db2中的account表的数据金额 update account set balance = 1500 where id = 3
1 public class JdbcDemo02 { 2 public static void main(String[] args) { 3 Statement stmt = null; 4 Connection conn = null; 5 try { 6 //注册驱动,我们这次抓取异常 7 Class.forName("com.mysql.jdbc.Driver"); 8 //定义sql 9 String sql = "update account set balance = 1500 where id = 3"; 10 //获取Connection对象 11 conn = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root"); 12 //获取执行sql的对象Statement 13 stmt = conn.createStatement(); 14 //执行sql 15 int count = stmt.executeUpdate(sql); 16 System.out.println(count); 17 if(count > 0 ){ 18 System.out.println("添加成功"); 19 }else{ 20 System.out.println("添加失败"); 21 } 22 } catch (ClassNotFoundException e) { 23 e.printStackTrace(); 24 } catch (SQLException e) { 25 e.printStackTrace(); 26 }finally{ 27 if (stmt != null){//避免空指针异常 28 try { 29 stmt.close();//stemt原来作用域在try中,因此需要提前定义 30 } catch (SQLException e) { 31 e.printStackTrace(); 32 } 33 } 34 if (conn != null){//避免空指针异常 35 try { 36 conn.close();//stemt原来作用域在try中,因此需要提前定义 37 } catch (SQLException e) { 38 e.printStackTrace(); 39 } 40 } 41 } 42 } 43 }
练习3:删除表中一个记录 delete from account where id = 3
1 public class JdbcDemo02 { 2 public static void main(String[] args) { 3 Statement stmt = null; 4 Connection conn = null; 5 try { 6 //注册驱动,我们这次抓取异常 7 Class.forName("com.mysql.jdbc.Driver"); 8 //定义sql 9 String sql = "delete from account where id = 3"; 10 //获取Connection对象 11 conn = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root"); 12 //获取执行sql的对象Statement 13 stmt = conn.createStatement(); 14 //执行sql 15 int count = stmt.executeUpdate(sql); 16 System.out.println(count); 17 if(count > 0 ){ 18 System.out.println("添加成功"); 19 }else{ 20 System.out.println("添加失败"); 21 } 22 } catch (ClassNotFoundException e) { 23 e.printStackTrace(); 24 } catch (SQLException e) { 25 e.printStackTrace(); 26 }finally{ 27 if (stmt != null){//避免空指针异常 28 try { 29 stmt.close();//stemt原来作用域在try中,因此需要提前定义 30 } catch (SQLException e) { 31 e.printStackTrace(); 32 } 33 } 34 if (conn != null){//避免空指针异常 35 try { 36 conn.close();//stemt原来作用域在try中,因此需要提前定义 37 } catch (SQLException e) { 38 e.printStackTrace(); 39 } 40 } 41 } 42 } 43 } 44
练习4 创建一个表,DDL无返回值,因此if语句可以删除
1 public class JdbcDemo02 { 2 public static void main(String[] args) { 3 Statement stmt = null; 4 Connection conn = null; 5 try { 6 //注册驱动,我们这次抓取异常 7 Class.forName("com.mysql.jdbc.Driver"); 8 //定义sql 9 String sql = "create table student(id int, name varchar(20))"; 10 //获取Connection对象 11 conn = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root"); 12 //获取执行sql的对象Statement 13 stmt = conn.createStatement(); 14 //执行sql 15 int count = stmt.executeUpdate(sql); 16 System.out.println(count); 17 18 } catch (ClassNotFoundException e) { 19 e.printStackTrace(); 20 } catch (SQLException e) { 21 e.printStackTrace(); 22 }finally{ 23 if (stmt != null){//避免空指针异常 24 try { 25 stmt.close();//stemt原来作用域在try中,因此需要提前定义 26 } catch (SQLException e) { 27 e.printStackTrace(); 28 } 29 } 30 if (conn != null){//避免空指针异常 31 try { 32 conn.close();//stemt原来作用域在try中,因此需要提前定义 33 } catch (SQLException e) { 34 e.printStackTrace(); 35 } 36 } 37 } 38 } 39 }
2.4 ResultSet 结果集对象,就是来封装查询结果的,例如ResultSet executeQuery(String sql) 执行给定的 SQL(select) 语句,该语句返回单个 ResultSet 对象。
ResultSet接口,返回值是结果集,常见的方法如下:
- boolean next();方法 游标向下移动一行,默认指向表头;判断是否最后一行末尾,如果是返回false,如果返回ture说明不是最后一行,还有数据
- getXxx(参数);一次获取一行某一列的数据,XX代表数据类型,如int,double等
其中xxx代表数据类型,如int getInt();String类型 getString();
参数 int 代表列的编号,从第一列开始(没有0列),如getString(1);
string 代表列的名称 ,如 getDouble(“balance”)
使用步骤:
1)游标向下移动一行
2)判断释放有数据
3)获取数据
1 public class JdbcDemo02 { 2 public static void main(String[] args) { 3 Statement stmt = null; 4 Connection conn = null; 5 ResultSet rd = null;//这个结果集也是一个资源,也需要是否 6 try { 7 //1.注册驱动,我们这次抓取异常 8 Class.forName("com.mysql.jdbc.Driver"); 9 //2.定义sql 10 String sql = "select * from account"; 11 //3.获取Connection对象 12 conn = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root"); 13 //4.获取执行sql的对象Statement 14 stmt = conn.createStatement(); 15 //5.执行sql 16 rd = stmt.executeQuery(sql); 17 while (rd.next()){ 18 int anInt = rd.getInt(1); 19 String name = rd.getString("name"); 20 double balance = rd.getDouble(3); 21 System.out.println(anInt + "----" + name + "-----" + balance ); 22 System.out.println(rd); 23 } 24 } catch (ClassNotFoundException e) { 25 e.printStackTrace(); 26 } catch (SQLException e) { 27 e.printStackTrace(); 28 }finally{ 29 if (stmt != null){//避免空指针异常 30 try { 31 stmt.close();//stemt原来作用域在try中,因此需要提前定义 32 } catch (SQLException e) { 33 e.printStackTrace(); 34 } 35 } 36 if (conn != null){//避免空指针异常 37 try { 38 conn.close();//stemt原来作用域在try中,因此需要提前定义 39 } catch (SQLException e) { 40 e.printStackTrace(); 41 } 42 } 43 } 44 } 45 } 46
练习:查询emp表的数据,将其封装为对象,而专门装载对象的用集合即可
我们可以定义一个方法,查询emp表的数据,将其封装为对象,然后装载集合,返回,分为三步
类名 Emp类
方法: public List<emp> findAll(){}
实现方法 select * from emp;
1 public static void main(String[] args) { 2 List<Emp> list = new Jdbcdemo08().findAll(); 3 for(Emp emp : list){ 4 System.out.println(emp); 5 }
1 package cn.itcast.demo01.demo01.demo05; 2 3 import java.sql.*; 4 import java.util.ArrayList; 5 import java.util.Collections; 6 import java.util.List; 7 8 public class Jdbcdemo08 { 9 public static void main(String[] args) { 10 List<Emp> list = new Jdbcdemo08().findAll(); 11 System.out.println(list); 12 } 13 /* 14 查询所有emp对象 15 */ 16 public List<Emp> findAll(){ 17 Connection conn = null; 18 Statement stme = null; 19 ResultSet rs = null; 20 List<Emp> list = null; 21 try { 22 // 1)注册驱动 23 Class.forName("com.mysql.jdbc.Driver"); 24 // 2)获取连接 25 conn = DriverManager.getConnection("jdbc:mysql:///db1", "root", "root"); 26 //3) 定义sql 27 String sql = "select * from emp"; 28 //4)获取执行sql的对象 29 stme = conn.createStatement(); 30 // 5)执行sql语句 31 rs = stme.executeQuery(sql); 32 // 7) 创建emp对象 33 Emp emp = null; 34 list = new ArrayList<Emp>(); 35 //6) 遍历结果集 36 while (rs.next()){ 37 int id = rs.getInt("id");//此处的名称与emp表要一样,与类可不一样。 38 String ename = rs.getString("ename"); 39 int job_id = rs.getInt("job_id"); 40 int mgr = rs.getInt("mgr"); 41 Date joindate = rs.getDate("joindate"); 42 double salary = rs.getDouble("salary"); 43 double bonus = rs.getDouble("bonus"); 44 int dept_id = rs.getInt("dept_id"); 45 46 //创建emp对象,并赋值 47 emp = new Emp(); 48 emp.setId(id); 49 emp.setEname(ename); 50 emp.setJob_id(job_id); 51 emp.setMgr(mgr); 52 emp.setJoindate(joindate); 53 emp.setSalary(salary); 54 emp.setBonus(bonus); 55 emp.setDept_id(dept_id); 56 57 // 装载集合 58 list.add(emp); 59 60 } 61 62 } catch (ClassNotFoundException e) { 63 e.printStackTrace(); 64 } catch (SQLException e) { 65 e.printStackTrace(); 66 }finally { 67 if (rs != null){ 68 try { 69 rs.close(); 70 } catch (SQLException e) { 71 e.printStackTrace(); 72 } 73 } 74 if (conn != null){ 75 try { 76 conn.close(); 77 } catch (SQLException e) { 78 e.printStackTrace(); 79 } 80 } 81 if (stme != null){ 82 try { 83 stme.close(); 84 } catch (SQLException e) { 85 e.printStackTrace(); 86 } 87 } 88 } 89 return list;//这个集合需要前置定义 90 } 91 } 92
1 package cn.itcast.demo01.demo01.demo05; 2 3 import java.util.Date; 4 5 /* 6 封装emp数据的javaBean 7 */ 8 public class Emp { 9 private int id;//参考数据表中的各个字段,补充进来 这里面的名字尽量一样 10 private String ename; 11 private int job_id; 12 private int mgr; 13 private Date joindate; 14 private double salary; 15 private double bonus; 16 private int dept_id; 17 18 @Override 19 public String toString() {//方便打印看效果 20 return "Emp{" + 21 "id=" + id + 22 ", ename=\'" + ename + \'\\\'\' + 23 ", job_id=" + job_id + 24 ", mgr=" + mgr + 25 ", joindate=" + joindate + 26 ", salary=" + salary + 27 ", bonus=" + bonus + 28 ", dept_id=" + dept_id + 29 \'}\'; 30 } 31 32 public int getId() { 33 return id; 34 } 35 36 public void setId(int id) { 37 this.id = id; 38 } 39 40 public String getEname() { 41 return ename; 42 } 43 44 public void setEname(String ename) { 45 this.ename = ename; 46 } 47 48 public int getJob_id() { 49 return job_id; 50 } 51 52 public void setJob_id(int job_id) { 53 this.job_id = job_id; 54 } 55 56 public int getMgr() { 57 return mgr; 58 } 59 60 public void setMgr(int mgr) { 61 this.mgr = mgr; 62 } 63 64 public Date getJoindate() { 65 return joindate; 66 } 67 68 public void setJoindate(Date joindate) { 69 this.joindate = joindate; 70 } 71 72 public double getSalary() { 73 return salary; 74 } 75 76以上是关于JAVA11-JDBC学习的主要内容,如果未能解决你的问题,请参考以下文章
[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段