标签:oid 端口 字符串 throws manager gis 目的 发送 撤销
1.JDBC概念
全称:java database connectivity ,JDBC 规范定义接口,具体的实现由各大数据库厂商来实现。 JDBC 是 Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个 数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即 可,数据库驱动由数据库厂商提供。 ?
使用 JDBC 的好处:
1) 程序员如果要开发访问数据库的程序,只需要会调用 JDBC 接口中的方法即可,不用关注类是如何实现的。
2) 使用同一套 Java 代码,进行少量的修改就可以访问其他 JDBC 支持的数据库
(1)使用JDBC开发使用到的包
包 名 说明
java.sql 所有与 JDBC 访问数据库相关的接口和类
javax.sql 数据库扩展包,提供数据库额外的功能。如:连接池 数据库的驱动 由各大数据
库厂商提供,需要额外去下载,是对JDBC接口实现的类
(2)jdbc的常规流程8步:
首先:复制 mysql-connector-java-5.1.37-bin.jar至文件夹libs中;
其次:右击 libs 选择 Add as library;这样项目的代码里引入这个jar
里的内容
(1)告诉程序用哪个驱动
Class.forName("com.mysql.jdbc.Driver"); // 这样写比较简单
在 java.sql.DriverManager;中,源码如下:
public class Driver implements java.sql.Driver {
public Driver() throws SQLException { }
static {
try { DriverManager.registerDriver(new Driver()); //注册数据库驱动
} catch (SQLException var1) {
throw new RuntimeException("Can‘t register driver!");
} } }
:从 JDBC3 开始,目前已经普遍使用的版本。可以不用注册驱动而直接使用。Class.forName 这句话可以省略。
com.mysql.jdbc.Driver 源代码: // Driver 接口,所有数据库厂商必须实现的接口,表示这是一个驱动类。
(2)获取数据库的连接:在该类中,有个方法:
DriverManager 类中的静态方 描述
Connection getConnection (String url, String user, String password)
通过连接字符串,用户名,密码来得到数据库的连接对象
Connection getConnection (String url, Properties info) 通过连接字符串,属性对象来得到连接对象
其中 url 连接路径:jdbc:mysql://ip地址(域名):端口号/数据库名称
jdbc:mysql://localhost:3306/db1(如果是本机,黄色可省略)
(1)获取可执行的sql对象
Connection 接口中的方法 描述
Statement createStatement() 创建一条 SQL 语句对象
preparedstatement(String sql)创建一个preparedstatement对象,将参数化的sql语句发送到数据库
(2)管理事务
将此连接的自动提交模式设置为给定状态,false 即开启事务
Statement对象,是sql包下的用于执行静态sql语句(也就是给定值)并返回其生成的结果的对象。执行的方法常见的有:
boolean execute(String sql)执行给定的SQL语句,这可能会返回多个结果,如果是
true返回一个ResultSet对象,false是更新计数或没有结果。
int executeUpdate(String sql):执行DML(insert update delete),
DDL(Create,alter,drop)。
执行给定的sql语句,这可能是insert ,update或delete语句,或者不返回任何内容,如sql ddl语句。返回的是影响执行的行数。
ResultSet excutequery(String sql):执行DQL(select)语句
1 package cn.itcast.demo01.demo01.demo03; 2 3 import java.sql.Connection; 4 import java.sql.Driver; 5 import java.sql.DriverManager; 6 import java.sql.Statement; 7 8 public class JdbcDemo01 { 9 public static void main(String[] args) throws Exception { 10 //导入驱动jar包 11 //注册驱动 12 Class.forName("com.mysql.jdbc.Driver"); 13 //获取数据库连接对象 connection 14 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root"); 15 // 定义sql语句 16 String sql = "update emp set salary = 7500 where id = 1001;"; 17 // 获取执行sql的对象,statement 18 Statement stmt = conn.createStatement(); 19 //执行sql 20 int count = stmt.executeUpdate(sql);// 返回的是影响的行数 21 // 处理结果 22 System.out.println(count); 23 //释放资源 24 stmt.close(); 25 conn.close(); 26 } 27 }
2.JDBC的各个类
1 package cn.itcast.demo01.demo01.demo03; 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 Class.forName("com.mysql.jdbc.Driver"); 14 //定义sql 15 String sql = "insert into account values (null,‘王五‘,3500)"; 16 // 获取Connection对象 17 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root"); 18 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 27 }else{ 28 System.out.println("执行失败"); 29 } 30 } catch (ClassNotFoundException | SQLException e) { 31 e.printStackTrace(); 32 } finally { 33 if(stmt != null){ 34 try { 35 stmt.close(); 36 } catch (SQLException e) { 37 e.printStackTrace(); 38 } 39 } 40 if(conn != null){ 41 try { 42 stmt.close(); 43 } catch (SQLException e) { 44 e.printStackTrace(); 45 } 46 } 47 } 48 } 49 } 50
ResultSet接口,返回值是结果集,常见的方法如下:
其中xxx代表数据类型,如int getInt();String类型 getString();
参数 int 代表列的变化,从1开始,如getString(1);
string 代表列的名称 ,如 getDouble(“balance”)
1 package cn.itcast.demo01.demo01.demo03; 2 3 import java.sql.*; 4 5 public class JdbcDemo02 { 6 public static void main(String[] args) { 7 Statement stmt = null; 8 Connection conn = null; 9 ResultSet rs = null; 10 try {// 注册驱动 11 Class.forName("com.mysql.jdbc.Driver"); 12 //定义sql 13 String sql = "select * from account"; 14 // 获取Connection对象 15 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root"); 16 17 // 获取执行sql的对象 Statement 18 stmt = conn.createStatement(); 19 // 执行sql 20 rs = stmt.executeQuery(sql);// 获取结果集 21 rs.next(); 22 int id = rs.getInt(1); 23 String name = rs.getString("name"); 24 double balance = rs.getDouble(3); 25 System.out.println(name+balance); 26 27 28 } catch (ClassNotFoundException | SQLException e) { 29 e.printStackTrace(); 30 } finally { 31 if(rs != null){ 32 try { 33 stmt.close(); 34 } catch (SQLException e) { 35 e.printStackTrace(); 36 } 37 } 38 if(stmt != null){ 39 try { 40 stmt.close(); 41 } catch (SQLException e) { 42 e.printStackTrace(); 43 } 44 } 45 if(conn != null){ 46 try { 47 stmt.close(); 48 } catch (SQLException e) { 49 e.printStackTrace(); 50 } 51 } 52 } 53 } 54 } 55
使用ResultSet正确用法: 游标向下移动一行,判断有无数据,再行获取数据,可使用boolean next();方法含义:判断当前行是否是最后一行结尾,如果是,则返回false,如果不是则返回true;或者使用while(rs.next()){}
练习:查询emp表的数据,将其封装为对象。然后装载集合,返回emp表包含对象。类似于将某一行作为一个对象,因为每一行都有变量名和类型。用集合将对象装载。
1 package cn.itcast.demo01.demo01.demo03; 2 3 import cn.itcast.demo01.demo01.demo04; 4 5 import java.sql.*; 6 import java.util.ArrayList; 7 import java.util.List; 8 9 public class JdbcDemo04 { 10 /* 11 查询所有emp对校 12 */ 13 public static void main(String[] args) { 14 List<demo04> list = new JdbcDemo04().findAll(); 15 System.out.println(list); 16 } 17 public List<demo04> findAll(){ 18 ResultSet rs = null; 19 Statement stmt = null; 20 Connection conn = null; 21 List<demo04> list = null; 22 try { 23 Class.forName("com.mysql.jdbc.Driver"); 24 // 获取连接 25 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root"); 26 // 定义sql 27 String sql = "select * from emp"; 28 // 获取执行sql 的对校 29 stmt = conn.createStatement(); 30 // 执行sql 31 rs = stmt.executeQuery(sql); 32 demo04 emp = null;// 先创建一个对象 33 list = new ArrayList<demo04>(); 34 while ( rs.next()){ 35 int id = rs.getInt("id"); 36 String ename = rs.getString("ename"); 37 int job_id = rs.getInt("job_id"); 38 int mgr = rs.getInt("mgr"); 39 Date joindate = rs.getDate("joindate"); 40 double salary = rs.getDouble("salary"); 41 double bonus = rs.getDouble("bonus"); 42 int dept_id = rs.getInt("dept_id"); 43 emp = new demo04();// 创建emp对象,并赋值 44 emp.setId(id); 45 emp.setEname(ename); 46 emp.setJob_id(job_id); 47 emp.setMgr(mgr); 48 emp.setJoindate(joindate); 49 emp.setSalary(salary); 50 emp.setBonus(bonus); 51 emp.setDept_id(dept_id); 52 list.add(emp); 53 } 54 } catch (ClassNotFoundException e) { 55 e.printStackTrace(); 56 } catch (SQLException e) { 57 e.printStackTrace(); 58 }finally { 59 if (rs != null){ 60 try { 61 rs.close(); 62 } catch (SQLException e) { 63 e.printStackTrace(); 64 } 65 } 66 if (stmt != null){ 67 try { 68 rs.close(); 69 } catch (SQLException e) { 70 e.printStackTrace(); 71 } 72 } 73 if (conn != null){ 74 try { 75 rs.close(); 76 } catch (SQLException e) { 77 e.printStackTrace(); 78 } 79 } 80 81 } 82 return list; 83 84 85 } 86 } 87
上图中,注册驱动和释放资源代码重复性较高,因此有必要抽取JDBC工具类
即可:JDBCUtils
标签:oid 端口 字符串 throws manager gis 目的 发送 撤销
原文地址:https://www.cnblogs.com/rango0550/p/12731363.html