JDBC
- 概念
- 一套统一的Java语言规范,用于连接数据库
开发步骤
- 导入jar包
加载驱动
Class.forName("com.mysql.jdbc.Driver") //推荐 //另一种加载驱动的方式 DriverManager.registerDriver(new Driver); //不推荐,会造成重复注册
获取连接
Connection getConnection(url,username,password); /*调用DriverManager的getConnection静态方法 url为String类型,表示数据库的地址,一般为"jdbc:mysql://localhost:port/DataBaseName",可简写为"jdbc:mysql:///DataBaseName" username为String类型,表示登录数据库的用户名 password为String类型,表示登录数据库的密码 */
获取执行SQL的对象并执行SQL语句
//调用Connection对象的createStatement方法获取执行SQL的对象 Statement connection.createStatement(); //再调用Statement对象的executeQuery方法执行SQL并获取查询结果 ResultSet statement.executeQuery(String sql);
- 处理查询结果
while(rs.next()){ rs.getXXX(列名); //XXX为对应的列的数据类型 } //rs为上一步获取的ResultSet对象,其中包含了执行SQL语句后的查询结果
释放资源
//标准的执行过程 try{ //加载驱动 Class.forName(com.mysql.jdbc.Driver); }catch(Exception e){ e.printStackTrace(); } //初始化变量 Connection conn = null; Statement stmt = null; ResultSet rs = null; try{ //获取Connection对象创建数据库连接 conn = DriverManager.getConnection("DataBasePath","username","password"); //获取查询对象 stmt = conn.createStatement(); //创建SQL语句 String sql = "SQL语句"; //进行查询并获取查询结果 rs = stmt.excuteQuery(sql); //遍历查询结果 while(rs.next()){ System.out.println(rs.getString("FieldName")); } }catch(Exception e){ e.printStackTrace(); }finally{ //释放资源 if(rs !=null){ rs.close(); rs = null; } if(stmt != null){ stmt.close(); stmt = null; } if(conn != null){ conn.close(); conn = null; } //后使用先释放 }
常用API
DriverManager
- 用途
- 注册启动,获取Connection对象
常用API
Connection getConnection(DataBasePath,username,password) //创建与数据库的连接
类的加载
- 本质:把本地磁盘的class文件以流的方式加载入内存中
- 连接过程:
- 校验
- 检查文件是否符合编译规范
- 准备
- 将类中所有的常量加载入常量池,此阶段可访问类中常量
- 解析
- 加载类中方法,静态代码块在此阶段执行
- 校验
例子
//先假设存在一个这样的类: public class StaticClass { public static final int a; static { a=10; System.out.println("静态代码块加载"); } } //测试类以及输出结果: public class Test1 { public static void main(String[] args) { Class class1 = StaticClass.class; //无输出 System.out.println("测试结束"); // ==>测试结束 } } public class Test2 { public static void main(String[] args) { int a = StaticClass.a; // ==>静态代码块加载 System.out.println("测试结束"); // ==>测试结束 } } public class Test3 { public static void main(String[] args) { Class.forName("StaticClass"); // ==>静态代码块加载 System.out.println("测试结束"); // ==>测试结束 } }
- 用途
Connection
- 用途
- 获取执行SQL语句的对象,进行事务管理
常用API
Statement createStatement() //创建一个Statement对象来将语句发送到数据库 CallableStatement prepareCall(sql) //创建一个CallableStatement对象来调用数据库存储过程 PreparedStatement prepareStatement(sql) //创建一个PreparedStatement对象来将参数化的SQL语句发送到数据库
事务的回滚方式
方式一
setAutoCommit(false); commit(); / rollback(); //将事务中所有的SQL操作回滚
方式二
setAutoCommit(false); SQL1; SavePoint sp = setSavepoint(); SQL2; SavePoint sp1 = setSavepoint(); SQL3; rollback(sp); //会将SQL1之后的SQL操作回滚(存档点)
- 用途
Statement
- 用途
- 用于执行静态的SQL语句并返回其所生成结果的对象
- 常用API
void addBatch(sql) //给定的SQL命令添加到此Statement对象的当前命令列表中 void clearBatch() //清空此Statement对象的当前SQL命令列表 int[] executeBatch() //将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组
- 用途
PreparedStatement
- 用途
- 预处理语句,用于防止SQL注入漏洞
获取该类对象的方法
PreparedStatement connection.prepareStatement(SQL语句); //SQL语句中所有的变量用?代替
常用API
void setXXX(index,value) //将SQL语句中index对应的?替换成value ResultSet executeQuery() //执行SQL语句的查询操作 executeUpdate() //执行SQL语句的增删改操作
- 用途
- ResultSet
- 用途
- 封装查询结果
- 常用API
next(); //将查询结果的指针向后移动一位。初始时指针的位置不在第一位,必须进行一次移动后才可以开始获取 getXXX(FieldName); //获取查询结果里指针对应的行中列名为FieldName的值,XXX为该值的数据类型 getObject(FieldName);
- 用途
JDBC工具类
- 具体功能
- 注册驱动
- 获得连接
- 释放资源