2021年9月24日


DBUtils

commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。

1.DBUtils更新操作

|-- DbUtils 关闭资源、加载驱动 |-- QueryRunner 组件的核心工具类:定义了所有的与数据库操作的方法(查询、更新) 更新方法: Int update(String sql, Object param); 执行更新带一个占位符的sql Int update(String sql, Object… params); 执行更新带多个占位符的sql Int[] batch(String sql, Object params) 批处理

查询方法: T query(String sql, ResultSetHandler<T> rsh,Object... param); 注意: 如果调用DbUtils组件的操作数据库方法,没有传入连接对象,那么在实例化QueryRunner对象的时候需要传入数据源对象: QueryRunner qr = new QueryRunner(DataSource ds);

使用步骤:

1.在src目录下创建db.properties文件

username=root
password=root
url=jdbc:mysql://localhost:3306/wyy_music?useUnicode=true&characterEncoding=UTF8
driverClassName=com.mysql.jdbc.Driver

2.创建JdbcUtil工具类

package com.qf.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.QueryRunner;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

//使用DBUtils创建工具类
public class JdbcUtil {
   //声明数据源
   private static DataSource dataSource;

   static {

       try {
           //读取jdbc.properties文件
           InputStream resourceAsStream = JdbcUtil.class.getResourceAsStream("/jdbc.properties");
           //创建Properties对象
           Properties properties = new Properties();
           //加载
           properties.load(resourceAsStream);
           //创建数据源对象
           dataSource = DruidDataSourceFactory.createDataSource(properties);

      } catch (Exception e) {
           e.printStackTrace();
      }

  }

   //获取QueryRunner对象,进行CRUD操作
   public static QueryRunner getQueryRunner(){
       return new QueryRunner(dataSource);//已经连上数据库了
  }

}

3.创建相关表数据并测试

package com.qf.dbutils;

import com.qf.utils.JdbcUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;

public class DBUtilsDemo {

   //添加
   @Test
   public void testInsert()throws Exception{
       //获取QueryRunner核心类对象
       QueryRunner queryRunner = JdbcUtil.getQueryRunner();
       //准备sql
       String sql = "insert into t_user(name,password) values(?,?)";
       //调用方法
       int i = queryRunner.update(sql, "张三", "123");

       System.out.println(i+"条数据受到了影响");
  }

   //修改
   @Test
   public void testUpdate()throws Exception{
       //获取QueryRunner核心类对象
       QueryRunner queryRunner = JdbcUtil.getQueryRunner();
       //准备sql
       String sql = "update t_user set name = ? where id = ?";
       //调用方法
       int i = queryRunner.update(sql, "李四", "4");

       System.out.println(i+"条数据受到了影响");
  }

   //删除
   @Test
   public void testDelete()throws Exception{
       //获取QueryRunner核心类对象
       QueryRunner queryRunner = JdbcUtil.getQueryRunner();
       //准备sql
       String sql = "delete from t_user where id = ?";
       //调用方法
       int i = queryRunner.update(sql,  4);

       System.out.println(i+"条数据受到了影响");
  }
   

   //批量添加
   @Test
   public void testBatchAdd()throws Exception{
       //获取QueryRunner核心类对象
       QueryRunner queryRunner = JdbcUtil.getQueryRunner();
       //准备sql
       String sql = "insert into t_user(name,password) values(?,?)";
       //调用方法
       queryRunner.batch(sql, new Object[][]{{"张三", "12345"}, {"李四", "12345"}});

  }

   //批量修改
   @Test
   public void testBatchUpdate()throws Exception{
       //获取QueryRunner核心类对象
       QueryRunner queryRunner = JdbcUtil.getQueryRunner();
       //准备sql
       String sql = "update t_user set name = ? where id = ?";
       //调用方法
       queryRunner.batch(sql, new Object[][]{{"张三三", 5}, {"李四四", 6}});

  }
}

2.DBUtils查询操作

DbUtils提供的封装结果的一些对象: BeanHandler 查询返回某一条记录,封装到对象中 BeanListHandler 查询返回所有记录,封装到对象中,再到添加到List集合中 ArrayHandler 查询返回结果的第一条记录,封装成对象,放入Object类型数组中 ArrayListHandler 查询的每一条记录都封装为对象数组,再添加到List集合中 MapHandler 查询返回结果的第一条记录封装到map集合中 MapListHandler 查询返回结果的所有记录封装为map集合,再放入List集合中 ColumnListHandler 查询返回结果为某一列结果的集合 ScalarHandler 查询返回结果为某一列的数量 (在聚合函数统计的时候用)

创建表对应的实体类

package com.qf.dbutils;

public class User {

   private Integer id;
   private String name;
   private String password;

   public Integer getId() {
       return id;
  }

   public void setId(Integer 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;
  }

   @Override
   public String toString() {
       return "User{" +
               "id=" + id +
               ", name='" + name + '\'' +
               ", password='" + password + '\'' +
               '}';
  }
}

测试

//查询操作
//查询单个
@Test
public void testQuery()throws Exception{
   //获取QueryRunner对象
   QueryRunner queryRunner = JdbcUtil.getQueryRunner();
   //准备sql
   String sql = "select id,name,password from t_user where id = ?";
   //调用方法
   User db_user = queryRunner.query(sql, new ResultSetHandler<User>() {
       @Override
       public User handle(ResultSet resultSet) throws SQLException {
           //光标向下移一行
           if(resultSet.next()){
               //封装到对象中
               User user = new User();
               user.setId( resultSet.getInt("id") );
               user.setName( resultSet.getString("name") );
               user.setPassword( resultSet.getString("password") );

               return user;
          }

           return null;
      }
  },1);//设置参数

   System.out.println(db_user);

}

//DbUtils提供的封装结果的一些方法
//BeanHandler返回单个对象
@Test
public void testBeanHandler()throws Exception{
   //获取QueryRunner对象
   QueryRunner queryRunner = JdbcUtil.getQueryRunner();
   //准备sql
   String sql = "select id,name,password from t_user where id = ?";
   //调用方法
   User user = queryRunner.query(sql, new BeanHandler<User>(User.class), 2);

   System.out.println(user);
}

//BeanListHandler返回多个对象的List集合
@Test
public void testBeanListHandler()throws Exception{
   //获取QueryRunner对象
   QueryRunner queryRunner = JdbcUtil.getQueryRunner();
   //准备sql
   String sql = "select id,name,password from t_user";
   //调用方法
   List<User> users = queryRunner.query(sql, new BeanListHandler<User>(User.class));

   System.out.println(users);
}

//ArrayHandler 查询返回结果的第一条记录,封装成对象,放入Object类型数组中
@Test
public void testArrayHandler()throws Exception{
   //获取QueryRunner对象
   QueryRunner queryRunner = JdbcUtil.getQueryRunner();
   //准备sql
   String sql = "select id,name,password from t_user";
   //调用方法
   Object[] objects = queryRunner.query(sql, new ArrayHandler());
   //遍历
   for(Object obj : objects){
       System.out.println(obj);
  }
}

//ArrayListHandler 查询的每一条记录都封装为对象数组,再添加到List集合中
@Test
public void testArrayListHandler()throws Exception{
   //获取QueryRunner对象
   QueryRunner queryRunner = JdbcUtil.getQueryRunner();
   //准备sql
   String sql = "select id,name,password from t_user";
   //调用方法
   List<Object[]> list = queryRunner.query(sql, new ArrayListHandler());
   //遍历
   for(int i = 0; i<list.size(); i++){

       for(Object obj : list.get(i)){
           System.out.println(obj);
      }

       System.out.println("-------------------");
  }

}

//MapHandler 查询返回结果的第一条记录封装到map集合中
@Test
public void testMapHandler()throws Exception{
   //获取QueryRunner对象
   QueryRunner queryRunner = JdbcUtil.getQueryRunner();
   //准备sql
   String sql = "select id,name,password from t_user";
   //调用方法
   Map<String, Object> user = queryRunner.query(sql, new MapHandler());

   System.out.println(user);
}

//MapListHandler 查询返回结果的所有记录封装为map集合,再放入List集合中
@Test
public void testMapListHandler()throws Exception{
   //获取QueryRunner对象
   QueryRunner queryRunner = JdbcUtil.getQueryRunner();
   //准备sql
   String sql = "select id,name,password from t_user";
   //调用方法
   List<Map<String, Object>> list = queryRunner.query(sql, new MapListHandler());
   //遍历
   for(Object obj : list){
       System.out.println(obj);
  }
}

//ColumnListHandler 查询返回结果为某一列结果的集合
@Test
public void testColumnListHandler()throws Exception{
   //获取QueryRunner对象
   QueryRunner queryRunner = JdbcUtil.getQueryRunner();
   //准备sql
   String sql = "select id,name,password from t_user";
   //调用方法
   //没有指定获取列的名称,默认获取第一列
   //List list = (ArrayList)queryRunner.query(sql, new ColumnListHandler());
   //指定列名获取
   List<String> names = queryRunner.query(sql, new ColumnListHandler<String>("name"));

   System.out.println(names);
}

//ScalarHandler 查询返回结果为某一列的数量 (在聚合函数统计的时候用)
@Test
public void testScalarHandler()throws Exception{
   //获取QueryRunner对象
   QueryRunner queryRunner = JdbcUtil.getQueryRunner();
   //准备sql
   String sql = "select count(id) from t_user";
   //调用方法
   Long num = (Long)queryRunner.query(sql, new ScalarHandler());

   System.out.println(num);
}


三层架构:软件设计架构

我们的开发架构一般都是基于两种形式,一种是 C/S 架构,也就是客户端/服务器,另一种是 B/S 架构,也就 是浏览器服务器。在 JavaEE 开发中,几乎全都是基于 B/S架构的开发。那么在 B/S架构中,系统标准的三层架构包括:表现层、业务层、持久层。三层架构在我们的实际开发中很多项目都是基于三层架构设计的。

1.表现层

表现层: 也就是我们常说的web层。它负责接收客户端请求,向客户端响应结果,通常客户端使用http协议请求 web 层,web 需要接收 http 请求,完成 http 响应。 表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示。 表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端。 表现层的设计一般都使用 MVC 模型。(MVC 是表现层的设计模型,和其他层没有关系)

2.业务层

也就是我们常说的 service 层。它负责业务逻辑处理,和我们开发项目的需求息息相关。web 层依赖业务层,但是业务层不依赖 web 层。 业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务一致性。(也就是我们说的,事务应该放到业务层来控制)

3.持久层

也就是我们是常说的 dao 层。负责数据持久化,包括数据层即数据库和数据访问层,数据库是对数据进 行持久化的载体,数据访问层是业务层和持久层交互的接口,业务层需要通过数据访问层将数据持久化到数据库中。通俗的讲,持久层就是和数据库交互,对数据库表进行曾删改查的。

4.总结

分层的目的是为了解耦,解耦就是为了降低代码的耦合度,方便项目后期的维护和升级。

1、视图层(web层):用于显示数据和接收用户输入的数据

2、业务逻辑层(service层):负责关键业务的处理和数据的传递

3、数据访问层(dao层):主要负责对数据库的直接访问

5.优点

1、开发人员可以只关注整个结构中的其中某一层;

2、可以很容易的用新的实现来替换原有层次的实现;

3、可以降低层与层之间的依赖;

4、有利于标准化;

5、利于各层逻辑的复用;

6、结构更加的明确;

7、在后期维护的时候,极大地降低了维护成本和维护时间;

6.框架技术实现三层

后期我们会使用SSM框架来实现三层架构,每一个层使用不同的框架技术来实现

 

 
posted @ 2021-09-24 20:41  张三疯321  阅读(66)  评论(0)    收藏  举报