A. JDBC動的問合せ
動的なクエリ:クエリ実行の種類を決定するために、ユーザによって与えられた条件に応じました。
1.1 コード
//動的問合せ
公共の一覧selectDeptByProperty(部署
部署){
接続でCONN = nullを。
PreparedStatementのpsの= nullを。
ResultSetのRS = nullを。
リスト一覧= 新しい ArrayListを<>();
してみてください {
CONN = JdbcUtil。getConnection();
文字列のSQL = genSQL(部署)。
システム。アウト .println(SQL);
PS = conn.prepareStatement(SQL)。
RS = ps.executeQuery()。
一方、(rs.next()){
部門DEPT = 新部門();
dept.setDepartmentId(rs.getInt( "DEPARTMENT_ID"));
dept.setDepartmentName(rs.getString( "DEPARTMENT_NAME"));
dept.setLocationId(rs.getInt( "location_idの"));
list.add(DEPT)。
}
} キャッチ(例外e){
e.printStackTrace();
} 最後に {
JdbcUtil。closeResource(PS、CONN、RS)。
}
戻り値のリスト。
}
//スプライシングのSQL文が実行されます
プライベート文字列genSQL(部門DEPT){
StringBufferのSB = 新しい StringBufferの( "1 = 1部門から選択*");
もし(dept.getDepartmentId()> 0){
sb.append(」およびDEPARTMENT_ID =
「).append(dept.getDepartmentId())。
}
もし(dept.getDepartmentName()!= nullを &&
dept.getDepartmentName()。長さ()> 0){
sb.append(」とDEPARTMENT_NAME =
' ").append(dept.getDepartmentName())付加("'」)。
} であれば(dept.getLocationId()> 0){
sb.append(」およびlocation_idの=
「).append(dept.getLocationId())。
}
返す sb.toStringを();
}
2. アプリケーションの階層化
2.1 アプリケーション階層とは何ですか
異なる作成することによってアプリケーション パッケージを 階層化プロジェクトには、プロジェクトは、特定の機能を実行するためのコードに応じて分割し、異なるパッケージに格納されます。
2.2 階層的な利点
図1に示すように、階層構造が複数のアプリケーション層に分割され、それぞれの層は、層の協力を通じて、問題の一部を解決します
トータルソリューションを提供しています。大きな問題はように、それぞれの層に局在し、比較的独立したサブ一連の問題に分解されます
それが効果的に単一の問題の大きさと複雑さを軽減し、複雑なシステムの実現の最初のステップは、最も重要なステップのポイントです
ソリューション。
図2に示すように、階層構造を用いて、システムのアプリケーションにおける成長の進化のための柔軟なサポートを提供し、良好なスケーラビリティを有します
グッドスケーラビリティ。既存のコードに変更を加えることなく、新しい機能を追加する場合は、ビジネス・ロジックは、上限を得ることができます
再利用。
図3に示すように、階層化アーキテクチャは、保守が容易です。システムの分解後、異なる機能が異なる層、及び層中に封入されています
層の間の結合が大幅に低減されます。そのため、コードを変更する際層、彼らは、層と層との界面をしませ含みません
他の層に深刻な影響。
2.3 3層構造
三層構造に分割されている全体のビジネスに適用されます。
- 界面層(ユーザインターフェイス層)
- ビジネスロジック層、サービス層(ビジネスロジック層)
- ダオ層データアクセス層(データアクセス層)
すなわち、レベル「高凝集および低結合」と考えオブジェクトを区別します。ソフトウェアアーキテクチャの設計では、階層構造は、構造の最も重要な種類も最も一般的です。
3. パッケージ共通BaseDao
3.1 パッケージの更新
異なるテーブルは、異なるDAO層のインタフェースを持っている、
とDAO層界面でなく、共通BaseDaoインタフェース(見ることができ、より抽象的なインタフェースBaseDao!)
basedaoインタフェースの実装クラス:
TablenameDaoインタフェースの実装クラス:
これらの3つの操作のためのテーブルにTablenameDaoImplクラス、追加および削除は、あなただけの更新方法のBaseDaoImplクラスが行うことができます呼び出すことができます!
TablenameServiceインタフェースの実装クラス:
3.2 梱包クエリ操作
3.2.1 コード
BaseDaoインタフェース
パブリックインターフェース BaseDao {
公共INTのexecuteUpdate(文字列のSQL、[] PARAMオブジェクト)。
パブリックリストの検索(文字列のSQLは、オブジェクト[] PARAM、クラス
clazz);
}
BaseDaoImplインタフェースクラス
@オーバーライド
パブリックリストの検索(文字列のSQLは、オブジェクト[] PARAM、クラス
clazz){
接続でCONN = nullを。
PreparedStatement ps =null;
ResultSet rs = null;
List list = new ArrayList<>();
try{conn = JdbcUtil.getConnection();
ps = conn.prepareStatement(sql);
//得到参数的个数
ParameterMetaData pmd = ps.getParameterMetaData();
//绑定参数
for(int i=0;i<pmd.getParameterCount();i++){
ps.setObject(i+1, param[i]);
}
//处理结果集
rs = ps.executeQuery();
//获取结果集的信息
ResultSetMetaData rsmd = rs.getMetaData();
while(rs.next()){
//完成 ORM 处理:通过 jdk 的反射
T bean =clazz.newInstance();//Departmens d = new
Department();
for(int i=0;i<rsmd.getColumnCount();i++){
//得到列名
String columnName = rsmd.getColumnName(i+1);
//获取列的值
Object value = rs.getObject(columnName);
//通过 BeanUtil 工具类将值当如到对象中
BeanUtils.setProperty(bean, columnName,
value);
}
list.add(bean);
}
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtil.closeResource(ps, conn, rs);
}
return list;
}
DepartmentDao 接口
public interface DepartmentsDao extends BaseDao {
public List selectDeptByName(String
deptName);
public void insertDept(Departments dept);
public int updateDept(Departments dept);
public int deleteDeptById(int departmentId);
public List selectDeptByLikeName(String deptName);
}DepartmentDaoImpl 接口实现类
@Override
public List selectDeptByLikeName(String deptName) {
String sql ="select * from departments where
department_name like ?";
Object[] param = new Object[]{"%"+deptName+"%"};
return this.find(sql, param, Dept.class);
}
4. JDBC 驱动加载原理
4.1创建对象的方式
4.2创建对象时三个重要的步骤
•通过类加载器加载 class
•初始化所有静态部分
•为新生对象分配内存
4.3MySQL 驱动类的实例化过程
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}