当前位置: 首页 > news >正文

【JDBC】DAO和增删改查通用方法 | 案例

九、DAO和增删改查通用方法

DAO:Data Access Object访问数据信息的类和接口,包括了对数据的CRUD(Create、Retrival、Update、Delete),而不包含任何业务相关的信息

作用:为了实现功能的模块化,更有利于代码的维护和升级。

1、DAO接口

package com.atguigu.dao;

import com.atguigu.bean.User;

public interface UserDAO {

    /**

     * 根据用户名和密码获取数据库中的记录

     *

     * @param user

     * @return User:用户名和密码正确 null:用户名或密码不正确

     */

    public User getUser(User user);

    /**

     * 根据用户名获取数据库中的记录

     *

     * @param user

     * @return true:用户名已存在, false:用户名可用

     */

    public boolean checkUserName(User user);

    /**

     * 将用户保存到数据库

     *

     * @param user

     */

    public void saveUser(User user);

}

package com.atguigu.dao;

import java.util.List;

import com.atguigu.bean.Book;

public interface BookDAO {

    /**

     * 获取所有图书的方法

     *

     * @return

     */

    public List<Book> getBooks();

    /**

     * 添加图书的方法

     *

     * @param book

     */

    public void addBook(Book book);

    /**

     * 根据图书的id删除图书的方法

     *

     * @param bookId

     */

    public void deleteBookById(String bookId);

    /**

     * 根据图书的id获取图书信息

     *

     * @param bookId

     * @return

     */

    public Book getBookById(String bookId);

    /**

     * 更新图书信息的方法

     *

     * @param book

     */

    public void updateBook(Book book);

    /**

     * 批量更新图书的库存和销量

     *

     * @param params

     */

    public void batchUpdateSalesAndStock(Object[][] params);

}

package com.atguigu.dao;

import java.util.List;

import com.atguigu.bean.Order;

public interface OrderDAO {

    /**

     * 保存订单的方法

     *

     * @param order

     */

    public void saveOrder(Order order);

    /**

     * 获取所用订单的方法

     *

     * @return

     */

    public List<Order> getOrders();

    /**

     * 获取我的订单的方法

     *

     * @param userId

     * @return

     */

    public List<Order> getMyOrders(int userId);

    /**

     * 更新订单的状态的方法,例如已发货、确认收货等

     *

     * @param orderId

     * @param state

     */

    public void updateOrderState(String orderId, int state);

}

package com.atguigu.dao;

import java.util.List;

import com.atguigu.bean.OrderItem;

public interface OrderItemDAO {

    /**

     * 根据订单号获取对应的订单项

     *

     * @param orderId

     * @return

     */

    public List<OrderItem> getOrderItemsByOrderId(String orderId);

    /**

     * 批量插入订单项的方法

     *

     * @param params

     */

    public void batchInsertOrderItems(Object[][] params);

}

2、BasicDAOImpl

package com.atguigu.dao.impl;

import java.sql.Connection;

import java.sql.SQLException;

import java.util.List;

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 com.atguigu.util.JDBCTools;

/**

 * 定义一个用来被继承的对数据库进行基本操作的Dao

 */

public class BasicDAOImpl {

    private QueryRunner queryRunner = new QueryRunner();

    /**

     * 通用的增删改操作

     *

     * @param sql

     * @param params

     * @return

     */

    public int update(String sql, Object... params) {

        // 获取连接

        Connection connection = JDBCTools.getConnection();

        int count = 0;

        try {

             count = queryRunner.update(connection, sql, params);

        } catch (SQLException e) {

             //将编译时异常转换为运行时异常向上抛

             throw new RuntimeException(e);

        }

        return count;

    }

    /**

     * 获取一个对象

     *

     * @param sql

     * @param params

     * @return

     */

    public <T> T getBean(Class<T> type,String sql, Object... params) {

        // 获取连接

        Connection connection = JDBCTools.getConnection();

        T t = null;

        try {

             t = queryRunner.query(connection, sql, new BeanHandler<T>(type), params);

        } catch (SQLException e) {

             //将编译时异常转换为运行时异常向上抛

             throw new RuntimeException(e);

        }

        return t;

    }

    /**

     * 获取所有对象

     *

     * @param sql

     * @param params

     * @return

     */

    public <T> List<T> getBeanList(Class<T> type,String sql, Object... params) {

        // 获取连接

        Connection connection = JDBCTools.getConnection();

        List<T> list = null;

        try {

             list = queryRunner.query(connection, sql, new BeanListHandler<T>(type), params);

        } catch (SQLException e) {

             //将编译时异常转换为运行时异常向上抛

             throw new RuntimeException(e);

        }

        return list;

    }

    /**

     * 获取一个单一值的方法,专门用来执行像select count(*)... 这样的sql语句

     *

     * @param sql

     * @param params

     * @return

     */

    public Object getSingleValue(String sql, Object... params) {

        // 获取连接

        Connection connection = JDBCTools.getConnection();

        Object value = null;

        try {

             value = queryRunner.query(connection, sql, new ScalarHandler(), params);

        } catch (SQLException e) {

             //将编译时异常转换为运行时异常向上抛

             throw new RuntimeException(e);

        }

        return value;

    }

    /**

     * 进行批处理的方法

     * 关于二维数组Object[][] params

     *      二维数组的第一维是sql语句要执行的次数

     *      二维数组的第二维就是每条sql语句中要填充的占位符

     *

     * @param sql

     * @param params

     */

    public void batchUpdate(String sql , Object[][] params){

        //获取连接

        Connection connection = JDBCTools.getConnection();

        try {

             queryRunner.batch(connection ,sql, params);

        } catch (SQLException e) {

             //将编译时异常转换为运行时异常向上抛

             throw new RuntimeException(e);

        }

    }

}

3、DAO实现类

package com.atguigu.dao.impl;

import com.atguigu.bean.User;

import com.atguigu.dao.UserDAO;

public class UserDAOImpl extends BasicDAOImpl implements UserDAO{

    @Override

    public User getUser(User user) {

        // 写查询数据库的sql语句

        String sql = "select id , username , password , email from users where username = ? and password = ?";

        // 调用BaseDao中的getBean方法

        User bean = getBean(User.class, sql, user.getUsername(), user.getPassword());

        return bean;

    }

    @Override

    public boolean checkUserName(User user) {

        // 写查询数据库的sql语句

        String sql = "select id , username , password , email from users where username = ?";

        // 调用BaseDao中的getBean方法

        User bean = getBean(User.class, sql, user.getUsername());

        return bean!=null;//不为空,说明已存在,返回true,如果bEan是空的,没找到,bean!=null返回false,说明不存在

    }

    @Override

    public void saveUser(User user) {

        //写添加数据到数据库的sql语句

        String sql = "insert into users(username,password,email) values(?,?,?)";

        //调用BaseDao中通用的增删改的方法

        update(sql, user.getUsername(),user.getPassword(),user.getEmail());

    }

}

十、案例:

一、向customers表中插入数据,效果如下:

请输入编号:55

请输入姓名:上官红

请输入邮箱:shangguan@126.com

请输入生日(要求按xxxx-xx-xx格式):1988-11-11

插入成功!

二、修改指定客户

请输入待修改的客户编号:3

请输入新的客户姓名:林小玲

修改成功!

三、查询所有客户信息

四、根据编号,查询客户的详细信息,效果如下:

请输入编号:1

---------------------------------------------------------------------------------

编号        姓名        邮箱        生日

1      汪峰        wf@126.com  2010-2-2

五、根据姓名,查询客户的详细信息,效果如下:

请输入姓名:王菲

---------------------------------------------------------------------------------

查无此人


http://www.mrgr.cn/news/16098.html

相关文章:

  • Python集合(set)操作:构建复杂结构的实用技巧III
  • Python知识点:如何使用Robot Framework进行自动化测试框架搭建
  • 小程序组件生命周期和获取组件实例
  • 火语言RPA流程组件介绍--浏览选择文件
  • 感染了后缀为.Wormhole勒索病毒如何应对?数据能够恢复吗?
  • 【吊打面试官系列-Redis面试题】Redis 是单进程单线程的?
  • 大数据查询优化之谓词下推 ?
  • BugKu练习记录:ok
  • NCNN入门之编译与安装
  • java虚拟机知识分享与汇总
  • 【Hexo系列】【6】NexT主题使用
  • java程序CUP持续飙高
  • 视觉辅助应用场景
  • RocketMQ学习(二)
  • 【JavaSE系列】Java概述
  • WebStorm 安装教程及免费使用或试用的方法
  • 【MySQL】用户管理
  • C++的基准测试
  • 基于Python的机器学习系列(17):梯度提升回归(Gradient Boosting Regression)
  • 如何构建基于Java SpringBoot的医疗器械管理系统?四步详解从需求分析到系统部署,集成Vue.js提升用户体验,内含MySQL数据库管理技巧。