《学习内容》:
//=======前端学习内容========
1.JS的历史
2.JS的引入方式
3.JS的运算符
4.JS的for if 语句
/*/
//========Java学习内容=========
1.直播课—-JDBC封装第二天
《代码内容》:
/* 封装ORM框架
===============================================================================================
思考One——?策略设计模式————
如果我写这个接口是为了来把数据集中的数据存储到对象中 那么——参数??——>肯定需要给我一个数据集 返回值,整个过程是需要把数据集的信息存储在对象中的 那么返回的肯定是一个对象(类型不确定) 那么—-》泛型或者Object
=================================================================================================
思考Two——那么如果设计一个可以查各种表格的数据的方法—-他的参数是什么?只有中间一块不一样,所以肯定需要传一个策略进去
返回值问题???—->因为他的类型每个表格都不一样,都不确定,那么我返回值给他一个Object类型或者泛型
/
经过上面的思路分析后,在Dao层进行了首次的优化,设计的那个方法可以查询任何表格的一条信息
//===================================================================================//
package dao;
import domain.Atm;
import orm.RowMapper;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class AtmDao {
/**
* 基本的JDBC代码来查询一条信息
**/
private String driver = "com.mysql.cj.jdbc.Driver";
private String url = "jdbc:mysql://localhost:3306/atm?serverTimezone=CST&characterEncoding=utf8";
private String user = "root";
private String password = "at123123";
/**经过我的封装后,我这个牛皮的方法可以查询任何一个表格的一条信息,参数你需要给我一个策略进去*/
private Object QueryOne(String sql,RowMapper rm,Object... objs){
Object obj = null;
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstat = conn.prepareStatement(sql);
for (int i = 0; i < objs.length; i++) {
pstat.setObject(i+1,objs[i]);
}
ResultSet rst = pstat.executeQuery();
if (rst.next()){
/**写到这里发现每次把数据库中的数据集存储的对象不一样
* 那么 用--->策略模式 给定一个接口来--->匿名内部类实现具体如何组装这个对象
* */
obj = rm.RowMapperObj(rst);
}
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}
//查询多条信息
private List<Atm> QueryList(){
Atm atm = null;
ArrayList<Atm> lists = new ArrayList<>();
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "SELECT UNAME,UPASSWORD,UBAL FROM USER";
PreparedStatement pstat = conn.prepareStatement(sql);
ResultSet rst = pstat.executeQuery();
while (rst.next()){
atm = new Atm(rst.getString("uname"),rst.getString("upassword"),rst.getFloat("ubal"));
lists.add(atm);
}
} catch (Exception e) {
e.printStackTrace();
}
return lists;
}
public static void main(String[] args) {
AtmDao atmDao = new AtmDao();
List<Atm> atms = atmDao.QueryList();
for (Atm atm:atms){
System.out.println(atm);
}
}
}
经过第一次的封装后,觉得每个表格都可以查,放在AtmDao里面不太合适,再次封装,重写了多条获取,调用
//===================================================================================//
单独写在了SqlSession类中
package orm;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class SqlSession {
private String driver = "com.mysql.cj.jdbc.Driver";
private String url = "jdbc:mysql://localhost:3306/atm?serverTimezone=CST&characterEncoding=utf8";
private String user = "root";
private String password = "at123123";
/**经过我的封装后,我这个牛皮的方法可以查询任何一个表格的多条信息,参数你需要给我一个策略进去*/
private <T> List<T> QueryAll(String sql, RowMapper rm, Object... objs){
ArrayList<T> lists = new ArrayList<>();
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstat = conn.prepareStatement(sql);
for (int i = 0; i < objs.length; i++) {
pstat.setObject(i+1,objs[i]);
}
ResultSet rst = pstat.executeQuery();
while (rst.next()){
/**写到这里发现每次把数据库中的数据集存储的对象不一样
* 那么 用--->策略模式 给定一个接口来--->匿名内部类实现具体如何组装这个对象
* */
lists.add(rm.RowMapperObj(rst));
}
} catch (Exception e) {
e.printStackTrace();
}
return lists;
}
/**这样写查询任何表格的一条信息就更简单了,直接调用上面的方法取集合的第一个索引位置**/
public <T>T QueryOne(String sql, RowMapper rm, Object... objs){
return (T)this.QueryAll(sql,rm,objs).get(0);
}
}
学习总结:
学懂的:
今天晚上的直播课比昨天晚上要复杂很多,中间自己分神了一下,到改泛型那一块有点没听明白,脑子当时有点乱,
下课后反复翻看源码,和直播回放,自己练习,发现这次的封装是用了策略设计模式和泛型,代码倒是没有多少,感觉最
妙的还是实现策略,匿名内部类那里组装对象的时候。
JS的引入,运算符,if for语句,js对比java是弱类型语言,他的语法更抽象,灵活性更高,基本前面的内容和Java差不多。
有问题的地方:
JS没有进行练习,打算前面的语法暂时没有什么可以练的,学习到函数再进行练习。
一开始改泛型类 ,返回一个T类型 返回atm的时候多态(T)atm没有看明白,这时候类型不是确定了ATM吗
,不知道为什么还得把他转成T类型,其他地方没有问题。**