關於oracle http服務與tomcat端口衝突問題
DAO設計模式
1: 爲什麼使用DAO?
a: 在涉及數據庫操作,以前一般使用jdbc,使用這種方法我們會發現代碼和html標籤同時使用,維護很困難。
b:jsp文件中不應該出現任何sql包,jsp文件側重於顯示界面的。
c:所有的數據庫操作建議使用prepareStatement。好處重在避免sql注入漏洞。
2:DAO是J2EE中的數據層操作。
3:數據庫創建腳本
--刪除表
DROP TABLE person;
--創建表
CREATE TABLE person
(
id varchar(20) not null primary key,
name varchar(20) not null,
password varchar(20) not null,
age varchar(20) not null,
email varchar(30) not null
);
--事務提交
commit;
4:如果在數據庫修改後,我們怎麼樣才能做到前臺頁面不需要太多的改變?
我們必須規定出對PERSON中的全部操作。比如增刪查改。
按照以上要求,制定出操作那張表的標準,之後只要針對不同的數據庫實現這些標準就可以了。 在java中我們可以通過接口來實現----》DAO規定的就是這些接口。
package com.nnu.djx.dao;
import com.nnu.djx.vo.*;
import java.util.*;
//規定了在此項目中操作person表的全部方法
public interface PersonDao {
/**
* 插入對象
* @throws Exception
*/
public void insert(Person person)throws Exception;
/**
* 更新對象
* @throws Exception
*/
public void update(Person person)throws Exception;
/**
* 刪除某一對象
* @param id
* @throws Exception
*
*/
public void delete(String id)throws Exception;
/**
* 按照ID查詢
* @param id
* @return
* @throws Exception
*
*/
public Person queryById(String id)throws Exception;
/**
* 查詢全部結果
* @return
* @throws Exception
*/
public List queryAll()throws Exception;
/**
* 模糊查詢
* @param code
* @return
* @throws Exception
*/
public List queryByLike(String code)throws Exception;
}
5:在DAO中操作的是對象和數據庫之間的關係。
不過此時的對象是(VO,POLO,TO)(值對象,最簡單對象,傳輸對象)
即是隻包括getter,setter方法的類。
通過VO操作DAO
Vo中的字段和表中一一對應。
package com.nnu.djx.vo;
public class Person {
private String id;
private String name;
private String password;
private int age;
private String email;
//生成getter,setter方法。
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
6: 對於定義好的接口,需要給出具體實現。對數據庫表的一切具體操作。
可以定義一個數據庫鏈接類,只負責連接。
package com.nnu.djx.dao.impl;
import java.util.List;
import com.nnu.djx.dao.*;
import com.nnu.djx.vo.Person;
public class PersonDaoImpl implements PersonDao {
public void delete(String id) throws Exception {
// TODO 自動生成方法存根
}
public void insert(Person person) throws Exception {
// TODO 自動生成方法存根
}
public List queryAll() throws Exception {
// TODO 自動生成方法存根
return null;
}
public Person queryById(String id) throws Exception {
// TODO 自動生成方法存根
return null;
}
public List queryByLike(String code) throws Exception {
// TODO 自動生成方法存根
return null;
}
public void update(Person person) throws Exception {
// TODO 自動生成方法存根
}
public PersonDaoImpl() {
// TODO 自動生成構造函數存根
}
}
具體的數據庫連接類如下:
package com.nnu.djx.dbc;
import java.sql.*;
public class DataBaseConnection {
private final String DBDRIVER ="oracle.jdbc.driver.OracleDriver";
private final String DBURL ="jdbc:oracle:thin:@localhost:1521:ora9djx";
private final String DBUSER ="system";
private final String DBPWD ="system";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rst = null;
public DataBaseConnection(){
try{
Class.forName(DBDRIVER);
this.conn = DriverManager.getConnection(DBURL,DBUSER,DBPWD);
}catch(Exception e){
e.printStackTrace();
}
}
//取得數據庫鏈接
public Connection getConnection(){
return this.conn;
}
public void closeConnection(){
try {
this.conn.close();
} catch (SQLException e) {
// TODO 自動生成 catch 塊
e.printStackTrace();
}
}
}
然後對於上面的具體實現。用prepareStatement實現。。
5:再設計一個jsp頁面用來操作數據庫,檢驗前面的代碼是否正確。
<%@page contentType="text/html;charset=GB2312"%>
<%@page import="com.nnu.djx.dao.*,com.nnu.djx.vo.*,com.nnu.djx.dao.impl.*,java.util.*,com.nnu.djx.factory.*"%>
<%
//進行插入操作
/*
Person person = new Person();
person.setId("001");
person.setName("why");
person.setPassword("123");
person.setAge(12);
person.setEmail("[email protected]");
*/
PersonDao persondao = new PersonDaoImpl();
//PersonDaoFactory.getPersonDaoInstance().queryAll();
//刪除一個用戶
try{
//persondao.insert(person);
//persondao.delete("001");
//persondao.update(person);
//全部查詢
/*
List list = persondao.queryAll();
Iterator iterator = list.iterator();
while(iterator.hasNext())
{
Person person = (Person)iterator.next();
out.print(person.getName());
}
*/
//模糊查詢
List list = persondao.queryByLike("hy");
Iterator iterator = list.iterator();
while(iterator.hasNext())
{
Person person = (Person)iterator.next();
out.print(person.getName());
}
}catch(Exception e){
}
%>
DAO使用後,我們發現前天的代碼明顯減少,而後臺比如類都增多了。
同時可以發現這樣的一個問題
PersonDao persondao = new PersonDaoImpl();
操作時必須知道子類。
如果有一天我們改變了數據庫(DB2)修改就不方便了。
應該考慮如何是前臺代碼不關後臺的變化。。
此時可以考慮工廠模式:
新建一個類工廠類PersonDaoFactory
package com.nnu.djx.factory;
import com.nnu.djx.dao.PersonDao;
import com.nnu.djx.dao.impl.PersonDaoImpl;
public class PersonDaoFactory {
public static PersonDao getPersonDaoInstance(){
return new PersonDaoImpl();
}
}
以後調用的時候就可以用
PersonDaoFactory.getPersonDaoInstance().queryAll();
而不具體涉及到類。。。
後序:
程序經過驗證完全正確,可以作爲以後數據庫學習的模板。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.