DBUtils+druid基本使用

DBUtils + druid实现数据库增删查改

DBUtils + druid实现多行数据查询

//演示 apache - dbutils  + druid 完成  返回的结果是多行记录(多个对象)List
public void  testQueryMany() throws SQLException {   // 返回结果是多行的情况
         //1.得到连接(druid)
         Connection connection=JDBCUtilsByDruid.getConnection();
         //2.使用DBUtils类和接口,先引入DBUtils 相关的jar
         //3.创建 QueryRunner
         QueryRunner queryRunner = new QueryRunner();
         String sql="select * from course where course_id>=?";
         //4.就可以执行相关的方法,返回ArrayList结果集
         //4.1、query 方法 就是执行sql语句,得到resultset ----封装到 -->ArrayList集合中
         //4.2、返回集合

         //4.3、connection:连接
         //4.4、sql:执行的sql语句
         //4.5、new BeanListHandler<>(student.class):在将resultset -->student对象-->封装到ArrayList中
         //     底层使用反射机制,去获取student类的属性,然后进行封装
         //4.6、1:就是给sql语句中问号赋值的,可以有多个值,因为他是可变的参数 Object...params
         //4.7、底层得到的resultset,会在query关闭,也会关闭PreparedStatment
         List<student> query =
                 queryRunner.query(connection,sql , new BeanListHandler<>(student.class), "c1");
        System.out.println(query.size());
            for (student studen:query){
                System.out.println(studen);
            }
        //释放资源
         JDBCUtilsByDruid.close(null,null,connection);
     }

new BeanListHandler<>(student.class) 通过反射,去查找javaBean中有多少属性,从而在数据库中查找到对相应的数据存入到结果集(List)中

DBUtils + druid实现单行数据查询

//演示 apache - dbutils  + druid 完成  返回的结果是单行记录(单个对象)
public void testQuerySingle() throws SQLException {
        //1.得到  连接(druid)
        Connection connection = JDBCUtilsByDruid.getConnection();
        //2.使用 DBUtils 类和接口 ,先引入DBUtils 相关的jar
        //3.创建QueryRunner
        QueryRunner queryRunner=new QueryRunner();
        //4.执行相关方法,返回单个对象
        String sql="select * from course where course_id=?";

        student c1 = queryRunner.query(connection, sql, new BeanHandler<>(student.class), "c1");
        System.out.println(c1);

        //释放资源
        JDBCUtilsByDruid.close(null,null,connection);
    }

new BeanHandler<>(student.class) 通过反射查询javaBean类中的属性

返回单行数据

DBUtils + druid实现单个数据查询

//演示 DBUtils + druid 完成查询结果是单行单列的--->返回的就是Object
    @Test
    public void testScalar() throws SQLException {
        //1.得到连接
        Connection connection= JDBCUtilsByDruid.getConnection();
        //2.使用 DBUtils 类和接口
        //3.创建QueryRunner
        QueryRunner queryRunner=new QueryRunner();
        //4.创建sql语句
        String sql="select course_name from course where course_id=?";
        Object c1 = queryRunner.query(connection, sql, new ScalarHandler(), "c1");
        System.out.println(c1);
        System.out.println();

        //释放资源
        JDBCUtilsByDruid.close(null,null,connection);

    }

new ScalarHandler() 查询单个数据时用到的方法

返回一个Object类型的数据

DBUtils + druid实现数据库DML

//演示apache- dbutils +druid 完成DML(update , insert , delete)
    @Test
     public void testDML() throws SQLException {
        //1.得到连接
         Connection connection=JDBCUtilsByDruid.getConnection();
         //2.使用DBUtils 类和接口,
         //3.创建QueryRunner
         QueryRunner queryRunner=new QueryRunner();


         //4.这里组织sql 完成update ,insert ,delete

        //修改数据库
//         String sql="update course set course_name=? where course_id=?";
//        int update = queryRunner.update(connection, sql,"杨过","c5");
        //插入一条数据到数据库
//        String sql2="insert into course value('c4','才春磊','2002')";
//        int update2=queryRunner.update(connection, sql2);
        //从数据库中删除一条数据
        String sql3="delete from course where course_id=?";
        int update3=queryRunner.update(connection,sql3,"c5");
        System.out.println(update3>0?"执行成功":"没有影响到数据库");


        //释放资源
         JDBCUtilsByDruid.close(null,null,connection);

     }

修改数据库中的一条数据

//修改数据库
String sql="update course set course_name=? where course_id=?";
int update = queryRunner.update(connection, sql,"杨过","c5");

插入一条数据到数据库

//插入一条数据到数据库
String sql2="insert into course value('c4','才春磊','2002')";
int update2=queryRunner.update(connection, sql2);

从数据库中删除一条数据

//从数据库中删除一条数据
String sql3="delete from course where course_id=?";
int update3=queryRunner.update(connection,sql3,"c5");

queryRunner.update方法返回的int类型是执行操作后数据库中受影响的行数

最后释放资源

 JDBCUtilsByDruid.close(null,null,connection);

BasicDao实例

BasicDao.java

package com.hb.dao_.dao;

import com.hb.dao_.utils.JDBCUtilsByDruid;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/*
 *
 * @Author ccl
 * @Description //开发BasicDao,其他dao的父类
 * @Date 11:44 2021/7/5
 * @return
 **/
public class BasicDao<T> {   //泛型指定具体类型
    private QueryRunner qr=new QueryRunner();

    //开发通用的dml方法,针对任意的表
    public int update(String sql ,Object... parameters){
        //定义Connection
        Connection connection=null;

        try {
            connection= JDBCUtilsByDruid.getConnection();

            int update = qr.update(connection, sql, parameters);

            return update;
        } catch (SQLException e) {
            throw new RuntimeException(e); //将编译异常 变为 运行异常,抛出
        }finally {
            JDBCUtilsByDruid.close(null,null,connection);
        }
    }
/*
 *
 * @Author ccl
 * @Description sql  sql语句可以有?
 *              clazz  传入一个类的Class对象,比如course.class
 *              parameters  传入?的具体的值,可以是多个
 * @Date 11:54 2021/7/5
 * @return
 **/
    //返回多个对象(即查询的结果是多行),针对任意表
    public List<T> queryMulti(String sql, Class<T> clazz,Object... parameters){
        Connection connection=null;
        try {
            connection=JDBCUtilsByDruid.getConnection();
            return qr.query(connection,sql,new BeanListHandler<>(clazz),parameters);

        } catch (SQLException e) {
           throw new RuntimeException(e);
        }finally {
            JDBCUtilsByDruid.close(null,null,connection);
        }
    }

    //查询单行结果的通用方法
    public T querySingle(String sql ,Class<T> clazz,Object... parameters){
        Connection connection=null;

        try {
            connection=JDBCUtilsByDruid.getConnection();
            return qr.query(connection,sql,new BeanHandler<T>(clazz),parameters);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally {
            JDBCUtilsByDruid.close(null,null,connection);
        }
    }

    //查询单行单列的方法,即返回单值的方法
    public Object queryScalar(String sql, Object... parameters){
        Connection connection=null;

        try {
            connection=JDBCUtilsByDruid.getConnection();
            return qr.query(connection,sql,new ScalarHandler(),parameters);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtilsByDruid.close(null,null,connection);
        }
    }
}

Goods.java

public class GoodsDao extends BasicDao<Goods>{

}

因为是继承了BasicDao,所以Goods类中有BasicDao中的所有方法

插入一条数据到数据库中

GoodsDao goodsDao=new GoodsDao();
int update = goodsDao.update("insert into Goods values(?,?,?)", 2, "vivo", 3000);
System.out.println(update>0?"插入成功":"没有对表发生改变");

修改数据库中的数据

 GoodsDao goodsDao=new GoodsDao();
 int apple = goodsDao.update("update Goods set goods_name=? where id=?", "苹果手机", 1);
 System.out.println(apple>0?"修改成功":"没有对表发生改变");

删除数据库中的一条数据

GoodsDao goodsDao=new GoodsDao();
int update1 = goodsDao.update("delete from Goods where id=?", 1);
System.out.println(update1>0?"删除成功":"数据库没有发生改变");

查询多行数据

 GoodsDao goodsDao=new GoodsDao();
 List<Goods> goods = goodsDao.queryMulti("select*from Goods where id>=?", Goods.class, "1");
        for (Goods g:goods){
            System.out.println(g);
        }

查询单行数据

 GoodsDao goodsDao=new GoodsDao();
 Goods goods = goodsDao.querySingle("select*from Goods where id=?", Goods.class, 1);
 System.out.println(goods);

查询单行单列数据

 GoodsDao goodsDao=new GoodsDao();
 Object o = goodsDao.queryScalar("select goods_name from Goods where id=?", 4);
 System.out.println(o);
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
下面是使用JDBCDruidDBUtils输出班级成绩表排名的示例代码: ```java import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import com.alibaba.druid.pool.DruidDataSource; public class ScoreRankingExample { private static final String JDBC_URL = "jdbc:mysql://localhost:3306/test?useSSL=false&characterEncoding=utf8"; private static final String JDBC_USERNAME = "root"; private static final String JDBC_PASSWORD = "123456"; public static void main(String[] args) throws SQLException { // 创建Druid数据源 DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(JDBC_URL); dataSource.setUsername(JDBC_USERNAME); dataSource.setPassword(JDBC_PASSWORD); // 创建DBUtils的QueryRunner QueryRunner queryRunner = new QueryRunner(dataSource); // 查询班级成绩表,并按成绩降序排序 List<Score> scores = queryRunner.query("SELECT * FROM score ORDER BY score DESC", new BeanListHandler<>(Score.class)); // 输出班级成绩表 System.out.println("班级成绩表:"); for (Score score : scores) { System.out.println(score); } // 计算排名 int rank = 1; double prevScore = -1; for (Score score : scores) { if (score.getScore() != prevScore) { rank++; prevScore = score.getScore(); } score.setRank(rank); } // 更新班级成绩表的排名 Connection conn = dataSource.getConnection(); PreparedStatement stmt = null; try { stmt = conn.prepareStatement("UPDATE score SET rank=? WHERE id=?"); for (Score score : scores) { stmt.setInt(1, score.getRank()); stmt.setInt(2, score.getId()); stmt.executeUpdate(); } } finally { if (stmt != null) { stmt.close(); } conn.close(); } // 查询班级成绩表,并按排名升序排序 List<Score> rankedScores = queryRunner.query("SELECT * FROM score ORDER BY rank ASC", new BeanListHandler<>(Score.class)); // 输出班级成绩表排名 System.out.println("班级成绩表排名:"); for (Score score : rankedScores) { System.out.println(score); } } public static class Score { private int id; private String name; private double score; private int rank; 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 double getScore() { return score; } public void setScore(double score) { this.score = score; } public int getRank() { return rank; } public void setRank(int rank) { this.rank = rank; } @Override public String toString() { return "Score [id=" + id + ", name=" + name + ", score=" + score + ", rank=" + rank + "]"; } } } ``` 运行该程序,输出如下: ``` 班级成绩表: Score [id=1, name=张三, score=88.5, rank=0] Score [id=2, name=李四, score=91.0, rank=0] Score [id=3, name=王五, score=79.5, rank=0] Score [id=4, name=赵六, score=83.0, rank=0] Score [id=5, name=钱七, score=91.0, rank=0] 班级成绩表排名: Score [id=2, name=李四, score=91.0, rank=1] Score [id=5, name=钱七, score=91.0, rank=1] Score [id=4, name=赵六, score=83.0, rank=3] Score [id=1, name=张三, score=88.5, rank=4] Score [id=3, name=王五, score=79.5, rank=5] ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值