代码即财富之我学Java JDBC(6)
2015-07-01 00:00
495 查看
摘要: 一些大型程序免不了要连接数据库,很多网络程序更是如此,因此掌握数据库的连接手段非常必要,本文以Oracle和mysql数据库为例,介绍Java程序通过jdbc连接并操作数据库的示例。
Java通过JDBC连接和操作数据库,每个数据库厂商都定制了一套可以通过Java连接的JDBC接口,以jar包的形式发布。要实现Java程序连接数据库,受限需要下载相应的数据库可支持的JDBC jar包,Oracle安装目录下提供了与jdbc操作相关的很多jar文件,可直接使用,而mysql需要自己在网上下载,但是本人发现,通过classpath设置数据库驱动(即jar包),本地Java程序还是操作不了,因此,本文在eclipse环境下进行。
首先,新建连接数据库的程序项目,设置项目属性,java build path,选择external jar,上传项目需要的两个jar文件(oracle和mysql分别需要使用的驱动).
下面正式开始代码的编写。我们新建DbConnection和DbHelper类,DbConnection负责建立和关闭与指定数据库的连接,将该连接作为参数设置到DbHelper实例,并由此类完成与指定数据库相关的增删改查操作。
DbConnection类:建立数据库连接有以下一般步骤:
1)加载驱动程序,已知驱动程序类名,不知其结构,利用Java反射加载驱动,Class.forName("驱动程序报名.类名")
2)准备连接url,针对不同的数据有不同的url,但无一例外,都需要提供指定的数据库实例名
3)准备连接数据库实例的用户名和密码
4)利用java.sql包下DriverManager类打开指定数据库连接(以连接url,用户名,密码作为参数)
得到连接之后,便可以利用此连接来进行数据库的增删改查操作了,DbHelper类则提供了相关执行函数,doQuery查询函数和doUpdate更新函数,以指定sql语句作为函数参数,在函数中,创建PreparedStatement(预编译的,对于批量处理可以大大提高效率)来封装sql语句,并调用相应的executeQuery和executeUpdate函数执行数据库操作。
从以上代码中也可以发现,PreparedStatement还可以设置sql语句中的参数。exxcuteQuery返回的是ResultSet类型的结果集,该结果集以游标形式访问,并通过制定字段号(从1开始)或字段名,获取数据库表中查询得到的内容。executeUpdate返回更新影响的条目数,大于0表示有更新。
本程序,以properties文件组织数据库连接各参数,
首先通过properties文件读取得到数据库各参数,然后设置到DbConnection构造函数里,Properties类提供了Java属性文件操作的支持,实际上是一个HashTale,不过它的键值都必须是String类型。调用Properties实例对象的load方法可以将属性文件加载到程序中,并利用getProperty读取指定key的值。程序main函数如下:
程序执行结果如下:
Fluffy
1 lines have been updated
可以根据上述代码自行调整sql语句以及连接的数据库类型,需要注意的是,查询或更新结束,需要及时关闭与数据库相关的各个资源,如ResultSet对象,PreparedStatement对象,Connection对象。
Java通过JDBC连接和操作数据库,每个数据库厂商都定制了一套可以通过Java连接的JDBC接口,以jar包的形式发布。要实现Java程序连接数据库,受限需要下载相应的数据库可支持的JDBC jar包,Oracle安装目录下提供了与jdbc操作相关的很多jar文件,可直接使用,而mysql需要自己在网上下载,但是本人发现,通过classpath设置数据库驱动(即jar包),本地Java程序还是操作不了,因此,本文在eclipse环境下进行。
首先,新建连接数据库的程序项目,设置项目属性,java build path,选择external jar,上传项目需要的两个jar文件(oracle和mysql分别需要使用的驱动).
下面正式开始代码的编写。我们新建DbConnection和DbHelper类,DbConnection负责建立和关闭与指定数据库的连接,将该连接作为参数设置到DbHelper实例,并由此类完成与指定数据库相关的增删改查操作。
DbConnection类:建立数据库连接有以下一般步骤:
1)加载驱动程序,已知驱动程序类名,不知其结构,利用Java反射加载驱动,Class.forName("驱动程序报名.类名")
2)准备连接url,针对不同的数据有不同的url,但无一例外,都需要提供指定的数据库实例名
3)准备连接数据库实例的用户名和密码
4)利用java.sql包下DriverManager类打开指定数据库连接(以连接url,用户名,密码作为参数)
class DbConnection{ private String driverName = null; private String connUrl = null; private String userName = null; private String passWord = null; private Connection conn = null; public DbConnection(String driverName,String connUrl,String userName,String passWord){ this.driverName = driverName; this.connUrl = connUrl; this.userName = userName; this.passWord = passWord; } public Connection openConnection(){ try{ Class.forName(driverName); conn = DriverManager.getConnection(connUrl,userName,passWord); }catch(Exception e){ System.out.println("Database connect error"); e.printStackTrace(); } return conn; } public void closeConnection(){ try{ this.conn.close(); }catch(Exception e){ } } }
得到连接之后,便可以利用此连接来进行数据库的增删改查操作了,DbHelper类则提供了相关执行函数,doQuery查询函数和doUpdate更新函数,以指定sql语句作为函数参数,在函数中,创建PreparedStatement(预编译的,对于批量处理可以大大提高效率)来封装sql语句,并调用相应的executeQuery和executeUpdate函数执行数据库操作。
class DbHelper{ private Connection conn = null; public DbHelper(Connection conn){ this.conn = conn; } public void doQuery(String sqlStr,String... wheres){ ResultSet rs = null; PreparedStatement pst = null; try{ pst = this.conn.prepareStatement(sqlStr); if(wheres != null && wheres.length > 0){ for(int i=0;i<wheres.length;i++){ pst.setString(i+1, wheres[i]); } } rs = pst.executeQuery(); while(rs.next()){ System.out.println(rs.getString(1)); } }catch(Exception e){ }finally{ try{ rs.close(); pst.close(); }catch(Exception e){ } } } public void doUpdate(String sqlStr,String... wheres){ PreparedStatement pst = null; int count = 0; try{ pst = this.conn.prepareStatement(sqlStr); if(wheres != null && wheres.length > 0){ for(int i=0;i<wheres.length;i++){ pst.setString(i+1, wheres[i]); } } count = pst.executeUpdate(); System.out.println(count+" lines have been updated"); }catch(Exception e){ e.printStackTrace(); }finally{ try{ pst.close(); }catch(Exception e){ } } } }
从以上代码中也可以发现,PreparedStatement还可以设置sql语句中的参数。exxcuteQuery返回的是ResultSet类型的结果集,该结果集以游标形式访问,并通过制定字段号(从1开始)或字段名,获取数据库表中查询得到的内容。executeUpdate返回更新影响的条目数,大于0表示有更新。
本程序,以properties文件组织数据库连接各参数,
#Oracle oracleDriver=oracle.jdbc.driver.OracleDriver oracleUrl=jdbc:oracle:thin:@127.0.0.1:1521:test oracleUsername=scott oraclePassword=123456 #mysql mysqlDriver=com.mysql.jdbc.Driver mysqlUrl=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=gbk mysqlUsername=root mysqlPassword=123456
首先通过properties文件读取得到数据库各参数,然后设置到DbConnection构造函数里,Properties类提供了Java属性文件操作的支持,实际上是一个HashTale,不过它的键值都必须是String类型。调用Properties实例对象的load方法可以将属性文件加载到程序中,并利用getProperty读取指定key的值。程序main函数如下:
public class TestJDBC{ public static void main(String[] args) { Properties pro = new Properties(); InputStream in = null; try{ in = new FileInputStream("./connection.properties"); pro.load(in); }catch(Exception e){ } String sqlType = "mysql"; String driverName = pro.getProperty(sqlType+"Driver"); String connUrl = pro.getProperty(sqlType+"Url"); String userName = pro.getProperty(sqlType+"Username"); String passWord = pro.getProperty(sqlType+"Password"); DbConnection dbConnection = new DbConnection(driverName, connUrl, userName, passWord); Connection conn = dbConnection.openConnection(); DbHelper dbHelper = new DbHelper(conn); String queryStr = "select * from event where type=? and happen>?"; dbHelper.doQuery(queryStr,"litter","1995"); String updateStr = "insert into event values(?,?,?,?)"; dbHelper.doUpdate(updateStr,"Sufa","1997-07-01","vet","headache"); dbConnection.closeConnection(); } }
程序执行结果如下:
Fluffy
1 lines have been updated
可以根据上述代码自行调整sql语句以及连接的数据库类型,需要注意的是,查询或更新结束,需要及时关闭与数据库相关的各个资源,如ResultSet对象,PreparedStatement对象,Connection对象。
相关文章推荐
- Spring(事务管理)
- Java-在线聊天系统-线程
- java中的日期和时间
- Java的4种代码块
- Struts1 Spring2 iBatis2 框架的集成
- SpringMVC第一次搭建
- Java基础---IO流
- [转载] Java NIO与IO
- [Java]学习笔记,随笔【七】
- 疯狂Java讲义-面向对象(1 of n)
- Java 包的使用
- java eclipse 整个项目或包查找只定字符串并替换
- 学习笔记_Java_day13_JSTL_自定义标签库(9)
- Struts2框架学习之OGNL表达式
- 学习笔记_Java_day13_JSTL标签库(1、2、3、4、5、6、7、8)
- java 类中构造函数的讲解
- SSH-struts2的异常处理
- Java-在线聊天系统-非线程
- Spring boot 整合spring Data JPA+Spring Security+Thymeleaf框架(上)
- MAC常用java开发软件