一、数据的持久化
持久化(persistence): 把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,数据持久化意味着将内存中的数据保存到硬盘上加以固化,而持久化的实现过程大多通过各种关系数据库来完成。
持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。
二、JDBC简介
1.JDBC概述
JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口。定义了用来访问数据库的标准Java类库,使用这个类库可以以一种标准的方法,方便地访问数据库资源。
JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。
2.JDBC体系结构
JDBC接口(API)包括两个层次:
面向应用的API: Java API,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)。
面向数据库的API: Java Driver API,供开发商开发数据库驱动程序用。
三、JDBC的操作
1.JDBC的连接
(1)注册驱动(只做一次)。
(2)建立连接(Connection)。
(3)创建执行SQL的语句(Statement)。
(4)执行语句。
(5)处理执行结果(ResultSet)。
(6)释放资源。
public static void test() throws SQLException{ //1.注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); String url = "jdbc:mysql://localhost:3306/jdbc"; String user = "root"; String password = "123456"; //2.建立连接 Connection con = DriverManager.getConnection(url,user,password); //3.创建语句 Statement st = con.createStatement(); //4.执行语句 ResultSet rs = st.executeQuery("select * from user"); //5.处理结果 while(rs.next()){ System.out.println(rs.getObject(1) + "\t" + rs.getObject(2) + "\t" + rs.getObject(3) + "\t" + rs.getObject(4)); } //6.释放资源 rs.close(); st.close(); con.close(); }
结果:
1 张三 2016-04-18 100.0
2 李四 2016-04-17 200.0
3 王朝 2016-04-16 150.0
4 马汉 2016-04-14 300.0
5 张龙 2016-04-01 400.0
6 赵虎 2016-04-12 250.0
(1)注册驱动
Class.forName("com.mysql.jdbc.Driver");
推荐这种方式,不会对具体的驱动类产生依赖。
DriverManager.registerDriver(com.mysql.jdbc.Driver);
会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。
System.setProperty("jdbc.drivers", "driver1:driver2");
虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用。
(2)建立连接
Connection con = DriverManager.getConnection(url, user, password);
url格式: jdbc:子协议:子名称//主机名:端口/数据库名?属性名=属性值&… User,password可以用“属性名=属性值”方式告诉数据库;其他参数如: useUnicode=true&characterEncoding=GBK。
对于Oracle 数据库连接: jdbc:oracle:thin:@localhost:1521:sid
对于SQLServer 数据库连接: jdbc:microsoft:sqlserver//localhost:1433; DatabaseName=sid
对于MySQL 数据库连接: jdbc:mysql://localhost:3306/sid
(3)创建语句
通过调用 Connection 对象的 createStatement 方法创建该对象。
该对象用于执行静态的 SQL 语句,并且返回执行结果。
(4)执行语句
通过调用 Statement 对象的 excuteQuery() 方法创建该对象。
ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商实现
ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象的 next() 方法移动到下一行。
(5)释放资源
释放ResultSet, Statement,Connection。
数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。
(6)优化代码
JdbcUtils.java
public final class JdbcUtils{ private static String url = "jdbc:mysql://localhost:3306/jdbc"; private static String user = "root"; private static String password = "123456"; private JdbcUtils(){ } static{ try{ //注册驱动 Class.forName("com.mysql.jdbc.Driver"); }catch(ClassNotFoundException e){ throw new ExceptionInInitializerError(e); } } /** * 获取连接 * @return * @throws SQLException */ public static Connection getConnection() throws SQLException{ return DriverManager.getConnection(url,user,password); } /** * 释放资源 * @param con * @param st * @param rs */ public static void releaseResource(Connection con,Statement st,ResultSet rs){ try{ if(rs != null){ rs.close(); } }catch(SQLException e){ e.printStackTrace(); }finally{ try{ if(st != null){ try{ st.close(); }catch(SQLException e){ e.printStackTrace(); } } }finally{ if(con != null){ try{ con.close(); }catch(SQLException e){ e.printStackTrace(); } } } } } }
Base.java
public class Base{ public static void main(String[] args) throws Exception{ init(); } public static void init() throws Exception{ Connection con = null; Statement st = null; ResultSet rs = null; try{ //建立连接 con = JdbcUtils.getConnection(); //创建语句 st = con.createStatement(); //执行语句 rs = st.executeQuery("select * from user"); //处理结果 while(rs.next()){ System.out.println(rs.getObject(1) + "\t" + rs.getObject(2) + "\t" + rs.getObject(3) + "\t" + rs.getObject(4)); } } finally{ JdbcUtils.releaseResource(con,st,rs); } } }