DbUtils类使用讲授

DbUtils:提供如关闭连接、装载JDBC驱动程序等健康职业的工具类,里面包车型客车具备办法都以静态的。首要方法如下:

  • public static void close(…) throws java.sql.SQLException DbUtils类提供了多个重载的闭馆措施。这个方法检查所提供的参数是否NULL,如若不是的话,它们就关闭Connection、Statement和ResultSet。
  • public static void closeQuietly(…) 这一类措施不但能在Connection、Statement和ResultSet为NULL景况下制止关闭,还是能够遮蔽一些在前后相继中抛出的SQLException。
  • public static void commitAndCloseQuietly(Connection conn) 用来交给连接,然后倒闭连接,并且在关闭连接时不抛出SQL卓殊。
  • public static boolean loadDriver(java.lang.String driverClassName) 这一艺术装载并注册JDBC驱动程序,假使成功就赶回true。使用该措施,你没有要求捕捉这些特别ClassNotFoundException。

批量加上

public int[] batch(Object[][] values) {

        QueryRunner queryRunner = new QueryRunner();
        Connection conn = ConnectionUtil.getConnect();
        try {
            return queryRunner.batch(conn, "insert into user(name, age) values(?, ?)", values);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
        return null;
}

构成c3p0数据源使用dbutils

删除

public Integer delete(Integer id) {

        QueryRunner queryRunner = new QueryRunner();
        Connection conn = ConnectionUtil.getConnect();
        try {
            return queryRunner.update(conn , "delete from user where id = ?", id);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
        return 0;
}

询问全体

public List<User> select() {

        QueryRunner queryRunner = new QueryRunner();
        Connection conn = ConnectionUtil.getConnect();
        try {
            return queryRunner.query(conn, "select id id1, name, age from user", new UserBeanListHandler(User.class));
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
        return null;
}

dbutils 优点

  1. 对此数据表的读操作,他能够把结果转变来List,Array,Set等java集结,便于程序猿操作;
  2. 对于数据表的写操作,也变得很简单(只需写sql语句)
  3. 能够行使数据源,使用JNDI,数据库连接池(dbcp,c3p0)等技艺来优化质量–重用已经营造好的数据库连接对象,而不像php,asp那样,费时费劲的无休止重复的营造和析构那样的靶子。

修改

public Integer update(User user) {

        QueryRunner queryRunner = new QueryRunner();
        Connection conn = ConnectionUtil.getConnect();
        try {
            return queryRunner.update(conn , "update user set name = ?, age = ? where id = ?", user.getName(), user.getAge(), user.getId());
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
        return 0;
}

运用连接池的优点

  • 财富重用:

www.yabovip4.com,鉴于数据库连接得以重用,制止了数10遍创立,释放连接引起的大方属性费用。在削减系统消耗的根底上,另一方面也加进了系统运转景况的平稳性。

  • 越来越快的种类反应速度:

数据库连接池在开头化进度中,往往已经创办了若干数据库连接置于连接池中备用。此时连日的起始化职业均已形成。对于工作诉求管理来讲,直接运用现成可用连接,制止了数据库连接早先化和释放进程的岁月支出,进而降低了系统的响应时间。

在较为完美的数据库连接池完结中,可依照预先的挤占超时设定,强制回收被占用连接,进而防止了正规数据库连接操作中或者现身的财富走漏。

添加

public Integer add(User user) {
        QueryRunner queryRunner = new QueryRunner();
        Connection connect = ConnectionUtil.getConnect();
        try {
            return queryRunner.update(connect, "insert into user(name, age) values(?, ?)", user.getName(), user.getAge());
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(connect);
        }
        return 0;
}

选用DBUtils完毕数据库的CRUD

在利用DBUtils完毕数据库的CRUD此前,大家先编写制定测验用的SQL脚本:

CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL,
  `age` tinyint(10) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

行使dbutils遵循以下步骤

  1. 加载JDBC驱动程序类,并用DriverManager来得到一个数据库连接conn。
  2. 实例化 QueryRunner,得到实例化对象qRunner。
  3. qRunner.update()方法,实行增改删的sql命令,qRunner.query()方法,得到结果集。

获得连接对象

private static final String url = "jdbc:mysql://192.168.1.15:3306/test?useUnicode=true&characterEncoding=utf8";
private static final String driver = "com.mysql.jdbc.Driver";
private static final String user = "znsd_test";
private static final String password = "123456";

public static Connection getConnect() {
    Connection conn = null;
    try {
        Class.forName(driver);
        conn = DriverManager.getConnection(url, user, password);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return conn;
}

采取手续

  1. 率先要导入c3p0和dbutils以及mysql的jar包
  • c3p0-0.9.5.2.jar
  • commons-dbutils-1.7.jar
  • 执行一个不需要置换参数的查询操作。mchange-commons-java-0.2.11.jar
  • mysql-connector-java-5.1.22.jar
  1. 编写c3p0的布署文件c3p0-config.xml

在src目录下寄存c3p0的布署文件,配置文件是c3p0自身去辨别并读入的,大家无需在代码中做别的的操作,可是配置文件必得求命名称叫c3p0-config.xml

   <?xml version="1.0" encoding="UTF-8"?>
   <c3p0-config>
    <!-- 这是默认配置信息 -->
    <default-config>
        <!-- jdbc连接四大参数配置 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://192.168.1.15:3306/test</property>
        <property name="user">znsd_test</property>
        <property name="password">123456</property>

        <!-- 池参数配置 -->
        <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements
            属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
            如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0
        -->
        <property name="acquireIncrement">3</property>
        <!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
        <property name="initialPoolSize">10</property>
        <!--连接池中保留的最小连接数。-->
        <property name="minPoolSize">2</property>
        <!--连接池中保留的最大连接数。Default: 15 -->
        <property name="maxPoolSize">10</property>
    </default-config>
   </c3p0-config>
  1. 执行一个不需要置换参数的查询操作。应用c3p0获取获取数据库连接对象

   public class C3p0ConnectionUtil {

    // 配置文件的默认配置!要求你必须给出c3p0-config.xml
    private static ComboPooledDataSource c3p0DataSource = new ComboPooledDataSource();

    /**
     * 获取连接对象
     * @return
     */
    public static Connection getConnection() {
        try {
            // 得到连接器
            return c3p0DataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取数据源
     * 
     * @return
     */
    public static DataSource getDataSource() {
        return c3p0DataSource;
    }
   }
  1. dbutils 使用c3p0

   public Integer add(User user) {
        QueryRunner queryRunner = new QueryRunner(C3p0ConnectionUtil.getDataSource());
        try {
            return queryRunner.update("insert into user(name, age) values(?, ?)", user.getName(), user.getAge());
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
   }
  1. 归来主键例子

   public Integer add(User user) {
        DataSource dataSource = C3p0ConnectionUtil.getDataSource();
        QueryRunner queryRunner = new QueryRunner(dataSource);
        try {
            String sql = "insert into user(name, age) values(?, ?)";
                // 需要条用insert方法,指定MapHandler参数
            Map<String, Object> idMap = queryRunner.insert(sql, new MapHandler() {

                @Override
                public Map<String, Object> handle(ResultSet rs) throws SQLException {

                    //rs = rs.getStatement().getGeneratedKeys();
                        // 获取主键
                    int id = rs.next() ? rs.getInt(1) : -1;
                    // 将数据库返回主键放入map中
                    Map<String, Object> idMap = new HashMap<String, Object>();
                    idMap.put("id", id);

                    return idMap;
                }
            }, user.getName(), user.getAge());

            return (Integer) idMap.get("id");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
   }

commons-dbutils API介绍

  • 执行一个不需要置换参数的查询操作。org.apache.commons.dbutils.QueryRunner QueryRunner
    (insert、update、delete使用)
  • 执行一个不需要置换参数的查询操作。org.apache.commons.dbutils.ResultSetHandler (用于查询结果处理利用)
  • org.apache.commons.dbutils.DbUtils (工具类)

执行一个不需要置换参数的查询操作。QueryRunner 类的第一方法

  • public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException

推行二个询问操作,在那些查询中,对象数组中的各样成分值被用来作为查询语句的置换参数。该方法会自行管理PreparedStatement和ResultSet的创建和倒闭。

  • public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException

差不离与第一种形式一致;独一的不如在于它不将数据库连接提需要艺术,而且它是从提须要构造方法的数据源(DataSource)或应用的setDataSource方法中再次获得Connection。

  • public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException

实行三个没有必要置换参数的查询操作。

  • public int update(Connection conn, String sql, Object[] params) throws SQLException

用来实行二个更新(插入、更新或删除)操作。

  • public int update(Connection conn, String sql) throws SQLException

用来试行二个不供给置换参数的换代操作。

  • public int[] batch(Connection conn, String sql, Object[][] params) throws SQLException

本条方法对应着批管理,常常用来在同一个表中批量布署数据,或批量更新表的数据。
该措施为啥会接受二维数组Object[][] params啊?
答:举例现在要想在同一个表中批量插入数据,编写的SQL语句为:

  String sql = "insert into users(id,name) values(?,?)";

该办法接收二维数组Object[][] params,那么调用其的时候将在传递三个诸如那样的实参[[1,aa],[2,bb],[3,cc]],即用二维数组里面包车型大巴每三个一维数组生成一条sql语句。
那为啥又会重临int[]呢?
答:该方式的重回值是int[],所以会回来诸如那样的结果:[1,1,1],意思是转换的首先条sql语句影响数据库几行、生成的第二条sql语句影响数据库几行、生成的第三条sql语句影响数据库几行。

commons-dbutils简介

commons-dbutils是Apache组织提供的贰个开源JDBC工具类库,它是对JDBC的简约包装,学费非常的低,而且使用dbutils能非常大简化jdbc编码的工作量,同临时间也不会耳熏目染程序的属性。由此dbutils成为相当多恶感hibernate的合营社的首推。
dbutils的官方网站

www.yabovip4.com 1

创办bean对象关联数据库

public class User implements Serializable {
    private Integer id; // 用户ID
    private String name; // 用户姓名
    private Integer age;  // 用户年龄
    // ...忽略set、get方法
}

查询单个对象

public User selectOne(Integer id) {

        QueryRunner queryRunner = new QueryRunner();
        Connection conn = ConnectionUtil.getConnect();
        try {
            return queryRunner.query(conn, "select id id1, name, age from user where id = ? limit 1", new BeanHandler<User>(User.class) {
                @Override
                public User handle(ResultSet rs) throws SQLException {
                    if (rs.next()) {
                        return new User(rs.getInt("id1"), rs.getString("name"), rs.getInt("age"));
                    }
                    return null;
                }
            }, id);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
        return null;
}

数据库连接池简单介绍

数据库连接池肩负分配、管理和假释数据库连接,它同意应用程序重复使用一个存活的数据库连接,并非再重复树立三个;连接池允许四个顾客端选取缓存起来的接连对象,这一个指标能够接连数据库,它们是分享的、可被重复使用的。

打开/关闭数据库连接耗费比很大,连接池技巧允许我们在连接池里拥戴连接对象,那样能够拉长数据库的实施命令的属性。多个客户端央求能够重复使用一样的连接对象,当每一次接到三个客商端央求时,就能招来连接池,看看有未有闲置的连天对象。若无闲置对象的话,要么全数的客商端诉求都踏向队列排队,要么在池中开创三个新的总是对象(这有赖于池里已经有稍许个一而再存在以及计划帮助多少连接)。一旦有个别央浼使用完连接对象之后,这些指标会被重新放入池中,然后会被重复分派给排队等待的呼吁(分派给哪个需要要看使用什么调治算法)。因为超越45%呼吁都以行使现有的总是对象,所以连接池技能大大收缩了等候创设数据库连接的时间,进而收缩了平均连接时间。

www.yabovip4.com 2

c3p0简介

C3P0是叁个开源的JDBC连接池,它达成了数据源和JNDI绑定,帮衬JDBC3标准和JDBC2的行业内部扩大。方今利用它的开源项目有Hibernate,Spring等

ResultSetHandler接口使用解说

该接口用于拍卖java.sql.ResultSet,将数据按要求改造为另一种样式。ResultSetHandler接口提供了叁个单独的艺术:Object handle (java.sql.ResultSet .rs)

ResultSetHandler接口的兑现类

  • ArrayHandler:把结果聚集的第一行数码转成对象数组。
  • ArrayListHandler:把结果集中的每一行数据都转成三个数组,再贮存到List中。
  • BeanHandler:将结果聚集的第一行数码封装到三个对应的JavaBean实例中。
  • BeanListHandler:将结果集中的每一行数据都打包到一个对应的JavaBean实例中,寄存到List里。
  • ColumnListHandler:将结果聚焦某一列的数目存放到List中。
  • KeyedHandler(name):将结果聚焦的每一行数据都卷入到二个Map里,再把那几个map再存到一个map里,其key为钦定的key。
  • MapHandler:将结果聚集的第一行数据封装到叁个Map里,key是列名,value就是对应的值。
  • MapListHandler:将结果集中的每一行数据都卷入到一个Map里,然后再存放到List。

DBUtils 学习应用

查询重临map

public List<Map<String, Object>> selectAsMap() {

        QueryRunner queryRunner = new QueryRunner();
        Connection conn = ConnectionUtil.getConnect();
        try {
            List<Map<String, Object>> userMaps = queryRunner.query(conn, "select id id1, name, age from user", new MapListHandler());
            return userMaps;
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
        return null;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注