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 }