• DBUtils工具的使用


      

      简单的说DBUtils就是一个工具,一个操控数据库的组件,学过JDBC的应该都知道在对数据操控的时候代码量好大,还得注意各种双引号,一不小心就错了。DBUtils就是对JDBC的一个简单封装,目的就是简化代码量。

      一般DBUtils的使用只涉及了一个QueryRunner类和它的两个方法,ResultSetHandler接口和它的两个实现类。

    • QueryRunner

      • query():提供执行查询的操作
      • update():提供执行插入、更新、删除的操作
    • ResultSetHandler

      • BeanHandler

      • BeanListHandler

    先介绍下项目结构:

    数据库名称:_11_20_test_java

    表名:test

    使用连接池:阿里巴巴的druid连接池

    下面是表创建好后的内容:

    数据库和连接池的创建就直接跳过了

    第一步是导入DBUtil工具的jar包“commons-dbutils-1.7.jar”,这个可以直接在apache官网下载

    然后创建好一个类JdbcUtil用于获取数据库的连接

    import com.alibaba.druid.pool.DruidDataSourceFactory;
    
    import javax.sql.DataSource;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    
    public class JdbcUtil {
    
        //    创建数据源对象
        private static DataSource dataSource;
    
        static {
    
    //        新建一个配置文件对象
            Properties properties = new Properties();
    
    //        通过类加载器找到文件路径,读配置文件
            InputStream inputStream = JdbcUtil.class.getResourceAsStream("druid/druid.properties");
    
    //        加载属性文件
            try {
                properties.load(inputStream);
    
    //            创建连接池对象
                dataSource = DruidDataSourceFactory.createDataSource(properties);
    
    
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
    
        }
    
    
        /*
        * 从连接池中获取连接
        * */
        public static Connection getConnect(){
            Connection con = null;
    
            try {
                con = dataSource.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            }
    
            return con;
        }
    
        public static DataSource getDataSource() {
            return dataSource;
        }
    
        public static void setDataSource(DataSource dataSource) {
            JdbcUtil.dataSource = dataSource;
        }
    
        /*
            * 关闭资源
            * */
        public static void close(Connection connection, Statement statement, ResultSet resultSet){
    
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
    
            if(statement!=null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
    
            if(resultSet!=null){
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
    
    
    
        }
    
    
    
    
    }
    

      

    因为ResultSetHandler接口是用于处理结果集的,等下通过QueryRunner查询数据时要用到,所以先记录ResultSetHandler的用法。

    ResultSetHandler接口的使用

    第一步:先创建一个类BaseDao,在这个类里面实现一个普通的通用的查询方法(等下也可以和RueryRunner类的查询方法对比下,看看哪个更简便)

    import org.apache.commons.dbutils.ResultSetHandler;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    /*
    *
    * 在该类中编写普通通用的增删改查方法
    * */
    
    public class BaseDao {
    
    
    //    编写一个通用的查询方法
        public static Object query(String sql, ResultSetHandler<?> rsh, Object... params) throws SQLException {
    
    
            Connection connection = null;
            PreparedStatement preparedStatement = null;
            ResultSet resultSet = null;
    
            try {
    
    
    //        获得连接
                connection = JdbcUtil.getConnect();
    //        预编译
                preparedStatement = connection.prepareStatement(sql);
    
    //        设置参数
                for (int i = 0; params != null && i < params.length; i++) {
    
                    preparedStatement.setObject(i + 1, params[i]);
    
                }
    
    //        执行查询
                resultSet = preparedStatement.executeQuery();
    
    //        让调用者去实现对结果集的处理
                Object obj = rsh.handle(resultSet);
    
                return obj;
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
    //            释放资源
                JdbcUtil.close(connection, preparedStatement, resultSet);
            }
            return  resultSet;
    
        }
    
    
    }
    

      

    第二步:创建一个实体类User,里面的对象对应的是数据表中的属性

    public class User {
    
        int id;
        String name;
        String password;
    
        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 getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }
    

      

    第三步:ok现在就能创建两个自定义类用于演示BeanHandler和BeanListHandler两个类对结果集的处理

    ResultSetTest类

    import org.apache.commons.dbutils.ResultSetHandler;
    import org.apache.commons.dbutils.handlers.BeanHandler;
    
    import javax.jws.soap.SOAPBinding;
    import java.sql.SQLException;
    
    /*
    *
    * 用于演示BeanHandle类对结果集的处理
    * */
    public class ResultSetTest {
    
    
       public static void testBeanHandler() throws SQLException{
           BaseDao baseDao = new BaseDao();
           String sql = "select * from test where id=?";
           User user = (User) baseDao.query(sql,new BeanHandler<Object>(User.class),3);
           System.out.println("id为1的User对象的名字是"+user.getName());
       }
    
    
    }
    

      ResultsetTest类

    import org.apache.commons.dbutils.handlers.BeanListHandler;
    
    import java.sql.SQLException;
    import java.util.ArrayList;
    
    
    /*
    *
    * 演示BeanListHandler类对结果集的处理
    * */
    public class ResultSetListTest {
    
        public static void testBeanListHandler() throws SQLException{
    
            BaseDao baseDao = new BaseDao();
            String sql = "select * from test";
    
            ArrayList<User> arrayList = (ArrayList<User>) baseDao.query(sql,new BeanListHandler<Object>(User.class));
    
            for(int i=0;i<arrayList.size();i++){
                System.out.println("第"+(i+1)+"条的数据的名字为:"+arrayList.get(i).getName());
            }
    
    
        }
    
    
    
    }
    

      

    现在就可以在一个主类里面测试下效果了

     

    ResultSetHandler接口的使用没有问题的话就可以通过使用QuerryRunner类来实现增删改查了

     

    第一步:创建一个DBUtilsDao类,实现增删改查四个方法

    import com.alibaba.druid.pool.DruidDataSource;
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    import com.sun.org.apache.xpath.internal.operations.Bool;
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanListHandler;
    
    import javax.sql.DataSource;
    import java.sql.SQLException;
    import java.util.List;
    
    /*
    * 在这个类中实现增删改查四个方法
    *
    * */
    public class DBUtilsDao {
    
    
        //实现查询方法,返回List集合
        public List findAll() throws SQLException {
    //        创建QueryRunner对象
            QueryRunner queryRunner = new QueryRunner(JdbcUtil.getDataSource());
    //        定义sql语句
            String sql = "select * from test";
            List list = (List) queryRunner.query(sql,new BeanListHandler(User.class));
    
            return list;
        }
    
        //实现添加方法
        public boolean insert(User user) throws SQLException {
    
            QueryRunner queryRunner = new QueryRunner(JdbcUtil.getDataSource());
            String sql = "insert into test(name,password) values(?,?)";
    
    //        用一个数组临时存放要添加进数据库中的数据
            Object obj[] = {user.getName(),user.getPassword()};
            int num = queryRunner.update(sql,obj);
    
    //        如果添加成功返回true,添加失败返回false;
            if(num>0){
                return true;
            }
            return  false;
    
        }
    
        //实现修改方法
        public boolean update(User user) throws SQLException {
    
            QueryRunner queryRunner = new QueryRunner(JdbcUtil.getDataSource());
            String sql = "update test set name=?,password=? where id=?";
    
            Object obj[] = {user.getName(),user.getPassword(),user.getId()};
            int num = queryRunner.update(sql,obj);
    
            if(num>0){
                return  true;
            }
            return  false;
    
        }
    
        //实现删除的方法
        public boolean delete(int id) throws SQLException {
    
            QueryRunner queryRunner = new QueryRunner(JdbcUtil.getDataSource());
            String sql = "delete from test where id=?";
    
            int num = queryRunner.update(sql,id);
    
            if(num>0){
                return true;
            }
    
            return false;
        }
    
    
    
    
    
    
    
    }
    

      

    第二步:测试DBUtilsDao类中的四个方法

    import javax.swing.text.html.HTMLDocument;
    import java.awt.*;
    import java.sql.Array;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.Iterator;
    
    public class Maiin {
    
    
        public static void main(String[] args) {
      
    
    //        插入内容----------------
            System.out.println("插入内容----------------");
            DBUtilsDao dbUtilsDao = new DBUtilsDao();
            User user = new User();
            user.setName("yyy");
            user.setPassword("99999");
    
            try {
                boolean flag = dbUtilsDao.insert(user);
                if(flag)
                    System.out.println("插入内容成功");
            } catch (SQLException e) {
                e.printStackTrace();
            }
    
    //        修改内容
            System.out.println("修改内容----------------");
            DBUtilsDao dbUtilsDao1 = new DBUtilsDao();
            User user1 = new User();
            user1.setName("qqq");
            user1.setPassword("1111");
            user1.setId(1);
            try {
                boolean flag = dbUtilsDao1.update(user1);
                if (flag)
                    System.out.println("修改内容成功");
            } catch (SQLException e) {
                e.printStackTrace();
            }
    
    //        删除内容
            System.out.println("删除内容----------------");
            DBUtilsDao dbUtilsDao2 = new DBUtilsDao();
    
            try {
                boolean flag = dbUtilsDao2.delete(2);
                if (flag)
                    System.out.println("删除内容成功");
            } catch (SQLException e) {
                e.printStackTrace();
            }
    
    
    //        查询内容
            System.out.println("查询内容----------------");
            DBUtilsDao dbUtilsDao3 = new DBUtilsDao();
    
            try {
                ArrayList list = (ArrayList) dbUtilsDao3.findAll();
                Iterator iterator = list.iterator();
                while (iterator.hasNext()){
                   User u = (User) iterator.next();
                    System.out.println("id:"+u.getId()+",姓名:"+u.getName()+"密码:"+u.getPassword());
                }
    
    
            } catch (SQLException e) {
                e.printStackTrace();
            }
    
    
        }
    
    }
    

      

    测试效果

  • 相关阅读:
    SuperSocket 1.4系列文档(16) 在SuperSocket中启用传输层加密(TLS/SSL)
    SuperSocket 1.4系列文档(10) SuperSocket中的日志功能
    UIPageControl实现自定义按钮
    ios 某些代码网址,app打包成ipa
    笔记隐藏状态栏,播放音乐,获取文件路径,nsthread,文件文件夹操作,plist 时间
    使用NSTimer实现倒计时,Iphone幻灯片效果+背景音乐,
    如何让你的iPhone程序支持多语言环境(本地化)
    iPhone电子书toolbar的实现
    iphone界面如何实现下拉列表
    使用NSTimer与iphone的简单动画,实现飘雪效果
  • 原文地址:https://www.cnblogs.com/lyd447113735/p/11920821.html
Copyright © 2020-2023  润新知