标签:host .sql close eclips 静态 api tde extends exce
一.JDBC
1.概述
Java DataBase Connectivity--JAVA数据连接库,是一种用于执行SQL语句的JAVA API,
可以为多种关系数据库提供统一访问,由一组用JAVA语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使用数据库开发人员能够编写数据库应用程序.
2.JDBC原理
JDBC可以让程序员使用固定的流程和方法,操作不同的数据库;
核心类和接口:
Driver接口--用于识别数据库;
Connection接口--用于连接数据库的会话;
Statement接口--sql执行者;
ResultSet接口--sql执行的结果集;
DriverManager类,用于操作JDBC的工具类,通过这个类的方法,可以注册驱动和获取连接.
Driver 接口(java.sql)
定义:public interface Driver
常用方法:
Connection connect(String url,Properties info)throws SQLException{}:通过指定url与数据库建立连接;
Connection 接口(java.sql)
定义:public interface Connection extends Wrapper, AutoCloseable
常用方法:
void close() throws SQLException{}:关闭资源
Statement createStatement() throws SQLException{}:创建一个 Statement 对象来将 SQL 语句发送到数据库
PreparedStatement prepareStatement(String sql) throws SQLException{}:返回一个PerparedStatement对象;
StateMent 接口(java.sql)
定义:public interface Statement extends Wrapper, AutoCloseable
常用方法:
boolean execute(String sql) throws SQLException{}:执行Sql;
ResultSet executeQuery(String sql) throws SQLException{}:返回查询的结果集;
int executeUpdate(String sql) throws SQLException{}:执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。
ResultSet 接口(java.sql)
定义:public interface ResultSet extends Wrapper, AutoCloseable
常用方法:
void close() throws SQLException{}:关闭资源;
boolean next() throws SQLException{}:将光标从当前位置向前(下)移一行。
Object getObject(String columnLabel) throws SQLException{}:以 Java 编程语言中 Object 的形式获取此 ResultSet 对象的当前行中指定列的值。
Object getObject(int columnIndex) throws SQLException{}:以 Java 编程语言中 Object 的形式获取此 ResultSet 对象的当前行中指定列的值。
DriverManager 类(java.sql)
定义:public class DriverManager extends Object
常用方法:
public static void registerDriver(Driver driver) throws SQLException{}:向 DriverManager 注册给定驱动程序。JAVA1.6之后可自动注册,不必写;
public static Connection getConnection(String url,String user,String password) throws SQLException{}:试图建立到给定数据库 URL 的连接。
3.使用步骤:
1)注册驱动;让java代码识别数据库,Driver接口的实现者由数据库生产厂商提供,mysql数据库的驱动类在mysql官网可以直接下载,驱动类导入工程--DriverManager类的registerDriver()方法;
2)获取连接,创建会话对象:DriverManager 类的getConnection(url,use,password)方法;
3)获取sql执行者:Connection 接口的 createStatement()方法;
4)编写sql并执行:Statement 接口的 executeUpdate()或 executeQuery()方法;
5)处理结果集(主要是查询结果);
6)释放资源,RESULTSET/STATEMENT/CONNECTION/ 按此顺序关闭资源,全为close()方法;
4.PreparedStatement 接口(java.sql) Statement子类
注意:该接口的一个实例化对象只能执行一次sql语句!!
定义:public interface PreparedStatement extends Statement
常用方法:
boolean execute() throws SQLException{}:执行Sql后返回一个boolean值,一般不用;
ResultSet executeQuery() throws SQLException{}:返回查询的结果集;
int executeUpdate() throws SQLException{}:在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如 INSERT、UPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。
void setObject(int parameterIndex,Object x) throws SQLException{}:使用给定对象设置指定参数的值。parameterIndex:表示sql语句中的第几个占位符,从1开始;X:表示要赋的值;
5.代码演示:以下代码在Eclipse中实现,需导入jar包
代码1:
1 /* 2 使用JDBC查询数据库中的数据 3 1:注册驱动 4 2:创建会话对象(道路) 5 3:获取sql执行者 6 4:编写sql并执行 7 5:处理结果集 8 6:释放资源(结果集,sql执行,会话对象) 9 */ 10 import java.sql.Connection; 11 import java.sql.DriverManager; 12 import java.sql.ResultSet; 13 import java.sql.Statement; 14 15 public class Demo02 { 16 public static void main(String[] args) throws Exception { 17 // 使用反射加载类注册驱动--固定路径,需牢记"com.mysql.jdbc.Driver" 18 Class.forName("com.mysql.jdbc.Driver"); 19 // 创建会话对象--本地mysql固定路径,需牢记"jdbc:mysql:///mydb?useSSL=false" 20 Connection c = DriverManager.getConnection("jdbc:mysql:///mydb?useSSL=false", "root", "root");//注意SSL警告,若不想显示,添加"?useSSL=false" 21 // 创建执行者 22 Statement st = c.createStatement(); 23 // 编写sql语句并执行 24 String sql = "SELECT * FROM category"; 25 ResultSet set = st.executeQuery(sql); 26 // 处理结果集 27 while (set.next()) { 28 Object cid = set.getObject("cid"); 29 Object cname = set.getObject("cname"); 30 System.out.println(cid + "----" + cname); 31 } 32 // 关闭资源--顺序:ResultSet/Statement/Connection 33 set.close(); 34 st.close(); 35 c.close(); 36 } 37 }
代码2:自定义JDBC工具类--思考面向对象封装的思想
1 import java.sql.Connection; 2 import java.sql.DriverManager; 3 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 import java.sql.Statement; 6 /* 7 * 使用JDBC时,注册,获取连接,关闭资源三个操作为固定模式,可封装成类 8 * */ 9 public class MyJDBCUtils { 10 // 定义成员变量--由于Mysql Driver类 路径-数据库URL-用户名-密码一般固定,因此可设为成员变量,并加final修饰 11 private static final String path = "com.mysql.jdbc.Driver"; 12 private static final String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false"; 13 private static final String user = "root"; 14 private static final String password = "root"; 15 // 注册方法,由于只注册一次,因此使用静态代码块 16 static { 17 try { 18 Class.forName(path); 19 } catch (ClassNotFoundException e) { 20 e.printStackTrace(); 21 throw new RuntimeException("记得要先导包~"); 22 } 23 } 24 // 获取连接,返回Connection类的实例对象 25 public static Connection getConnection() { 26 try { 27 Connection c = DriverManager.getConnection(url, user, password); 28 return c; 29 } catch (SQLException e) { 30 e.printStackTrace(); 31 throw new RuntimeException("路径对吗?数据库创建了吗?密码对吗?"); 32 } 33 } 34 // 关闭资源--顺序Result/statement/connection 35 public static void close(ResultSet r, Statement st, Connection c) { 36 if (c != null) { 37 try { 38 c.close(); 39 } catch (SQLException e) { 40 e.printStackTrace(); 41 throw new RuntimeException("连接关闭异常!"); 42 } 43 } 44 45 if (st != null) { 46 try { 47 st.close(); 48 } catch (SQLException e) { 49 e.printStackTrace(); 50 throw new RuntimeException("执行关闭异常!"); 51 } 52 } 53 54 if (r != null) { 55 try { 56 r.close(); 57 } catch (SQLException e) { 58 e.printStackTrace(); 59 throw new RuntimeException("结果集关闭异常!"); 60 } 61 } 62 } 63 }
代码3:利用自定义工具类完成CRUD
1 import huguangqin.com.cnblogs.MyJDBCUtils.MyJDBCUtils; 2 import java.sql.Connection; 3 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 import java.sql.Statement; 6 /* 7 * 利用工具类完成CRUD 8 * */ 9 public class Demo01 { 10 public static void main(String[] args) throws SQLException { 11 // 注册驱动-工具类,并获取连接-工具类-(无需注册,由于类里设置了静态代码块,获取连接调用该类会自动注册) 12 Connection c = MyJDBCUtils.getConnection(); 13 14 // 获取执行者Statement 15 Statement st = c.createStatement(); 16 17 // 编写sql,并执行 18 // 插入数据 19 String insertSQL = "INSERT INTO category(cid,cname) VALUES(7,‘花卷‘),(8,‘包子‘)"; 20 // 执行插入 21 int i = st.executeUpdate(insertSQL); 22 // 查询数据 23 String querySQL = "SELECT * FROM category"; 24 // 执行查询 25 ResultSet set = st.executeQuery(querySQL); 26 // 处理结果集-ResultSet 27 while (set.next()) { 28 Object cid = set.getObject("cid"); 29 Object cname = set.getObject("cname"); 30 System.out.println(cid + "===" + cname); 31 } 32 // 关闭资源-工具类 33 MyJDBCUtils.close(set, st, c); 34 } 35 }
代码4://面向Connection 获取PreparedStatement对象,预处理sql对象的每条语句,防止SQL注入攻击
1 import huguangqin.com.cnblogs.MyJDBCUtils.MyJDBCUtils; 2 import java.sql.Connection; 3 import java.sql.PreparedStatement; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 7 public class PreparedStatementDemo { 8 public static void main(String[] args) throws SQLException { 9 // 利用自定义工具类获取连接,同时完成注册驱动 10 Connection c = MyJDBCUtils.getConnection(); 11 // 使用PreparedStatement向表中插入三行数据 12 String insertSQL = "INSERT INTO user(name,password) VALUES(?,?)"; 13 // 面向Connection 获取PreparedStatement对象 14 PreparedStatement pst = c.prepareStatement(insertSQL); 15 // 设置实际参数 16 pst.setObject(1, "a"); 17 pst.setObject(2, "a"); 18 // 执行(PreparedStatement的一个实例化对象只能执行一次sql) 19 int i = pst.executeUpdate(); 20 21 // 查询 22 String querySQL = "SELECT * FROM USER WHERE name = ?"; 23 // 面向Connection获取PreparedStatement对象 24 PreparedStatement pst1 = c.prepareStatement(querySQL); 25 pst1.setObject(1, "a"); 26 ResultSet set = pst1.executeQuery(); 27 // 处理结果集 28 while (set.next()) { 29 Object name = set.getObject("name"); 30 Object password = set.getObject("password"); 31 System.out.println(name + "====" + password); 32 } 33 } 34 } 35
标签:host .sql close eclips 静态 api tde extends exce
原文地址:http://www.cnblogs.com/huguangqin/p/7134422.html