第14章 数据库
1 /***************** 2 ***第14章 数据库 3 *******知识点: 4 **************1.JDBC简介 5 **************2.JDBC驱动程序类型 6 **************3.JDBC常用接口和类简介 7 **************4.数据库操作 8 **************5.事务 9 **************6.连接池 10 */ 11 12 13 import java.sql.Connection; 14 15 import java.sql.DriverManager; 16 17 import java.sql.PreparedStatement; 18 19 import java.sql.ResultSet; 20 21 import java.sql.SQLException; 22 23 public class test14{ 24 public static void main(String[] args) throws Exception{ 25 demoJDBCDescription();//jdbc简介 26 demoJDBCDriver();//2.JDBC驱动程序类型 27 demoJDBCInterfaceAndClass();//3.JDBC常用接口和类简介 28 demoDataBaseOperator();//4.数据库操作 29 } 30 31 /* 32 *1.JDBC简介 33 */ 34 public static void demoJDBCDescription(){ 35 //JDBC是Java应用与数据库管理系统进行交互的标准API,包括两个包:核心API---java.sql和扩展的API---javax.sql。 36 //应用程序通过核心API的接口实现数据库连接和数据处理 37 } 38 39 /* 40 *2.JDBC驱动程序类型 41 */ 42 public static void demoJDBCDriver(){ 43 //1.JDBC-ODBC桥 44 //JDBC-ODBC桥是sun公司提供的,是jdk提供的的标准API. 这种类型的驱动实际是把所有JDBC的调用传递给ODBC , 45 //再由ODBC调用本地数据库驱动代码.由于JDBC-ODBC先调用 ODBC再由ODBC去调用本地数据库接口访问数据库. 46 //所以,执行效率比较低,对于那些大数据量 存取的应用是不适合的.而且,这种方法要求客户端必须安装ODBC 驱动, 47 //所以对于基于 internet ,intranet的应用也是不合适的 48 49 //2.本地API驱动 50 //本地API驱动是直接把JDBC调用转变为数据库的标准调用再去访问数据库。这种驱动比起JDBC-ODBC桥执行效率大大提高了. 51 //但是,它仍然需要在客户端加载数据库厂商 提供的代码库.这样就不适合基于internet的应用. 52 //并且,他的执行效率比起3,4型的JDBC驱动还是不够高 53 54 //3.网络协议驱动 55 //这种驱动实际上是根据我们熟悉的三层结构建立的. JDBC先把对数局库的访问请求传递给网 络上的中间件服务器. 56 //中间件服务器再把请求翻译为符合数据库规范的调用,再把这种调用 传给数据库服务器.如果中间件服务器也是用java开法的, 57 //那么在在中间层也可以使用1,2型 JDBC驱动程序作为访问数据库的方法. 58 //网络协议驱动---------中间件服务器------------数据库Server 59 //由于这种驱动是基于server的.所以,它不需要在客户端加载数据库厂商提供的代码库. 60 //而且 他在执行效率和可升级性方面是比较好的.因为大部分功能实现都在server端,所以这种驱动 可以设计的很小, 61 //可以非常快速的加载到内存中. 但是,这种驱动在中间件层仍然需要有配置 其它数据库驱动程序, 62 //并且由于多了一个中间层传递数据,它的执行效率还不是最好. 63 64 //4.本地协议驱动 65 //这种驱动直接把JDBC调用转换为符合相关数据库系统规范的请求.由于4型驱动写的应用可 以直接和数据库服务器通讯. 66 //这种类型的驱动完全由java实现,因此实现了平台独立性. 本地协议驱动---------数据库Server 67 //由于这种驱动不需要先把JDBC的调用传给ODBC或本地数据库接口或者是中间层服务器.所 以它的执行效率是非常高的 68 69 //所以在以后开发中推荐使用第四种 70 } 71 72 /* 73 *3.JDBC常用接口和类简介 74 */ 75 public static void demoJDBCInterfaceAndClass(){ 76 //1.Driver接口————驱动程序,连接应用程序和数据库,用于读取数据库驱动器的信息,提供连接方法,建立访问数据库所用的Connection对象。 77 // 在加载某一Driver类时,它应该创建自己的实例并向DriverManager注册该实例 78 79 //2.DriverManager类————驱动程序管理器,管理一组Driver对象,对程序中用到的驱动程序进行管理,包括加载驱动程序、获得连接对象、向数据库发送信息 80 81 //3.Connection接口————连接Java数据库和Java应用程序之间的主要对象并创建所有的Statement对象。 不管对数据库进行什么样的操作,都需要创建一个连接, 82 // 然后通过这个连接来完成操作 83 84 //4.Statement类——————语句对象,代表了一个特定的容器,对一个特定的数据库执行SQL语句 85 86 //5.ResultSet接口——————用于控制对一个特定语句的行数据的存取,也就是数据库中记录或行组成的集合 87 88 //6.PreparedStatement类——————表示预编译的SQL语句的对象。SQL语句被预编译并存储在PreparedStatement对象中。然后可以使用此对象多次高效地执行该语句 89 90 //7.ResultSetMetaData接口——————结果集元数据,resultSet.getDataMeta获得的比较重要的是表的列名、列的属性等信息 91 92 //8.DatabaseMetadata接口——————数据库源数据,使用connection.getMetaData()获得了关于数据库整体的元数据信息 93 94 //9.CallableStatement接口————用于执行 SQL 存储过程的接口 95 } 96 97 /* 98 *4.数据库操作 99 */ 100 public static void demoDataBaseOperator() throws Exception{ 101 //数据库操作步骤: 102 //1.注册驱动 103 //2.建立数据库连接 104 //3.创建数据库操作对象 105 //4.执行SQL 106 //5.处理结果集 107 //6.关闭JDBC对象 108 109 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//注册驱动 110 111 String url = "jdbc:sqlserver://localhost:1433;DatabaseName=myerp"; 112 String user = "sa"; 113 String password = "123456"; 114 Connection con = DriverManager.getConnection(url,user,password);//建立连接 115 116 System.out.println("演示Statement========="); 117 Statement stm = con.createStatement();//得到操作对象(不带参数) 118 String sql = "insert into t_Area(AreaID,ParentAreaID,AreaName) values(1,0,'华南区')";//sql语句 119 stm.execute(sql);//执行sql语句 120 121 ResultSet rs = stm.executeQuery("select * from t_Area");//得到执行sql语句返回的数据集 122 while (rs.next()) {//遍历数据集 123 System.out.println("区域ID:" + rs.getInt("AreaID") + ",父区域ID:" 124 + rs.getInt("ParentAreaID") + ",区域名:" 125 + rs.getString("AreaName")); 126 } 127 128 129 System.out.println("演示PreparedStatement========="); 130 sql = "select * from t_Area where ParentAreaID=? "; 131 132 PreparedStatement pstm = con.prepareStatement(sql);//得到操作对象(带参数) 133 pstm.setInt(1,0); 134 135 136 rs = pstm.executeQuery(); 137 while (rs.next()) { 138 System.out.println("区域ID:" + rs.getInt("AreaID") + ",父区域ID:" 139 + rs.getInt("ParentAreaID") + ",区域名:" 140 + rs.getString("AreaName")); 141 } 142 143 144 145 DatabaseMetaData meta = con.getMetaData();//得到数据库源数据对象 146 System.out.println("数据库版本:" + meta.getDatabaseProductVersion()); 147 System.out.println("数据库名:" + meta.getDatabaseProductName()); 148 System.out.println("数据库版本:" + meta.getDriverVersion()); 149 System.out.println("数据库驱动名:" + meta.getDriverName()); 150 151 152 ResultSetMetaData rsmeta = (ResultSetMetaData) rs.getMetaData();//得到结果集数据对象 153 154 System.out.println("字段个数:"+rsmeta.getColumnCount()); 155 156 for(int i = 1;i<=rsmeta.getColumnCount();i++){ 157 System.out.println("字段名字:"+rsmeta.getColumnName(i));//从1开始 注意 158 System.out.println("字段JDBC类型:"+rsmeta.getColumnType(i)); 159 System.out.println("字段数据库类型:"+rsmeta.getColumnTypeName(i)); 160 } 161 162 meta.close(); 163 rsmeta.close(); 164 rs.close(); 165 stm.clost(); 166 pstm.close(); 167 con.close(); //关闭连接 168 169 //依次将DatabaseMetaData、ResultSetMetaData、 170 // ResultSet、Statement、PreparedStatement、Connection对象关闭,释放所占用的资源 171 172 //执行存储过程就不演示了。具体找度娘 173 } 174 175 /* 176 *5.事务 177 */ 178 public static void demoTransation(){ 179 //事务:就是一组操作数据库的动作集合 180 //其中事务必须服从ACID原则 181 // 1.原子性(atomicity)————表示事务执行过程中的任何失败都将导致事务所做的任何修改失效 182 // 2.一致性(consistency)————当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态 183 // 3.隔离性 (isolation)————隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见 184 // 4.持久性(durability)————持久性表示当系统或介质发生故障时,确保已提交事务的更新不能丢失 185 186 //JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交。 187 //java.sql.Connection 提供了以下控制事务的方法: 188 // public void setAutoCommit(boolean) 189 // public boolean getAutoCommit() 190 // public void commit() 191 // public void rollback() 192 193 //推荐前台调用存储过程,在后台的存储过程里面实现事务即可。不要将事务放在前台执行 194 //注意:JDBC事务的范围局限于一个数据库连接,不能跨越多个数据库 195 } 196 197 /* 198 *6.连接池 199 */ 200 public static void demoConnectionPool(){ 201 //数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时, 202 //只需从“缓冲池”中取出一个,使用完毕之后再放回去 203 204 205 } 206 /*部分资料参考于博客:http://blog.csdn.net/hu_shengyang/article/details/6290029 207 http://blog.csdn.net/csh624366188/article/details/7305672/ 208 http://www.blogjava.net/chunkyo/archive/2007/01/16/94266.html 209 */ 210 }