DBUtils

前言

Mybatis、hibernate提供了便捷,快速、高效的交互环境
那为什么要写DBUtils呢?他看起来更像一个简化了JDBC操作的类库

DBUtils

我们都熟悉了Controller → Service → Mapper这种结构,能不能简化?
看段代码:

api

 @RequestMapping(value = "/projectLineList", method = RequestMethod.POST)
    @ResponseBody
    public Object projectLineList(ProjectManager projectManager, HttpServletRequest request)
    {
        return projectManager.projectLineList();
    }

Dao Service xml

public class ProjectManager
{
    private String projectId;

    private String projectName;

    private String projectNumber;

    private String company;

    private String companyId;

    private String principal;

    private String userId;

    private String status;

    private String createTime;

    private String lastmodifyTime;

    private String lineBaseId;

    private String lineName;

    private String lineCode;

    private String tagType;

    private String lineTypeName;

    private String displayName;


public Object projectLineList() {
        StringBuffer sql = new StringBuffer("select lr.projectId, l.lineBaseId,L.lineName,L.lineCode,r.tagType ,t.`name`   as lineTypeName "
                + "  from es_ts_project_line_relation  lr LEFT JOIN line_base_info l on l.lineBaseId = lr.lineBaseId "
                + " LEFT JOIN tb_tag_relation r on  r.subjectId = l.lineBaseId " + " LEFT JOIN tb_tag t on  r.tagid = t.id "
                + " WHERE t.tagstatus = 0 and t.tagType=6 ");
        sql.append(" and 1=1");
        List<Object> paramList = new ArrayList<Object>();
        if (this.projectId != null) {
            sql.append("  and  lr.projectid  like ? ");
            paramList.add("%" + this.projectId + "%");
        }
        if (paramList.size() > 0) {
            return DBUtils.queryList(ProjectManager.class, String.valueOf(sql), paramList.toArray());
        } else {
            return DBUtils.queryList(ProjectManager.class, String.valueOf(sql));
        }
    }
 }

看起来很像JDBC是么?

DBUtils.queryList(ProjectManager.class, String.valueOf(sql), paramList.toArray());

那我们来看看这个DBUtils

    @SuppressWarnings("unchecked")
    public static <T> List<T> queryList(Class<T> beanClass, String sql, Object... params) {
        Connection conn = Conn.get();
        try {
            ResultSetHandler<List<T>> handler = isPrimitive(beanClass) ? columnListHandler
                    : new BeanListHandler<T>(beanClass);
            long time1 = System.currentTimeMillis();
            List<T> list = queryRunner.query(conn, sql, handler, params);
            long time2 = System.currentTimeMillis();
            //logger.info("Time: {} SQL: {}\n List.size:{}\nParams:{}", time2 - time1,sql, list.size(), params);
            if (logger.isDebugEnabled()) {
                String logSql = String.format(sql.replaceAll("\\?", "%s"), params);
                logger.debug("Execute SQL: {}", logSql);
            }
            return list.isEmpty() ? null : list;
        } catch (SQLException e) {
            logger.error("SQL execute failed.", e);
            throw new RuntimeException(e);
        }
    }

Query

List<T> list = queryRunner.query(conn, sql, handler, params);
  public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {
        return this.<T>query(conn, false, sql, rsh, params);
    }

对于使用,以JDBC的角度去看很好理解,不外乎写好sql后传入参数,执行DBUtils的方法,很简洁的流程

使用

特别提一下 为什么说DBUtils是一个类库,因为它一共也就3个包

1.org.apache.commons.dbutils
2.org.apache.commons.dbutils.handlers
3.org.apache.commons.dbutils.wrappers

使用起来也比较方便
1.建立连接

import java.sql.SQLException;  
import java.sql.Connection;   

public class ConnectDb {  
    private static String driveClassName = "com.mysql.jdbc.Driver";  
    private static String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";   

    private static String user = "root";  
    private static String password = "root";  

    public static Connection Connect(){  
        Connection conn = null;  

        //加载驱动 
        try {  
            Class.forName(driveClassName);  
        } catch (ClassNotFoundException  e) {  
            System.out.println("load driver failed!");  
            e.printStackTrace();  
        }  

        //建立连接 
        try {  
            conn = DriverManager.getConnection(url, user, password);  
        } catch (SQLException e) {  
            System.out.println("connect failed!");  
            e.printStackTrace();  
        }         

        return conn;  
    }  
}  

2.bean

package Beans;  

public class UserBean {  
    private int id;   
    private String name;   
    private int age;  

    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 int getAge() {  
        return age;  
    }  
    public void setAge(int age) {  
        this.age = age;  
    }  
}  

3.sql execution

import java.sql.Connection;  
import java.sql.SQLException;  
import java.util.List;  
import org.apache.commons.dbutils.DbUtils;  
import org.apache.commons.dbutils.QueryRunner;  
import org.apache.commons.dbutils.handlers.BeanListHandler;  
import Beans.UserBean;  

public class main {  

    public static void main(String[] args) throws SQLException {  
        insertTest();
        updateTest();
        queryTest();
        deleteTest();  
    }  

    static void insertTest() throws SQLException{  
        Connection conn = ConnectDb.Connect();  

        //创建SQL执行工具   
        QueryRunner sqlRunner = new QueryRunner();   

        //执行SQL插入   
        int number = sqlRunner.update(conn, "insert into user(name,age) values('testUser',22)");   
        System.out.println("成功插入" + number  + "条数据!");   

        //关闭数据库连接   
        DbUtils.closeQuietly(conn);       
    }   

    static void queryTest() throws SQLException{  
        Connection conn = ConnectDb.Connect();  

        //创建SQL执行工具   
        QueryRunner sqlRunner = new QueryRunner();   

        @SuppressWarnings("unchecked")  
        List<UserBean> list = (List<UserBean>) sqlRunner.query(conn, "select id,name,age from user", new BeanListHandler(UserBean.class));   
        //输出查询结果   
        for (UserBean user : list) {   
                System.out.println(user.getAge());   
        }   

        //关闭数据库连接   
        DbUtils.closeQuietly(conn);   
    }   

    static void updateTest() throws SQLException{  
        Connection conn = ConnectDb.Connect();  

        //创建SQL执行工具   
        QueryRunner sqlRunner = new QueryRunner();   
        //执行SQL插入   
        int n = sqlRunner.update(conn, "update user set name = 'testUser',age=11");   
        System.out.println("成功更新" + n + "条数据!");   

        //关闭数据库连接   
        DbUtils.closeQuietly(conn);   
    }   

    static void deleteTest() throws SQLException{  
        Connection conn = ConnectDb.Connect();  

        //创建SQL执行工具   
        QueryRunner sqlRunner = new QueryRunner();   
        //执行SQL插入   
        int number = sqlRunner.update(conn, "DELETE from user WHERE name='testUser';");   
        System.out.println("成功删除" + number  + "条数据!");   

        //关闭数据库连接   
        DbUtils.closeQuietly(conn);   
    }   
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值