MySQL-JDBC 博客分类: 数据库
MySQL-JDBC
JDBC是一种java数据库连接Api接口。JDBC 可做三件事:与数据库建立连接、发送 操作数据库的语句并处理结果
接下来便是开发步骤:
1、 创建项目
2、 右键项目,添加mysql-connector-java-5.1.29-bin.jar包。可以从MySQL官网下载mysql-connector-java-5.1.29.zip,解压后直接获得。
3、 创建数据库。现在已经假定各位已经创建好自己的数据库了。
4、 进行编程。编程完成之后,右键运行即可。
下面探讨一下核心代码:
1、 连接数据库
Connection conn = null; String dburl = "jdbc:mysql://localhost:3306/cyw"; String username = "cyw"; String password = ""; String driver = "com.mysql.jdbc.Driver"; //先动态加载驱动,然后进行实例化 Class.forName(driver).newInstance(); //链接数据库 conn = DriverManager.getConnection(dburl, username, password);
2、 连结对象创建成功后,即可通过连结对象创建 statement 对象,以执行 SQL 语句。我们可将要执行的 SQL 语句分为两类,一类为需要返回结果表的 select 语句;一类为执行 insert、 update、 delete 操作的语句,因用程序只需要这类语句返回操作所生效的行数即可;对于这两种 SQL 操作, Statement 在执行时可采用不同的方法,如是 select 语句,则使用 executeQuery(sql)方法返回一个 ResultSet 对象,其中包含查询到的数据;如是另外三种,则使用 executeUpdate(sql)方法,返回一个 int 型值,代表语句所影响的行数。
关于查询方式,有三种,分别是statement、prepareStatement、CallableStatement。其中PrepareStatement是Statement的子类、CallableStatement是PrepareStatement的子类。
Statement,又叫做拼装SQL语句。可以直接从conn链接对象获得,直接编译执行。
PrepareStatement,又称预编译SQl语句。顾名思义,有一个预编译过程。数据库可以先将这些格式固定的SQL语句进行编译,存入数据库的缓存池里面。此时,并没与执行编译后的SQL语句,等到我们需要的时候,我们为?占位符赋值之后,就不用再次进行编译,而是直接运行。这是一种延迟加载的机制。能够有效的提高数据库的效率(毕竟只有在需要的时候才会进行运行,节省了资源),当然也克服了Statement的SQL注入风险。
CallableStatement是关于存储过程的,可下回分解。
//查询 public void query(String table, String colName, String temp) throws SQLException{ String sql = "select * from "+table+" where "+colName+"=?"; //一般使用预编译SQL语句, PreparedStatement ps = conn.prepareStatement(sql); //为每一个占位符?设置参数 ps.setString(1, temp); ResultSet rs = ps.executeQuery(); //进行显示 while(rs.next()){ int id = rs.getInt("id"); System.out.println("id:"+id); } } //添加 publicvoid add(String table) throws SQLException{ String sql = null; if("datatable".equals(table)){ sql = "insert into "+table+"(AT_id,type_id,data) values (?,?,?)"; } PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, 11); ps.setInt(2, 2); ps.setInt(3, 66); int count = ps.executeUpdate(); if(count>0){ System.out.println("插入数据成功!影响的记录条数是"+count); }else{ System.out.println("插入数据失败!"); } }
其他的类似。
3、 结果集提取
如以上例子。
4、 批处理
Statement提供了一个 addBatch(String sql)的方法将sql 加入批处理; PreparedStatement 对象的 addBatch()方法直接将预编译的 sql 加入批处理,最后可通过 executeBatch()方法一次性执行所有 sql。注意,这里 executeBatch()方法返回为一个 int[],数组的第 i 个元素的值代表加入批处理的第 i 条 sql 所影响的行数。
//测试批量处理 publicvoid bacthInsert(){ try { String sql = "insert into datatable(AT_id,type_id,data) values(?,?,?)"; PreparedStatement ps = conn.prepareStatement(sql); for(int i=0;i<10;i++){ ps.setInt(1, i); ps.setInt(2, i); ps.setInt(3, i); ps.addBatch(); } int[] result = ps.executeBatch(); for(int i : result) System.out.println(i); } catch (SQLException e) { System.out.println("批量处理失败"); e.printStackTrace(); } }
5、 事务
事务是指一个单元的工作,要么全部执行,要么就是全部不执行,非0即1.
Mysql可以通过手动提交进入事务机制。
详细以后再讲,以下是核心代码:
Conn.setAutoCommit(); //false,设置为手动提交,否则为自动提交
Conn.rollback() //回滚到起始状态。
关于事务级别:
Conn.setTransactionIsolation(事务级别常量);
Conn.getTransactionIsolation();
关于SavePoint接口(类似于存档点):
Java.sql.Savepoint txpoit = conn.setSavePoint(String SavePoint的名字);
Conn.rollback(txpoint); //回滚到上一个SavePoint
Conn.releaseSavePoint(String SavePoint的名字); //释放SavePoint
6、 数据库连接池
为了减少运行过程中,数据库频繁创建、销毁连接,而消耗的资源,设立了数据库连接池,相当于一个数组或者集合类,存放了一些数据库连接。当需要时,便可以从连接池取得连接,不需要时便返回到连接池里面。
Connection 的建立较之线程更为费时,不但要建立底层的 TCP/IP 链路,还要通过复杂的数据库安全认证计算,这就有必要采用“连结池”技术。
网上有很多关于数据库连接池的开源实现,比如DBCP、Hibernate的C3P0组件等等。
7、 元数据查询
元数据,可以理解为数据的数据,如数据库版本号、表的列数,列名,某列数据类型等, JDBC 中可以得到两种元数据类型,一种是通过 Connection 对象的 getMetaData()方法得到 DatabaseMetaData对象用来取得数据库的相关信息;另一种是通过 ResultSet 对象的 getMetaData()方法得得结果集的元数据 ResultSetMetaData 对象用来取得结果集,如列个数等相关信息。
核心代码:
//取得数据库的元数据对象
DatabaseMetaData dmd=conn.getMetaData();
String dbName=dmd.getDatabaseProductName();
String dbVersion= dmd.getDatabaseProductVersion();
//得到结果集的元数据对象
ResultSetMetaData rmd=rs.getMetaData();
//结果集有几列
int columCount=rmd.getColumnCount();
//打印出每一列的标题
for(int i=1;i<=columCount;i++){
System.out.print(rmd.getColumnName(i)+"\t");
}
上一篇: 关于初次使用Oracle若干问题集锦
下一篇: 关于图片下传,文件名中文显示乱码有关问题
推荐阅读
-
MySQL-JDBC 博客分类: 数据库
-
Extjs3综合应用(待续v4...初版) 博客分类: js EXTSpringJSPStrutsiBATIS 最近又要搞界面了。郁闷啊。
-
ExtJS DWR 入门级代码 源代码 博客分类: js DWREXTJBuilderUIJ#
-
Andoird通信之简单聊天ChatApp 博客分类: Android Andoird通信ChatApp
-
命令学习日志 博客分类: 技术简介
-
extjs two tree 动态双树代码 效果图 博客分类: js EXTJSP
-
Hadoop 博客分类: 云计算
-
Java垃圾收集机制 博客分类: Java javajvm
-
java读取文件及文件流 博客分类: java JavaJSPServlet
-
Nokia N800/N810如何配置java + SWT 博客分类: Mobile NokiaJavaMaemoEclipseSSH