在上一篇博客《JDBC操作数据库的学习(1)》中通过对例1,我们已经学习了一个Java应用如何在程序中通过JDBC操作数据库的步骤流程,当然我们也说过这样的例子是无法在实际开发中使用的,本篇就在简单开发中如何对上一篇的例子进行“升级”,满足简单开发中对数据库的增删改查(CRUD)。
如果按照上一篇中的例子,那么我们在做增删改查的话将会出现每个方法都要获取连接,释放资源,代码会出现很大的重复性,因此我们应该将每个增删改查每个方法中可以复用的代码抽取出来,同时为了能切换数据库方便,也该将一些配置信息在配置文件中单独定义,而不是在程序中写死。
例1:
在数据库中的数据定义:
//创建一个库 create database jdbcdemo; //使用该库 use jdbcdemo; //创建一个user表 create table user( id int primary key, name varchar(40), age int );
创建工程,并编写好配置信息文件:
创建一个工程,将数据库驱动jar包导入,在【src】目录下新建一个database.properties文件:
在database.properties配置文件中的内容如下:
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/jdbcdemo username=root password=root
编写数据库工具类JdbcUtils
不管一个工程中的哪个方法中要操作数据库之前,都要先确保驱动管理器中有数据库的驱动,获取连接,释放资源,这些操作有些只要执行一次,有些要重复的被调用,因此使用一个工具类来封装是最适合不过的。
1 public class JdbcUtils { 2 3 private static Properties config = new Properties(); 4 5 static{ 6 InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("database.properties"); 7 try{ 8 config.load(in); 9 Class.forName(config.getProperty("driver")); 10 11 12 }catch (Exception e) { 13 throw new ExceptionInInitializerError(e); 14 } 15 } 16 17 public static Connection getConnection() throws SQLException { 18 String url = config.getProperty("url"); 19 String username = config.getProperty("username"); 20 String password = config.getProperty("password"); 21 Connection conn = DriverManager.getConnection(url, username, password); 22 return conn; 23 } 24 25 public static void release(Connection conn,Statement st,ResultSet rs) { 26 if(rs!=null) { 27 try{ 28 rs.close(); 29 }catch (Exception e) { 30 e.printStackTrace(); 31 } 32 } 33 if(st!=null) { 34 try{ 35 st.close(); 36 }catch (Exception e) { 37 e.printStackTrace(); 38 } 39 } 40 if(conn!=null) { 41 try{ 42 conn.close(); 43 }catch (Exception e) { 44 e.printStackTrace(); 45 } 46 } 47 } 48 }
在这个工具类中,因为从配置文件中加载数据库的信息和使用反射向驱动管理器中注册数据库的驱动在整个工程应用中只需要执行一次,因此使用静态代码块来编写这些功能。视同Property对象将保存数据库信息,以便在该工具类获取连接的方法getConnection方法中能为每次调用提供URL,用户名和密码信息。另外既然作为工具类,该类中的方法最好都是静态的。
可以看到如果在JdbcUtils工具类中发生异常,那么我是直接转型为ExceptionInInitializerError错误,因为数据库作为底层最关键的一个环节都出错了,那么这个应用不应该再执行,当然要抛出异常还是错误可以根据个人或情况选择。
这个工具类只是做了最简单的注册驱动器,获取连接和释放资源,实际开发时可以根据需要再往该工具类中添加其他实用的方法。
对数据库进行增删改查:
前面写好了工具类,那么我们在一些类中的方法要对数据库进行操作,那么就可以从工具类中先获取方法,再写好自己的业务逻辑操作后再使用工具类的方法进行资源释放。
1 public class Demo { 2 3 public void insert() throws SQLException { 4 Connection conn = null; 5 Statement st = null; 6 ResultSet rs = null; 7 try{ 8 conn = JdbcUtils.getConnection(); //获取连接 9 st = conn.createStatement(); 10 String sql = "insert into user(id,name,age) value(1,‘Ding‘,25)"; 11 int num = st.executeUpdate(sql); 12 if(num>0) { 13 System.out.println("数据添加成功!"); 14 } 15 }finally{ 16 JdbcUtils.release(conn, st, rs); //释放资源 17 } 18 } 19 }
这里只在demo中演示了对数据库进行添加数据的操作,修改和删除只是在sql语句上有所不同,而如果是查询则会返回结果集ResultSet对象,在上一篇中的例1和例2都已经说明,这里不再叙述。在一般的WEB开发中,我们会将对数据库的增删改查放在DAO层进行。
本篇以对数据库的增删改查为例,主要在于描述如何创建一个工具类,并在该工具类中注册数据库驱动,编写实用的获取连接和释放资源的静态方法,这些都是在我看来比较有用的设计思想。