1. package cn.itcast.n8;
    2. import java.util.*;
    3. import java.util.concurrent.locks.ReentrantReadWriteLock;
    4. public class TestGenericDao {
    5. public static void main(String[] args) {
    6. GenericDao dao = new GenericDaoCached();
    7. System.out.println("============> 查询");
    8. String sql = "select * from emp where empno = ?";
    9. int empno = 7369;
    10. Emp emp = dao.queryOne(Emp.class, sql, empno);
    11. System.out.println(emp);
    12. emp = dao.queryOne(Emp.class, sql, empno);
    13. System.out.println(emp);
    14. emp = dao.queryOne(Emp.class, sql, empno);
    15. System.out.println(emp);
    16. System.out.println("============> 更新");
    17. dao.update("update emp set sal = ? where empno = ?", 800, empno);
    18. emp = dao.queryOne(Emp.class, sql, empno);
    19. System.out.println(emp);
    20. }
    21. }
    22. class GenericDaoCached extends GenericDao {
    23. private GenericDao dao = new GenericDao();
    24. private Map<SqlPair, Object> map = new HashMap<>();
    25. private ReentrantReadWriteLock rw = new ReentrantReadWriteLock();
    26. @Override
    27. public <T> List<T> queryList(Class<T> beanClass, String sql, Object... args) {
    28. return dao.queryList(beanClass, sql, args);
    29. }
    30. @Override
    31. public <T> T queryOne(Class<T> beanClass, String sql, Object... args) {
    32. // 先从缓存中找,找到直接返回
    33. SqlPair key = new SqlPair(sql, args);;
    34. rw.readLock().lock();
    35. try {
    36. T value = (T) map.get(key);
    37. if(value != null) {
    38. return value;
    39. }
    40. } finally {
    41. rw.readLock().unlock();
    42. }
    43. rw.writeLock().lock();
    44. try {
    45. // 多个线程
    46. T value = (T) map.get(key);
    47. if(value == null) {
    48. // 缓存中没有,查询数据库
    49. value = dao.queryOne(beanClass, sql, args);
    50. map.put(key, value);
    51. }
    52. return value;
    53. } finally {
    54. rw.writeLock().unlock();
    55. }
    56. }
    57. @Override
    58. public int update(String sql, Object... args) {
    59. rw.writeLock().lock();
    60. try {
    61. // 先更新库
    62. int update = dao.update(sql, args);
    63. // 清空缓存
    64. map.clear();
    65. return update;
    66. } finally {
    67. rw.writeLock().unlock();
    68. }
    69. }
    70. class SqlPair {
    71. private String sql;
    72. private Object[] args;
    73. public SqlPair(String sql, Object[] args) {
    74. this.sql = sql;
    75. this.args = args;
    76. }
    77. @Override
    78. public boolean equals(Object o) {
    79. if (this == o) {
    80. return true;
    81. }
    82. if (o == null || getClass() != o.getClass()) {
    83. return false;
    84. }
    85. SqlPair sqlPair = (SqlPair) o;
    86. return Objects.equals(sql, sqlPair.sql) &&
    87. Arrays.equals(args, sqlPair.args);
    88. }
    89. @Override
    90. public int hashCode() {
    91. int result = Objects.hash(sql);
    92. result = 31 * result + Arrays.hashCode(args);
    93. return result;
    94. }
    95. }
    96. }