《学习内容》:
    //=======前端学习内容========
    1.JS的历史
    2.JS的引入方式
    3.JS的运算符
    4.JS的for if 语句
    /*/
    //========Java学习内容=========
    1.直播课—-JDBC封装第二天

    《代码内容》:
    /* 封装ORM框架
    ===============================================================================================
    思考One——?策略设计模式————
    如果我写这个接口是为了来把数据集中的数据存储到对象中 那么——参数??——>肯定需要给我一个数据集 返回值,整个过程是需要把数据集的信息存储在对象中的 那么返回的肯定是一个对象(类型不确定) 那么—-》泛型或者Object
    =================================================================================================
    思考Two——那么如果设计一个可以查各种表格的数据的方法—-他的参数是什么?只有中间一块不一样,所以肯定需要传一个策略进去
    返回值问题???—->因为他的类型每个表格都不一样,都不确定,那么我返回值给他一个Object类型或者泛型
    /

    经过上面的思路分析后,在Dao层进行了首次的优化,设计的那个方法可以查询任何表格的一条信息
    //===================================================================================//

    1. package dao;
    2. import domain.Atm;
    3. import orm.RowMapper;
    4. import java.sql.Connection;
    5. import java.sql.DriverManager;
    6. import java.sql.PreparedStatement;
    7. import java.sql.ResultSet;
    8. import java.util.ArrayList;
    9. import java.util.List;
    10. public class AtmDao {
    11. /**
    12. * 基本的JDBC代码来查询一条信息
    13. **/
    14. private String driver = "com.mysql.cj.jdbc.Driver";
    15. private String url = "jdbc:mysql://localhost:3306/atm?serverTimezone=CST&characterEncoding=utf8";
    16. private String user = "root";
    17. private String password = "at123123";
    18. /**经过我的封装后,我这个牛皮的方法可以查询任何一个表格的一条信息,参数你需要给我一个策略进去*/
    19. private Object QueryOne(String sql,RowMapper rm,Object... objs){
    20. Object obj = null;
    21. try {
    22. Class.forName(driver);
    23. Connection conn = DriverManager.getConnection(url, user, password);
    24. PreparedStatement pstat = conn.prepareStatement(sql);
    25. for (int i = 0; i < objs.length; i++) {
    26. pstat.setObject(i+1,objs[i]);
    27. }
    28. ResultSet rst = pstat.executeQuery();
    29. if (rst.next()){
    30. /**写到这里发现每次把数据库中的数据集存储的对象不一样
    31. * 那么 用--->策略模式 给定一个接口来--->匿名内部类实现具体如何组装这个对象
    32. * */
    33. obj = rm.RowMapperObj(rst);
    34. }
    35. } catch (Exception e) {
    36. e.printStackTrace();
    37. }
    38. return obj;
    39. }
    40. //查询多条信息
    41. private List<Atm> QueryList(){
    42. Atm atm = null;
    43. ArrayList<Atm> lists = new ArrayList<>();
    44. try {
    45. Class.forName(driver);
    46. Connection conn = DriverManager.getConnection(url, user, password);
    47. String sql = "SELECT UNAME,UPASSWORD,UBAL FROM USER";
    48. PreparedStatement pstat = conn.prepareStatement(sql);
    49. ResultSet rst = pstat.executeQuery();
    50. while (rst.next()){
    51. atm = new Atm(rst.getString("uname"),rst.getString("upassword"),rst.getFloat("ubal"));
    52. lists.add(atm);
    53. }
    54. } catch (Exception e) {
    55. e.printStackTrace();
    56. }
    57. return lists;
    58. }
    59. public static void main(String[] args) {
    60. AtmDao atmDao = new AtmDao();
    61. List<Atm> atms = atmDao.QueryList();
    62. for (Atm atm:atms){
    63. System.out.println(atm);
    64. }
    65. }
    66. }

    经过第一次的封装后,觉得每个表格都可以查,放在AtmDao里面不太合适,再次封装,重写了多条获取,调用
    //===================================================================================//
    单独写在了SqlSession类中

    1. package orm;
    2. import java.sql.Connection;
    3. import java.sql.DriverManager;
    4. import java.sql.PreparedStatement;
    5. import java.sql.ResultSet;
    6. import java.util.ArrayList;
    7. import java.util.List;
    8. public class SqlSession {
    9. private String driver = "com.mysql.cj.jdbc.Driver";
    10. private String url = "jdbc:mysql://localhost:3306/atm?serverTimezone=CST&characterEncoding=utf8";
    11. private String user = "root";
    12. private String password = "at123123";
    13. /**经过我的封装后,我这个牛皮的方法可以查询任何一个表格的多条信息,参数你需要给我一个策略进去*/
    14. private <T> List<T> QueryAll(String sql, RowMapper rm, Object... objs){
    15. ArrayList<T> lists = new ArrayList<>();
    16. try {
    17. Class.forName(driver);
    18. Connection conn = DriverManager.getConnection(url, user, password);
    19. PreparedStatement pstat = conn.prepareStatement(sql);
    20. for (int i = 0; i < objs.length; i++) {
    21. pstat.setObject(i+1,objs[i]);
    22. }
    23. ResultSet rst = pstat.executeQuery();
    24. while (rst.next()){
    25. /**写到这里发现每次把数据库中的数据集存储的对象不一样
    26. * 那么 用--->策略模式 给定一个接口来--->匿名内部类实现具体如何组装这个对象
    27. * */
    28. lists.add(rm.RowMapperObj(rst));
    29. }
    30. } catch (Exception e) {
    31. e.printStackTrace();
    32. }
    33. return lists;
    34. }
    35. /**这样写查询任何表格的一条信息就更简单了,直接调用上面的方法取集合的第一个索引位置**/
    36. public <T>T QueryOne(String sql, RowMapper rm, Object... objs){
    37. return (T)this.QueryAll(sql,rm,objs).get(0);
    38. }
    39. }

    学习总结:
    学懂的:
    今天晚上的直播课比昨天晚上要复杂很多,中间自己分神了一下,到改泛型那一块有点没听明白,脑子当时有点乱,
    下课后反复翻看源码,和直播回放,自己练习,发现这次的封装是用了策略设计模式和泛型,代码倒是没有多少,感觉最
    妙的还是实现策略,匿名内部类那里组装对象的时候。
    JS的引入,运算符,if for语句,js对比java是弱类型语言,他的语法更抽象,灵活性更高,基本前面的内容和Java差不多。
    有问题的地方:
    JS没有进行练习,打算前面的语法暂时没有什么可以练的,学习到函数再进行练习。
    一开始改泛型类 ,返回一个T类型 返回atm的时候多态(T)atm没有看明白,这时候类型不是确定了ATM吗
    ,不知道为什么还得把他转成T类型,其他地方没有问题。**