JDBC—————————————————————————————————————————————————-
    image.png
    尚硅谷_宋红康_JDBC.pdf
    image.png
    BaseDAO

    1. /**
    2. * 定义一个用来被继承的对数据库进行基本操作的Dao
    3. *
    4. * @author HanYanBing
    5. *
    6. * @param <T>
    7. */
    8. public abstract class BaseDao<T> {
    9. private QueryRunner queryRunner = new QueryRunner();
    10. // 定义一个变量来接收泛型的类型
    11. private Class<T> type;
    12. // 获取T的Class对象,获取泛型的类型,泛型是在被子类继承时才确定
    13. public BaseDao() {
    14. // 获取子类的类型
    15. Class clazz = this.getClass();
    16. // 获取父类的类型
    17. // getGenericSuperclass()用来获取当前类的父类的类型
    18. // ParameterizedType表示的是带泛型的类型
    19. ParameterizedType parameterizedType = (ParameterizedType)
    20. clazz.getGenericSuperclass();
    21. // 获取具体的泛型类型 getActualTypeArguments获取具体的泛型的类型
    22. // 这个方法会返回一个Type的数组
    23. Type[] types = parameterizedType.getActualTypeArguments();
    24. // 获取具体的泛型的类型·
    25. this.type = (Class<T>) types[0];
    26. }
    27. /**
    28. * 通用的增删改操作
    29. *
    30. * @param sql
    31. * @param params
    32. * @return
    33. */
    34. public int update(Connection conn,String sql, Object... params) {
    35. int count = 0;
    36. try {
    37. count = queryRunner.update(conn, sql, params);
    38. } catch (SQLException e) {
    39. e.printStackTrace();
    40. }
    41. return count;
    42. }
    43. /**
    44. * 获取一个对象
    45. *
    46. * @param sql
    47. * @param params
    48. * @return
    49. */
    50. public T getBean(Connection conn,String sql, Object... params) {
    51. T t = null;
    52. try {
    53. t = queryRunner.query(conn, sql, new BeanHandler<T>(type), params);
    54. } catch (SQLException e) {
    55. e.printStackTrace();
    56. }
    57. return t;
    58. }
    59. /**
    60. * 获取所有对象
    61. *
    62. * @param sql
    63. * @param params
    64. * @return
    65. */
    66. public List<T> getBeanList(Connection conn,String sql, Object... params) {
    67. List<T> list = null;
    68. try {
    69. list = queryRunner.query(conn, sql, new BeanListHandler<T>(type),
    70. params);
    71. } catch (SQLException e) {
    72. e.printStackTrace();
    73. }
    74. return list;
    75. }
    76. /**
    77. * 获取一个但一值得方法,专门用来执行像 select count(*)...这样的sql语句
    78. *
    79. * @param sql
    80. * @param params
    81. * @return
    82. */
    83. public Object getValue(Connection conn,String sql, Object... params) {
    84. Object count = null;
    85. try {
    86. // 调用queryRunner的query方法获取一个单一的值
    87. count = queryRunner.query(conn, sql, new ScalarHandler<>(), params);
    88. } catch (SQLException e) {
    89. e.printStackTrace();
    90. }
    91. return count;
    92. }
    93. }

    BookDAO

    1. /**
    2. * 从数据库中查询出所有的记录
    3. *
    4. * @return
    5. */
    6. List<Book> getBooks(Connection conn);
    7. /**
    8. * 向数据库中插入一条记录
    9. *
    10. * @param book
    11. */
    12. void saveBook(Connection conn,Book book);
    13. /**
    14. * 从数据库中根据图书的id删除一条记录
    15. *
    16. * @param bookId
    17. */
    18. void deleteBookById(Connection conn,String bookId);
    19. /**
    20. * 根据图书的id从数据库中查询出一条记录
    21. *
    22. * @param bookId
    23. * @return
    24. */
    25. Book getBookById(Connection conn,String bookId);
    26. /**
    27. * 根据图书的id从数据库中更新一条记录
    28. *
    29. * @param book
    30. */
    31. void updateBook(Connection conn,Book book);
    32. /**
    33. * 获取带分页的图书信息
    34. *
    35. * @param page:是只包含了用户输入的pageNo属性的page对象
    36. * @return 返回的Page对象是包含了所有属性的Page对象
    37. */
    38. Page<Book> getPageBooks(Connection conn,Page<Book> page);
    39. /**
    40. * 获取带分页和价格范围的图书信息
    41. *
    42. * @param page:是只包含了用户输入的pageNo属性的page对象
    43. * @return 返回的Page对象是包含了所有属性的Page对象
    44. */
    45. Page<Book> getPageBooksByPrice(Connection conn,Page<Book> page, double minPrice,
    46. double maxPrice);
    47. }

    UserDAO

    1. package com.atguigu.bookstore.dao;
    2. import java.sql.Connection;
    3. import com.atguigu.bookstore.beans.User;
    4. public interface UserDao {
    5. /**
    6. * 根据User对象中的用户名和密码从数据库中获取一条记录
    7. *
    8. * @param user
    9. * @return User 数据库中有记录 null 数据库中无此记录
    10. */
    11. User getUser(Connection conn,User user);
    12. /**
    13. * 根据User对象中的用户名从数据库中获取一条记录
    14. *
    15. * @param user
    16. * @return true 数据库中有记录 false 数据库中无此记录
    17. */
    18. boolean checkUsername(Connection conn,User user);
    19. /**
    20. * 向数据库中插入User对象
    21. *
    22. * @param user
    23. */
    24. void saveUser(Connection conn,User user);
    25. }

    BookDAOimpl

    1. public class BookDaoImpl extends BaseDao<Book> implements BookDao {
    2. @Override
    3. public List<Book> getBooks(Connection conn) {
    4. // 调用BaseDao中得到一个List的方法
    5. List<Book> beanList = null;
    6. // 写sql语句
    7. String sql = "select id,title,author,price,sales,stock,img_path imgPath from
    8. books";
    9. beanList = getBeanList(conn,sql);
    10. return beanList;
    11. }
    12. @Override
    13. public void saveBook(Connection conn,Book book) {
    14. // 写sql语句
    15. String sql = "insert into books(title,author,price,sales,stock,img_path)
    16. values(?,?,?,?,?,?)";
    17. // 调用BaseDao中通用的增删改的方法
    18. update(conn,sql, book.getTitle(), book.getAuthor(), book.getPrice(),
    19. book.getSales(), book.getStock(),book.getImgPath());
    20. }
    21. @Override
    22. public void deleteBookById(Connection conn,String bookId) {
    23. // 写sql语句
    24. String sql = "DELETE FROM books WHERE id = ?";
    25. // 调用BaseDao中通用增删改的方法
    26. update(conn,sql, bookId);
    27. }
    28. @Override
    29. public Book getBookById(Connection conn,String bookId) {
    30. // 调用BaseDao中获取一个对象的方法
    31. Book book = null;
    32. // 写sql语句
    33. String sql = "select id,title,author,price,sales,stock,img_path imgPath from
    34. books where id = ?";
    35. book = getBean(conn,sql, bookId);
    36. return book;
    37. }
    38. @Override
    39. public void updateBook(Connection conn,Book book) {
    40. // 写sql语句
    41. String sql = "update books set title = ? , author = ? , price = ? , sales = ?
    42. , stock = ? where id = ?";
    43. // 调用BaseDao中通用的增删改的方法
    44. update(conn,sql, book.getTitle(), book.getAuthor(), book.getPrice(),
    45. book.getSales(), book.getStock(), book.getId());
    46. }
    47. @Override
    48. public Page<Book> getPageBooks(Connection conn,Page<Book> page) {
    49. // 获取数据库中图书的总记录数
    50. String sql = "select count(*) from books";
    51. // 调用BaseDao中获取一个单一值的方法
    52. long totalRecord = (long) getValue(conn,sql);
    53. // 将总记录数设置都page对象中
    54. page.setTotalRecord((int) totalRecord);
    55. // 获取当前页中的记录存放的List
    56. String sql2 = "select id,title,author,price,sales,stock,img_path imgPath from
    57. books limit ?,?";
    58. // 调用BaseDao中获取一个集合的方法
    59. List<Book> beanList = getBeanList(conn,sql2, (page.getPageNo() - 1) *
    60. Page.PAGE_SIZE, Page.PAGE_SIZE);
    61. // 将这个List设置到page对象中
    62. page.setList(beanList);
    63. return page;
    64. }
    65. @Override
    66. public Page<Book> getPageBooksByPrice(Connection conn,Page<Book> page, double
    67. minPrice, double maxPrice) {
    68. // 获取数据库中图书的总记录数
    69. String sql = "select count(*) from books where price between ? and ?";
    70. // 调用BaseDao中获取一个单一值的方法
    71. long totalRecord = (long) getValue(conn,sql,minPrice,maxPrice);
    72. // 将总记录数设置都page对象中
    73. page.setTotalRecord((int) totalRecord);
    74. // 获取当前页中的记录存放的List
    75. String sql2 = "select id,title,author,price,sales,stock,img_path imgPath from
    76. books where price between ? and ? limit ?,?";
    77. // 调用BaseDao中获取一个集合的方法
    78. List<Book> beanList = getBeanList(conn,sql2, minPrice , maxPrice ,
    79. (page.getPageNo() - 1) * Page.PAGE_SIZE, Page.PAGE_SIZE);
    80. // 将这个List设置到page对象中
    81. page.setList(beanList);
    82. return page;
    83. }
    84. }

    UserDAOimpl

    1. public class UserDaoImpl extends BaseDao<User> implements UserDao {
    2. @Override
    3. public User getUser(Connection conn,User user) {
    4. // 调用BaseDao中获取一个对象的方法
    5. User bean = null;
    6. // 写sql语句
    7. String sql = "select id,username,password,email from users where username = ?
    8. and password = ?";
    9. bean = getBean(conn,sql, user.getUsername(), user.getPassword());
    10. return bean;
    11. }
    12. @Override
    13. public boolean checkUsername(Connection conn,User user) {
    14. // 调用BaseDao中获取一个对象的方法
    15. User bean = null;
    16. // 写sql语句
    17. String sql = "select id,username,password,email from users where username =
    18. ?";
    19. bean = getBean(conn,sql, user.getUsername());
    20. return bean != null;
    21. }
    22. @Override
    23. public void saveUser(Connection conn,User user) {
    24. //写sql语句
    25. String sql = "insert into users(username,password,email) values(?,?,?)";
    26. //调用BaseDao中通用的增删改的方法
    27. update(conn,sql, user.getUsername(),user.getPassword(),user.getEmail());
    28. }
    29. }

    image.png
    image.png
    image.png