声明:学习内容来自尚硅谷-宋红康老师(推荐):https://www.bilibili.com/video/BV1eJ411c7rf?from=search&seid=8058522927071118751
- DAO:Data Access Object访问数据信息的类和接口,包括了对数据的CRUD(Create、Retrival、Update、Delete),而不包含任何业务相关的信息。有时也称作:BaseDAO
- 作用:为了实现功能的模块化,更有利于代码的维护和升级。

- 层次结构:

【BaseDAO.java】
| import java.lang.reflect.ParameterizedType; |
| import java.lang.reflect.Type; |
| 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; |
| |
| |
| |
| |
| |
| |
| |
| public abstract class BaseDao<T> { |
| private QueryRunner queryRunner = new QueryRunner(); |
| |
| private Class<T> type; |
| |
| |
| public BaseDao() { |
| |
| Class clazz = this.getClass(); |
| |
| |
| |
| ParameterizedType parameterizedType = (ParameterizedType) clazz.getGenericSuperclass(); |
| |
| |
| Type[] types = parameterizedType.getActualTypeArguments(); |
| |
| this.type = (Class<T>) types[0]; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| public int update(Connection conn,String sql, Object... params) { |
| int count = 0; |
| try { |
| count = queryRunner.update(conn, sql, params); |
| } catch (SQLException e) { |
| e.printStackTrace(); |
| } |
| return count; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| public T getBean(Connection conn,String sql, Object... params) { |
| T t = null; |
| try { |
| t = queryRunner.query(conn, sql, new BeanHandler<T>(type), params); |
| } catch (SQLException e) { |
| e.printStackTrace(); |
| } |
| return t; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| public List<T> getBeanList(Connection conn,String sql, Object... params) { |
| List<T> list = null; |
| try { |
| list = queryRunner.query(conn, sql, new BeanListHandler<T>(type), params); |
| } catch (SQLException e) { |
| e.printStackTrace(); |
| } |
| return list; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| public Object getValue(Connection conn,String sql, Object... params) { |
| Object count = null; |
| try { |
| |
| count = queryRunner.query(conn, sql, new ScalarHandler<>(), params); |
| } catch (SQLException e) { |
| e.printStackTrace(); |
| } |
| return count; |
| } |
| } |
【BookDAO.java】
| import java.sql.Connection; |
| import java.util.List; |
| |
| public interface BookDao { |
| |
| |
| |
| |
| |
| |
| List<Book> getBooks(Connection conn); |
| |
| |
| |
| |
| |
| |
| void saveBook(Connection conn,Book book); |
| |
| |
| |
| |
| |
| |
| void deleteBookById(Connection conn,String bookId); |
| |
| |
| |
| |
| |
| |
| |
| Book getBookById(Connection conn,String bookId); |
| |
| |
| |
| |
| |
| |
| void updateBook(Connection conn,Book book); |
| |
| |
| |
| |
| |
| |
| |
| Page<Book> getPageBooks(Connection conn,Page<Book> page); |
| |
| |
| |
| |
| |
| |
| |
| Page<Book> getPageBooksByPrice(Connection conn,Page<Book> page, double minPrice, double maxPrice); |
| |
| } |
【UserDAO.java】
| import java.sql.Connection; |
| |
| public interface UserDao { |
| |
| |
| |
| |
| |
| |
| |
| User getUser(Connection conn,User user); |
| |
| |
| |
| |
| |
| |
| |
| boolean checkUsername(Connection conn,User user); |
| |
| |
| |
| |
| |
| |
| void saveUser(Connection conn,User user); |
| } |
【BookDaoImpl.java】
| import java.sql.Connection; |
| import java.util.List; |
| |
| public class BookDaoImpl extends BaseDao<Book> implements BookDao { |
| |
| @Override |
| public List<Book> getBooks(Connection conn) { |
| |
| List<Book> beanList = null; |
| |
| String sql = "select id,title,author,price,sales,stock,img_path imgPath from books"; |
| beanList = getBeanList(conn,sql); |
| return beanList; |
| } |
| |
| @Override |
| public void saveBook(Connection conn,Book book) { |
| |
| String sql = "insert into books(title,author,price,sales,stock,img_path) values(?,?,?,?,?,?)"; |
| |
| update(conn,sql, book.getTitle(), book.getAuthor(), book.getPrice(), book.getSales(), book.getStock(),book.getImgPath()); |
| } |
| |
| @Override |
| public void deleteBookById(Connection conn,String bookId) { |
| |
| String sql = "DELETE FROM books WHERE id = ?"; |
| |
| update(conn,sql, bookId); |
| |
| } |
| |
| @Override |
| public Book getBookById(Connection conn,String bookId) { |
| |
| Book book = null; |
| |
| String sql = "select id,title,author,price,sales,stock,img_path imgPath from books where id = ?"; |
| book = getBean(conn,sql, bookId); |
| return book; |
| } |
| |
| @Override |
| public void updateBook(Connection conn,Book book) { |
| |
| String sql = "update books set title = ? , author = ? , price = ? , sales = ? , stock = ? where id = ?"; |
| |
| update(conn,sql, book.getTitle(), book.getAuthor(), book.getPrice(), book.getSales(), book.getStock(), book.getId()); |
| } |
| |
| @Override |
| public Page<Book> getPageBooks(Connection conn,Page<Book> page) { |
| |
| String sql = "select count(*) from books"; |
| |
| long totalRecord = (long) getValue(conn,sql); |
| |
| page.setTotalRecord((int) totalRecord); |
| |
| |
| String sql2 = "select id,title,author,price,sales,stock,img_path imgPath from books limit ?,?"; |
| |
| List<Book> beanList = getBeanList(conn,sql2, (page.getPageNo() - 1) * Page.PAGE_SIZE, Page.PAGE_SIZE); |
| |
| page.setList(beanList); |
| return page; |
| } |
| |
| @Override |
| public Page<Book> getPageBooksByPrice(Connection conn,Page<Book> page, double minPrice, double maxPrice) { |
| |
| String sql = "select count(*) from books where price between ? and ?"; |
| |
| long totalRecord = (long) getValue(conn,sql,minPrice,maxPrice); |
| |
| page.setTotalRecord((int) totalRecord); |
| |
| |
| String sql2 = "select id,title,author,price,sales,stock,img_path imgPath from books where price between ? and ? limit ?,?"; |
| |
| List<Book> beanList = getBeanList(conn,sql2, minPrice , maxPrice , (page.getPageNo() - 1) * Page.PAGE_SIZE, Page.PAGE_SIZE); |
| |
| page.setList(beanList); |
| |
| return page; |
| } |
| |
| } |
【UserDaoImpl.java】
| import java.sql.Connection; |
| |
| public class UserDaoImpl extends BaseDao<User> implements UserDao { |
| |
| @Override |
| public User getUser(Connection conn,User user) { |
| |
| User bean = null; |
| |
| String sql = "select id,username,password,email from users where username = ? and password = ?"; |
| bean = getBean(conn,sql, user.getUsername(), user.getPassword()); |
| return bean; |
| } |
| |
| @Override |
| public boolean checkUsername(Connection conn,User user) { |
| |
| User bean = null; |
| |
| String sql = "select id,username,password,email from users where username = ?"; |
| bean = getBean(conn,sql, user.getUsername()); |
| return bean != null; |
| } |
| |
| @Override |
| public void saveUser(Connection conn,User user) { |
| |
| String sql = "insert into users(username,password,email) values(?,?,?)"; |
| |
| update(conn,sql, user.getUsername(),user.getPassword(),user.getEmail()); |
| } |
| |
| } |
【Book.java】
| |
| |
| |
| |
| public class Book { |
| |
| private Integer id; |
| private String title; |
| private String author; |
| private double price; |
| private Integer sales; |
| private Integer stock; |
| private String imgPath = "static/img/default.jpg"; |
| |
| } |
【Page.java】
| import java.util.List; |
| |
| |
| |
| |
| public class Page<T> { |
| |
| private List<T> list; |
| public static final int PAGE_SIZE = 4; |
| private int pageNo; |
| |
| private int totalRecord; |
| |
【User.java】
| |
| |
| |
| |
| public class User { |
| |
| private Integer id; |
| private String username; |
| private String password; |
| private String email; |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步