1つのダオ設計哲学
Java言語は、データの内部データベーステーブルを操作するJDBCを使用するが、データの定期的な動作は、これらのコードの高い再現性になる場合、JDBCコードは、非常に面倒です。したがって、私たちはしばしば私たちのパッケージDAOテーブルクラスの動作に関連します。これは、システムのスケーラビリティの保守性を向上させるために、コードの効率を向上させることができます。
ダオ(データアクセスオブジェクト)データアクセスオブジェクト。
次のコンポーネントが必要ですダオ:
1.Personクラス。Entityクラス。
A)このクラスは、一から一を持つテーブルです。
b)は、彼はフィールド(列内のテーブルを持つプロパティ)の中にあったが一から一です。
c)の私有財産は、取得およびメソッドを設定しています。および工法。
d)の直列化インターフェイスを実装します。
2.PersonDaoクラス。ダオクラス
A)法5、追加および削除。
B)ボイドINSERT(人物P)
C)ボイド削除(int型のID)
D)Vodi更新(人物P)
E)のSelectAllリスト()
selectOne間F)人(int型のID)
3.Testクラステストクラス
A)メソッド呼び出しDAO、試験のDAO方法。
ダオの役割:
1.コードの可用性向上のために
、個々のコンポーネントが複数の単一機能してみましょう2.を、単一の原則の機能を満たしています。
以下は、ダオCRUDクラスのメソッドです。
package jdb
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class PersonDao {
/*
* 到数据库表里面把p插入进去
*/
public void insert(Person p){
// System.out.println(p.getId()+"\t"+p.getName());
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try{
conn=JdbcUtils.getConnection();
//3.写sql
String sql="insert into person values(person_seq.nextval,?,?,?,?)";
//4.创建ps
ps=conn.prepareStatement(sql);
//5.给占位符赋值
ps.setString(1,p.getName());
ps.setInt(2,p.getAge());
ps.setString(3,p.getTel());
ps.setString(4,p.getAddress());
//6.执行
ps.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtils.closeAll(conn,ps,rs);
}
}
/**
* 根据id把数据库表里面对应的数据删除掉
* @param id 要删除的数据的编号
*/
public void delete(int id){
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try{
conn=JdbcUtils.getConnection();
//3.写sql
String sql="delete from person where id=?";
//4.创建ps
ps=conn.prepareStatement(sql);
//5.给占位符赋值
ps.setInt(1,id);
//6.执行
ps.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtils.closeAll(conn, ps, rs);
}
}
public void update(Person p){
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try{
conn=JdbcUtils.getConnection();
//3.写sql
String sql="update person set name=?,age=?,tel=?,address=? where id=?";
//4.创建ps
ps=conn.prepareStatement(sql);
//5.给占位符赋值
ps.setString(1,p.getName());
ps.setInt(2,p.getAge());
ps.setString(3,p.getTel());
ps.setString(4,p.getAddress());
ps.setInt(5,p.getId());
//6.执行
ps.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtils.closeAll(conn,ps,rs);
}
}
public Person selectOne(int id){
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
Person p=null;
try{
conn=JdbcUtils.getConnection();
//3.写sql
String sql="select * from person where id=?";
//4.创建ps
ps=conn.prepareStatement(sql);
//5.执行
ps.setInt(1, id);
rs=ps.executeQuery();
if(rs.next()){
//获取表中每一个字段的值
String name=rs.getString("name");
int age=rs.getInt("age");
String tel=rs.getString("tel");
String address=rs.getString("address");
//把上面这些数据封装到person对象里面
p=new Person(id,name,age,tel,address);
}
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtils.closeAll(conn,ps,rs);
}
return p;
}
/*
* 到数据库里面把所有的person实体查询出来,封装到list集合,然后返回该list集合。
*/
public List<Person> selectAll(){
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
List<Person> perList=new ArrayList<Person>();
try{
conn=JdbcUtils.getConnection();
//3.写sql
String sql="select * from person";
//4.创建ps
ps=conn.prepareStatement(sql);
//5.执行
rs=ps.executeQuery();
while(rs.next()){
//获取表中每一个字段的值
int id=rs.getInt("id");
String name=rs.getString("name");
int age=rs.getInt("age");
String tel=rs.getString("tel");
String address=rs.getString("address");
//把上面这些数据封装到person对象里面
Person p=new Person(id,name,age,tel,address);
//把person放入list集合
perList.add(p);
}
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtils.closeAll(conn,ps,rs);
}
return perList;
}
}
メイン、テストテストカテゴリ:
package jdbc;
import java.util.List;
public class Test {
public static void main(String[] args) {
//实例化对象,才能调用该类里面的方法。
PersonDao pd=new PersonDao();
/*//调用insert方法时,需要的实参
Person p=new Person(1,"zhangsan",20,"152226565","郑州市");
Person p2=new Person("lisi",20,"152226565","郑州市");
//调用pd对象的insert方法。
pd.insert(p);*/
// List<Person> perList=pd.selectAll();
// for(Person p:perList){
// System.out.println(p.getName()+"====="+p.getAge());
// }
// pd.delete(76);
// Person p=new Person(77,"wangwu",21,"152226566","郑州市");
// pd.update(p);
Person p=pd.selectOne(77);
System.out.println(p.getName()+"\t"+p.getAge());
}
}
上記のコードでの問題点:
CRUDの1.daoクラスコードの方法を繰り返すの内側に非常に高く、
各メソッドは、データベース接続を確立するために開始された。2.
エンド3.各メソッドは、リソースを解放することです。
4.私たちは、コードの重複を削除する必要があります。
ソリューション:
二つの方法DAOクラスを抽出します。
接続のgetConnection公開();
公共ボイドにcloseAll(接続コネティカット、PreparedStatementのPS、のResultSet RS);
従って、この方法は、上記の二つのCRUDコードの再利用方法缶。
:コードが改善された後、新たな問題がある
1.後期複雑なプロジェクト、複数のテーブルに対応するプロジェクトを。
2.複数のテーブルは、DAOクラスよりも持っています
。各クラスは、DAOデータベース接続を必要とし、リソースを解放3.。
4.私たちはPersonDaoへの接続およびリソースのパッケージを確立するためのコードをリリースしているので。そして、これら2つのメソッドを呼び出して、他のDAOクラスは非常に面倒です。
2 JdbcUtilsクラス
上記の問題を解決するために、我々は接続を確立し、一般的なツールクラスJdbcUtilsをパッケージ化するためにこれらの2つの方法のリソースを解放することができます。このクラスは、すべてのDAOクラスのサービスです。
getConnectionメソッドとJdbcUtilsオブジェクトを行うには何にcloseAllので。私たちは、静的メソッドとして定義されたこれらの2つの方法を置きます。この方法を使用するときに、このようなDAOクラス2、あなたはJdbcUtilsオブジェクトを作成せずに、直接呼び出すために、クラス名を使用することができます。
ダオクラスDAOを支援するためにCRUD操作、JdbcUtilsとエンティティクラスを行います。
3プロパティオブジェクトクラスどのJdbcUtilsを使用して
二つの方法から出てくることは、私たちが開発中のコードの繰り返しを減らすことができますが、今のプロジェクトでも問題ですが、ドライバをロードし、私たちが死ぬことを直接書いたものですが、これらは文字列定数である可能性が高いデータベース接続を作成することです修正しました。実際の動作環境では何のソースではありません。いいえソースはJdbcUtilsクラスを変更することはできません。
だから我々は、これらの定数は、抽出されたファイルに格納されている文字列を配置し、各時間データを読み取ることができますあなただけでは接続条件を変更するための良い解決策になることができるように、ファイルから読み込まれます。
JavaのJDKのプロパティと呼ばれるクラスがあります。
1.彼自身が、あなたがデータを保存することができ、マップのコレクションです。
2.彼は、負荷(リーダーr)を有し、この方法は、この方法は、自動的にテキストファイルにデータをロードすることができます。
3.テキストファイル内のデータを使用するには、(String)をテキストファイルにデータを取得するためのgetPropertiesを呼び出すことができます。
JdbcUtilカテゴリ:
package com.macw.util;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
/**
* @author 超伟
* @2019年5月28日 下午1:51:58
* @博客:https://blog.csdn.net/MacWx
*/
public class JdbcUtil {
public static final Properties prop = new Properties();
//把流操作提取到静态代码块里面。
static{
InputStream in = null;
//使用类加载读取jdbc.properties文件
in = JdbcUtil.class.getResourceAsStream("/jdbc.properties");
try {
//读取文件中的数据
prop.load(in);
Class.forName(prop.getProperty("DriverClassName"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}finally{
if (in!=null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
* @return Connection
*/
public static Connection getConnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection(prop.getProperty("url"),prop.getProperty("username"),prop.getProperty("password"));
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
return conn;
}
/**
*
* @param conn
* @param ps
* @param rs
*/
public static void toClose(Connection conn,PreparedStatement ps,ResultSet rs){
try {
if (rs!=null) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(ps!=null){
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (conn!=null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void toClose(Connection conn,PreparedStatement ps){
try {
if(ps!=null){
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (conn!=null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
最適化JdbcUtilsクラス
1内のsrc jdbc.propertiesでファイルを作成します。右SRCで- 「新規作成」ファイル>はjdbc.propertis
=キーの間で区切られたキーと値のペアを、書くためにこのファイルでは2を
DriverClassName=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
username=hr
password=mcw
4データベース接続プールの技術
データベース接続プールを使用する理由:
1.接続と頻繁にリリースを確立する接続は資源の無駄です。
2.接続ストレージは、誰かが使用する必要がある場合、あなたは内部からの無料接続を取得いくつかを置くことができる
データベース接続プールを使用する方法を?
C3P0、DBCP、DRUID、JDNI
DRUIDはアリが実現プーリングデータベース接続です。
1.インポートドルイド関連ジャーパッケージ
特性をプロファイリングするために使用される2ドルイド文字列定数の内部構成。
コードデータベース接続プールで使用。
a)は、データベース接続プールオブジェクトを作成します。(静的コードブロック)
B)オブジェクト・データベース接続プール内から接続を取得します。(のgetConnection())
使用後のC)は、プールデータベース接続に戻ります。(にcloseAllは())
コードの中JdbcUtilsツールを参照することができます。