DBUtil使用步骤

北慕城南 提交于 2020-01-29 08:49:37

1、DBUtils的概述

DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能,简而言之DBUtils就是一个使用java代码操作数据库或者查询数据的框架,应用此框架我们可以简化我们的代码,节省开发时长,增加开发效率。

2、DBUtils的使用

DBUtils依赖于连接池(这篇博客使用Druid连接池),而Druid连接池依赖于Properties类,Properties类通过配置文件加载,因此DBUtils的使用步骤如下
1.创建配置文件,填写配置信息,并倒入需要的jar包:数据库驱动jar包 、druid包、dbutils包
2.创建一个工具类用于加载配置文件,使用Druid连接池提供的静态工厂类获取获取连接池对象
3.新建测试类,创建一个QueryRunner类传入创建的连接池对象,将sql语句传入update(增删改)或者query(查询)方法

2.1.创建配置文件

新建resource文件夹为src的同级目录,将resourc文件标记为(Mark Directory As)resourc root文件夹,在resource中新建一个配置文件,将文件后缀名改为properities
配置信息参数说明 url:数据库路径 jdbc:mysql://[ip地址]:[端口号]/[数据库名] (当连接本地地址时ip地址和端口号可以省略)
username:数据库账号
passwo:数据库密码
driverClassName驱动名

# 数据库连接参数
url=jdbc:mysql:///db
username=root
password=123
driverClassName=com.mysql.jdbc.Driver
# 连接池的参数
initialSize=10
maxActive=15
maxWait=2000

2.2 创建工具类加载配置文件获取连接池

将加载配置文件的步骤放在static修饰的静态代码块中而不是放在方法中,这样可以使配置文件的加载和连接池的获取由始至终只进行了一次,加快代码运行速度,并将连接池成员声明为静态保证无论调用多少次方法使用的都是同一个连接池。
JDBCUtil中的工具类
getDataSource获取连接池
getConnection 获取连接
close关闭连接

public class JDBCUtil {
    private static DataSource dataSource;
    static {
        //创建Druid连接池
        //1. 使用Properties对象,加载配置文件中的数据
        Properties properties = new Properties();
        InputStream in = JDBCUtil.class.getClassLoader().getResourceAsStream("druid.properties");
        try {
            properties.load(in);
            //2. 使用DruidDataSourceFactory工厂类,根据properties对象中的数据创建DataSource
            dataSource = DruidDataSourceFactory.createDataSource(properties);//赋值给成员变量dataSource
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接池对象的方法
     * @return
     */
    public static DataSource getDataSource() {
        return dataSource;
    }

    public static Connection getConnection(){
        //从连接池获取连接
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }
        return conn;
    }

    /**
     * 关闭2资源的方法
     */
    public static void close(Statement stm, Connection conn) throws SQLException {
        close(null,stm,conn);
    }

    /**
     * 关闭3资源的方法
     */
    public static void close(ResultSet rst, Statement stm, Connection conn) throws SQLException {
        if (rst != null) {
            rst.close();
        }
        if (stm != null) {
            stm.close();
        }
        if (conn != null) {
            conn.close();
        }
    }
}

2.3测试DBUTiles

调用工具类获取连接池的方法传入QueryRunner的构造方法创建QueryRunner的对象,QueryRunner主要有两个方法
1.int update(String sql, Object… params),执行增删改的SQL语句, params参数就是可变参数,参数个数取决于语句中问号的个数,返回值为受影响的数据条数

@Test
public void test01() throws SQLException {

    //目标:使用DBUtils框架执行添加数据的SQL语句,往user表中存入数据
    String sql = "insert into user values (null,?,?,?)";
    QueryRunner queryRunner = new QueryRunner(JDBCUtil.getDataSource());
    //调用update方法执行SQL语句
    int i = queryRunner.update(sql, "jay", "666666", "周杰棍");
    System.out.println(i);
}

2.query(String sql, ResultSetHandler rsh, Object… params),其中ResultSetHandler是一个接口,表示结果集处理者,下面介绍一下该接口

2.1ScalarHandler(),查询数据结果为单个数据时使用,(列如查询全班人数总数)

@Test
public void test04() throws SQLException {
    //1. 查询单个数据:比如说查询用户的总量、查询id为3的用户的昵称
    String sql = "select count(*) from user";//查询用户的总量
    QueryRunner queryRunner = new QueryRunner(JDBCUtil.getDataSource());
    //调用query方法执行查询的SQL语句,我们使用ScalarHandler处理单个数据的结果集
    Long count = (Long) queryRunner.query(sql, new ScalarHandler());
    System.out.println(count);
}

2.2 MapHandler() BeanHandler() 为查询数据结果为一条数据时使用,其中MapHandler() 将结果存入Map集合中,key表示列名,value表示值
BeanHandler(E.class)查询数据为一条数据时使用并将查询结果存储到JavaBean对象中,要求列名和对象属性名一致,返回值类型为要封装进的JavaBean类

@Test
public void test05() throws SQLException {
    //2. 查询一条数据(一行数据),处理方式有两种:1. 存入Map中(MapHandler)  2. 存入JavaBean对象中(BeanHandler)

    //第一种:将查询到的一条数据存储到Map中
    String sql = "select * from user where id=?";
    QueryRunner queryRunner = new QueryRunner(JDBCUtil.getDataSource());

    Map<String, Object> map = queryRunner.query(sql, new MapHandler(), 3);
    System.out.println(map);

    //第二种:将查询到的一条数据存储到JavaBean对象中,要求是JavaBean对象的属性名和结果集的字段名保持一致
    //User user = queryRunner.query(sql, new BeanHandler<User>(User.class), 3);//里面是使用反射创建user对象,并且调用set方法设置数据

    //System.out.println(user);
}

2.3 查询多行数据 MapListHandler() 查询多条数据并将结果存储进一个List<Map<String,Object>>集合中
BeanListHandler(E.class)查询多条数据将结果存入一个List集合中 E表示一个JavaBean对象

@Test
public void test06() throws SQLException {
    //3. 查询多行数据,处理方式有种:1. 存入List<Map<String,Object>>中(MapListHandler)   2. 存入List<JavaBean>中(BeanListHandler)
    String sql = "select * from user";

    QueryRunner queryRunner = new QueryRunner(JDBCUtil.getDataSource());

    //第一种:查询到多条数据,存入List<Map<String,Object>>中
    /*List<Map<String, Object>> mapList = queryRunner.query(sql, new MapListHandler());
    System.out.println(mapList);*/

    //第二种:查询到多条数据,存入List<User>
    List<User> userList = queryRunner.query(sql, new BeanListHandler<User>(User.class));
    System.out.println(userList);
}

3.自定义DBUtils

3.1数据库元数据

1… DataBaseMetaData:通过它可以获取整体数据库的环境信息:用户名、驱动、url等等信息
2. ParameterMetaData:通过它能够获取参数信息,比如说参数个数
3. ResultSetMetaData:通过它能够获取结果集的列的信息,比如说;列数、列名等等信息

@Test
public void test08() throws SQLException {
   Connection conn = JDBCUtil.getConnection();
    //通过connection调用getMetaData方法,获取数据库元数据
    DatabaseMetaData metaData = conn.getMetaData();
    //获取用户名
    String userName = metaData.getUserName();
    System.out.println(userName);
    System.out.println(metaData.getDriverName());//获取驱动名
}

public void test09() throws SQLException {
    //介绍ParameterMetaData
    String sql = "insert into user values (null,?,?,?)";

    Connection conn = JDBCUtil.getConnection();//获取连接
    //预编译SQL语句
    PreparedStatement pstm = conn.prepareStatement(sql);

    //使用pstm获取参数元数据
    ParameterMetaData parameterMetaData = pstm.getParameterMetaData();

    //获取参数个数
    int parameterCount = parameterMetaData.getParameterCount();
    System.out.println(parameterCount);
}

public void test10() throws SQLException {
    //介绍ResultSetMetaData,结果集元数据
    String sql = "select * from user";
    Connection conn = JDBCUtil.getConnection();//获取连接
    //预编译SQL语句
    PreparedStatement pstm = conn.prepareStatement(sql);

    //预编译完SQL语句,就已经知道了结果集的列数
    ResultSetMetaData resultSetMetaData = pstm.getMetaData();

    //获取结果集的列数
    int columnCount = resultSetMetaData.getColumnCount();
    System.out.println(columnCount);

    //获取每一列的列名
    for(int i=1;i<=columnCount;i++){
        //获取每一列的列名
        String columnName = resultSetMetaData.getColumnName(i);
        System.out.println(columnName);

        String columnTypeName = resultSetMetaData.getColumnTypeName(i);
        System.out.println(columnTypeName);
    }
}

3.2编写自定义DBUtils

1.增删改功能
自定义增删改功能时需要先获取参数元素据(ParameterMetaData),参数元数据的getParameterMetaData()方法可以获取传入sql语句中的参数个数,比较sql语句中的参数个数是否与传入参数个数相同,如果相同,则一一赋值,最后执行,如果不相同则抛出异常

public class MyQueryRunner {
    private DataSource dataSource;

    public MyQueryRunner(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    /**
     *
     * @param sql 语句
     * @param params  问号处的参数
     * @return
     */
    public int update(String sql,Object... params) throws Exception {
        //1. 获取连接
        Connection conn = dataSource.getConnection();
        //2. 预编译
        PreparedStatement pstm = conn.prepareStatement(sql);
        //3. 设置参数
        //使用参数元数据,获取参数个数
        ParameterMetaData parameterMetaData = pstm.getParameterMetaData();
        int parameterCount = parameterMetaData.getParameterCount();
        //判断用户传入的参数个数,是否和我们需要的参数个数相同
        if (parameterCount == params.length) {
            //进行参数的设置
            for(int i=1;i<=params.length;i++){
                pstm.setObject(i,params[i-1]);
            }
        }else {
            throw new RuntimeException("parameter count does not match!!!");
        }
        //4. 执行SQL语句
        int i = pstm.executeUpdate();
        //5. 关闭资源
        pstm.close();
        conn.close();
        return i;
    }
}

2.查询功能

。。。欢迎补充
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!