Jakarta Commons DBUtils组件的使用
一、 下载地址:http://commons.apache.org/downloads/download_dbutils.cgi
二、 使用 commons DBUtils组件 将取得的每条记录以键值对的形式储存在Map集合中
再将所有记录以储存在list集合中
代码:
public class MapList_Example { public static void main(String[] args) { DataBaseConnection(); }
public static void DataBaseConnection() { String DRIVER = "oracle.jdbc.driver.OracleDriver"; String URL = "jdbc:oracle:thin:scott/tiger@localhost:1521:sky"; String sql = "select id,name,email,title,content,time from guestbook order by id desc"; // 用于查询 并将结果保存在Map集合中 QueryRunner qr = new QueryRunner(); Connection conn = null;
try { // 加载驱动 和Class.forName(DRIVER) 一样 DbUtils.loadDriver(DRIVER); conn = DriverManager.getConnection(URL); // 将查询的记录保存在list集合中 每天记录在以键值对的形式保存在Map中 List result = (List) qr.query(conn, sql, new MapListHandler()); // 关闭 DbUtils.close(conn); Map map = null; for (int i = 0; i < result.size(); i++) { map = (Map) result.get(i); System.out.print("id:" + map.get("id") + "/t"); System.out.print("name:" + map.get("name") + "/t"); System.out.print("email:" + map.get("email") + "/t"); System.out.print("title:" + map.get("title") + "/t"); System.out.print("content:" + map.get("content") + "/t"); System.out.println("time:" + map.get("time") + "/t"); } } catch (SQLException e) { e.printStackTrace(); } } }
|
三、 使用 commons DBUtils组件 将取得的记录以JavaBean的形式储存在list集合中
当然在使用该功能前 要先创建一个JavaBean
package org.cgz.dbutils;
public class GuestBook { private int id; private String name; private String phone; private String email; private String title; private String content; private String time; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; }
}
|
BeanListExample.java
public class BeanListExample { public static void main(String[] args) { DataBaseConnection(); } public static void DataBaseConnection() { String DRIVER = "oracle.jdbc.driver.OracleDriver"; String URL = "jdbc:oracle:thin:scott/tiger@localhost:1521:sky"; String sql = "SELECT id,name,phone,title,email,content,time FROM guestbook ORDER BY id DESC"; Connection con = null; //对应Preparestatment 记忆 QueryRunner qRunner = new QueryRunner(); //对应ResultSet记忆 List result = null;
try { DbUtils.loadDriver(DRIVER); con = DriverManager.getConnection(URL); //将每条记录以JavaBean的形式储存在list中 result = (List)qRunner.query(con, sql, new BeanListHandler(GuestBook.class)) ; DbUtils.close(con); //遍历输出 Iterator iter = result.iterator(); while(iter.hasNext()) { GuestBook gBook = (GuestBook)iter.next(); System.out.println("id:"+gBook.getId()+" "); System.out.print("name:"+gBook.getName()+" "); System.out.print("phone:"+gBook.getPhone()+" "); System.out.print("email:"+gBook.getEmail()+" "); System.out.print("title:"+gBook.getTitle()+" "); System.out.print("content:"+gBook.getContent()+" "); System.out.println("time:"+gBook.getTime()); } } catch (SQLException e) { e.printStackTrace(); } } }
|
总结:个人感觉比较好的地方在于 和ResultSet不同的是 可以将记录以不同的方式取出
记忆:
1. QueryRunner和 Preparestatment 对应 (QueryRunner功能要强大很多)
2. DBUtils.load()和Class.forName()对应 功能一样 (使用连接池时 就没必要写这步了)
3. List 和 ResultSet 对应
注意:
MapListHandler 将每条记录以键值对的形式保存(Map集合)
BeanListHandler 将每条记录以javabean的形式保存
最后将所有记录保存在list集合中
可以使用for循环输出 也可以使用Iterator遍历输出
四、使用Commons DBUtils 同时使用连接池 执行数据库插入的操作
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String title = request.getParameter("title"); String content = request.getParameter("content"); String categoryId = request.getParameter("category");
DataSource ds = null; int result = 0; String message = ""; String sql = "insert into blog(title,category_id,content,created_time) values(?,?,?,now())"; try { //找到Context Context context = new InitialContext(); //找到DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/mysqlds"); //通过QueryRunner操作数据源获取Connection对象 同时放回连接对象的操作也由QueryRunner来处理 即conn.close() QueryRunner qRunner = new QueryRunner(ds); //将要传递的参数以数组的形式通过update()方法传入SQL语句 String param[] = {title,content,categoryId}; //执行SQL语句 qRunner.update(sql, param); } catch (NamingException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } //判断添加博文是否成功 if(result == 1) { message = "添加博文成功!"; }else { message = "添加博文失败!"; } //此句曾出现错误 request.setAttribute(message,"message"); request.setAttribute("message",message); request.getRequestDispatcher("/addBlogResult.jsp").forward(request, response); } |
小结:
1. 可以直接将获取的数据源对象交给QueryRunner去处理操作 它将从数据源获取Connection连接对象 并会自动将 con连接对象放回到连接池中 即conn.close()
2. QueryRunner中的update方法 可以直接传入以个数组参数 在执行插入操作时 可以直接将需要插入的参数 放在一个数组中 最后一并传给QueryRunner的update()方法
Context context = new InitialContext(); ds = (DataSource)context.lookup("java:comp/env/jdbc/mysqlds"); //将数据源对象交给QueryRunner处理 QueryRunner qRunner = new QueryRunner(ds); //将要传递的参数以数组的形式通过update()方法传入SQL语句 String param[] = {title,content,categoryId}; //执行SQL语句 qRunner.update(sql, param); |
这样可以减少很多JDBC代码