本文主要是介绍jsp DAO连接mysql_JSP复习笔记——第10章连接数据库之DAO设计模式-堕落天使-JavaEy......,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
之前的开发可以发现以下问题:
1、 所有的JDBC代码写在JSP页面之中,维护困难
2、 JSP中不应该使用任何SQL包,即不能在JSP中直接使用java.sql.*,原因是JSP只关注于数据的显示,而不关心数据是从哪儿来,或向哪里存储
3、 所有的数据库操作代码最好使用PreparedStatement
区分:J2EE的组件层次
客户端? 表示层 ? 业务层 ? 数据层 ? 数据库
*.jsp/servlet
DAO属于J2EE数据层的操作
即:在DAO中封装一个表在一个项目中所应该具有的所有的操作
Java代码
create table person
(
id varchar(32) notnullprimary key,
name varchar(20) notnull,
password varchar(20) notnull,
age varchar(20) notnull,
email varchar(20) notnull
);create table person(id varchar(32) not null primary key,name varchar(20) not null,password varchar(20) not null,age varchar(20) not null,email varchar(20) not null);
程序在变更数据库之后,前台页面不会出现过多改变?
首先需要规定出整个模块之中对person表的全部操作:
*增加
*删除
*修改
* 按ID查询
* 查询全部
* 模糊查询
按以上要求,规定出操作此张表的标准,之后只要针对于不同的数据库实现这些标准即可
在JAVA中只有通过接口可以定义出标准 ? DAO规定的就是一个接口
插入 ? 针对对象插入
对象? VO、TO、POJO(值对象、传输对象、最根本的JAVA对象)
即:只包含属性和 setter、 getter方法的类
客户 – vo ? DAO
VO的对象与表中的字段对应
定义好接口之后,要定义出接口的具体实现类,具体实现DAO接口中对数据库表的一切操作
可以发现以下的一个重要问题:
PersonDAO dao = new PersonDAOImpl();接口直接通过其子类实例化,直接的影响就是程序在调用时必须知道具体的子类,这样会造成修改不方便
所以,必须使用工厂设计,是前台不关注于具体子类
DAO整体设计,是采用以下模式:
调用处 ? DAO工厂? 具体子类实现? 完成数据库操作
|------------------|------------VO-----------------------|
直接的好处:前台显示与后台逻辑操作分离
Java代码
packageorg.sky.darkness.factory ;
importorg.sky.darkness.dao.* ;
importorg.sky.darkness.dao.impl.* ;
publicclassDAOFactory
{
publicstaticPersonDAO getPersonDAOInstance()
{
returnnewPersonDAOImpl() ;
}
};package org.sky.darkness.factory ;import org.sky.darkness.dao.* ;import org.sky.darkness.dao.impl.* ;public class DAOFactory{public static PersonDAO getPersonDAOInstance(){return new PersonDAOImpl() ;}};
--PersonDAO.java
Java代码
packageorg.sky.darkness.dao ;
importjava.util.* ;
importorg.sky.darkness.vo.* ;
// 规定出了操作person表在此项目里的全部方法
publicinterfacePersonDAO
{
// 增加操作
publicvoidinsert(Person person)throwsException ;
// 修改操作
publicvoidupdate(Person person)throwsException ;
// 删除操作
publicvoiddelete(String id)throwsException ;
// 按ID查询操作
publicPerson queryById(String id)throwsException ;
// 查询全部
publicList queryAll()throwsException ;
// 模糊查询
publicList queryByLike(String cond)throwsException ;
}package org.sky.darkness.dao ;import java.util.* ;import org.sky.darkness.vo.* ;// 规定出了操作person表在此项目里的全部方法public interface PersonDAO{// 增加操作public void insert(Person person) throws Exception ;// 修改操作public void update(Person person) throws Exception ;// 删除操作public void delete(String id) throws Exception ;// 按ID查询操作public Person queryById(String id) throws Exception ;// 查询全部public List queryAll() throws Exception ;// 模糊查询public List queryByLike(String cond) throws Exception ;}
Java代码
packageorg.sky.darkness.vo ;
// 值对象,包含属性,setter,getter方法
publicclassPerson
{
privateString id ;
privateString name ;
privateString password ;
privateintage ;
privateString email ;
// 生成getter、setter方法
publicvoidsetId(String id)
{
this.id = id ;
}
publicvoidsetName(String name)
{
this.name = name ;
}
publicvoidsetPassword(String password)
{
this.password = password ;
}
publicvoidsetAge(intage)
{
this.age = age ;
}
publicvoidsetEmail(String email)
{
this.email = email ;
}
publicString getId()
{
returnthis.id ;
}
publicString getName()
{
returnthis.name ;
}
publicString getPassword()
{
returnthis.password ;
}
publicintgetAge()
{
returnthis.age ;
}
publicString getEmail()
{
returnthis.email ;
}
};package org.sky.darkness.vo ;// 值对象,包含属性,setter,getter方法public class Person{private String id ;private String name ;private String password ;private int age ;private String email ;// 生成getter、setter方法public void setId(String id){this.id = id ;}public void setName(String name){this.name = name ;}public void setPassword(String password){this.password = password ;}public void setAge(int age){this.age = age ;}public void setEmail(String email){this.email = email ;}public String getId(){return this.id ;}public String getName(){return this.name ;}public String getPassword(){return this.password ;}public int getAge(){return this.age ;}public String getEmail(){return this.email ;}};
Java代码
packageorg.sky.darkness.dao.impl ;
importjava.sql.* ;
importjava.util.* ;
importorg.sky.darkness.vo.* ;
importorg.sky.darkness.dbc.* ;
importorg.sky.darkness.dao.* ;
// 此类需要完成具体的数据库操作,需要JDBC代码
publicclassPersonDAOImplimplementsPersonDAO
{
// 增加操作
publicvoidinsert(Person person)throwsException
{
String sql ="INSERT INTO person (id,name,password,age,email) VALUES (?,?,?,?,?)";
PreparedStatement pstmt =null;
DataBaseConnection dbc =null;
// 下面是针对数据库的具体操作
try
{
// 连接数据库
dbc =newDataBaseConnection() ;
pstmt = dbc.getConnection().prepareStatement(sql) ;
pstmt.setString(1,person.getId()) ;
pstmt.setString(2,person.getName()) ;
pstmt.setString(3,person.getPassword()) ;
pstmt.setInt(4,person.getAge()) ;
pstmt.setString(5,person.getEmail()) ;
// 进行数据库更新操作
pstmt.executeUpdate() ;
pstmt.close() ;
}
catch(Exception e)
{
thrownewException("操作出现异常") ;
}
finally
{
// 关闭数据库连接
dbc.close() ;
}
}
// 修改操作
publicvoidupdate(Person person)throwsException
{
String sql ="UPDATE person SET name=?,password=?,age=?,email=? WHERE id=?";
PreparedStatement pstmt =null;
DataBaseConnection dbc =null;
// 下面是针对数据库的具体操作
try
{
// 连接数据库
dbc =newDataBaseConnection() ;
pstmt = dbc.getConnection().prepareStatement(sql) ;
pstmt.setString(1,person.getName()) ;
pstmt.setString(2,person.getPassword()) ;
pstmt.setInt(3,person.getAge()) ;
pstmt.setString(4,person.getEmail()) ;
pstmt.setString(5,person.getId()) ;
// 进行数据库更新操作
pstmt.executeUpdate() ;
pstmt.close() ;
}
catch(Exception e)
{
thrownewException("操作出现异常") ;
}
finally
{
// 关闭数据库连接
dbc.close() ;
}
}
// 删除操作
publicvoiddelete(String id)throwsException
{
String sql ="DELETE FROM person WHERE id=?";
PreparedStatement pstmt =null;
DataBaseConnection dbc =null;
// 下面是针对数据库的具体操作
try
{
// 连接数据库
dbc =newDataBaseConnection() ;
pstmt = dbc.getConnection().prepareStatement(sql) ;
pstmt.setString(1,id) ;
// 进行数据库更新操作
pstmt.executeUpdate() ;
pstmt.close() ;
}
catch(Exception e)
{
thrownewException("操作出现异常") ;
}
finally
{
// 关闭数据库连接
dbc.close() ;
}
}
// 按ID查询操作
publicPerson queryById(String id)throwsException
{
Person person =null;
String sql ="SELECT id,name,password,age,email FROM person WHERE id=?";
PreparedStatement pstmt =null;
DataBaseConnection dbc =null;
// 下面是针对数据库的具体操作
try
{
// 连接数据库
dbc =newDataBaseConnection() ;
pstmt = dbc.getConnection().prepareStatement(sql) ;
pstmt.setString(1,id) ;
// 进行数据库查询操作
ResultSet rs = pstmt.executeQuery() ;
if(rs.next())
{
// 查询出内容,之后将查询出的内容赋值给person对象
person =newPerson() ;
person.setId(rs.getString(1)) ;
person.setName(rs.getString(2)) ;
person.setPassword(rs.getString(3)) ;
person.setAge(rs.getInt(4)) ;
person.setEmail(rs.getString(5)) ;
}
rs.close() ;
pstmt.close() ;
}
catch(Exception e)
{
thrownewException("操作出现异常") ;
}
finally
{
// 关闭数据库连接
dbc.close() ;
}
returnperson ;
}
// 查询全部
publicList queryAll()throwsException
{
List all =newArrayList() ;
String sql ="SELECT id,name,password,age,email FROM person";
PreparedStatement pstmt =null;
DataBaseConnection dbc =null;
// 下面是针对数据库的具体操作
try
{
// 连接数据库
dbc =newDataBaseConnection() ;
pstmt = dbc.getConnection().prepareStatement(sql) ;
// 进行数据库查询操作
ResultSet rs = pstmt.executeQuery() ;
while(rs.next())
{
// 查询出内容,之后将查询出的内容赋值给person对象
Person person =newPerson() ;
person.setId(rs.getString(1)) ;
person.setName(rs.getString(2)) ;
person.setPassword(rs.getString(3)) ;
person.setAge(rs.getInt(4)) ;
person.setEmail(rs.getString(5)) ;
// 将查询出来的数据加入到List对象之中
all.add(person) ;
}
rs.close() ;
pstmt.close() ;
}
catch(Exception e)
{
thrownewException("操作出现异常") ;
}
finally
{
// 关闭数据库连接
dbc.close() ;
}
returnall ;
}
// 模糊查询
publicList queryByLike(String cond)throwsException
{
List all =newArrayList() ;
String sql ="SELECT id,name,password,age,email FROM person WHERE name LIKE ? or email LIKE ?";
PreparedStatement pstmt =null;
DataBaseConnection dbc =null;
// 下面是针对数据库的具体操作
try
{
// 连接数据库
dbc =newDataBaseConnection() ;
pstmt = dbc.getConnection().prepareStatement(sql) ;
// 设置模糊查询条件
pstmt.setString(1,"%"+cond+"%") ;
pstmt.setString(2,"%"+cond+"%") ;
// 进行数据库查询操作
ResultSet rs = pstmt.executeQuery() ;
while(rs.next())
{
// 查询出内容,之后将查询出的内容赋值给person对象
Person person =newPerson() ;
person.setId(rs.getString(1)) ;
person.setName(rs.getString(2)) ;
person.setPassword(rs.getString(3)) ;
person.setAge(rs.getInt(4)) ;
person.setEmail(rs.getString(5)) ;
// 将查询出来的数据加入到List对象之中
all.add(person) ;
}
rs.close() ;
pstmt.close() ;
}
catch(Exception e)
{
thrownewException("操作出现异常") ;
}
finally
{
// 关闭数据库连接
dbc.close() ;
}
returnall ;
}
};package org.sky.darkness.dao.impl ;import java.sql.* ;import java.util.* ;import org.sky.darkness.vo.* ;import org.sky.darkness.dbc.* ;import org.sky.darkness.dao.* ;// 此类需要完成具体的数据库操作,需要JDBC代码public class PersonDAOImpl implements PersonDAO{// 增加操作public void insert(Person person) throws Exception{String sql = "INSERT INTO person (id,name,password,age,email) VALUES (?,?,?,?,?)" ;PreparedStatement pstmt = null ;DataBaseConnection dbc = null ;// 下面是针对数据库的具体操作try{// 连接数据库dbc = new DataBaseConnection() ;pstmt = dbc.getConnection().prepareStatement(sql) ;pstmt.setString(1,person.getId()) ;pstmt.setString(2,person.getName()) ;pstmt.setString(3,person.getPassword()) ;pstmt.setInt(4,person.getAge()) ;pstmt.setString(5,person.getEmail()) ;// 进行数据库更新操作pstmt.executeUpdate() ;pstmt.close() ;}catch (Exception e){throw new Exception("操作出现异常") ;}finally{// 关闭数据库连接dbc.close() ;}}// 修改操作public void update(Person person) throws Exception{String sql = "UPDATE person SET name=?,password=?,age=?,email=? WHERE id=?" ;PreparedStatement pstmt = null ;DataBaseConnection dbc = null ;// 下面是针对数据库的具体操作try{// 连接数据库dbc = new DataBaseConnection() ;pstmt = dbc.getConnection().prepareStatement(sql) ;pstmt.setString(1,person.getName()) ;pstmt.setString(2,person.getPassword()) ;pstmt.setInt(3,person.getAge()) ;pstmt.setString(4,person.getEmail()) ;pstmt.setString(5,person.getId()) ;// 进行数据库更新操作pstmt.executeUpdate() ;pstmt.close() ;}catch (Exception e){throw new Exception("操作出现异常") ;}finally{// 关闭数据库连接dbc.close() ;}}// 删除操作public void delete(String id) throws Exception{String sql = "DELETE FROM person WHERE id=?" ;PreparedStatement pstmt = null ;DataBaseConnection dbc = null ;// 下面是针对数据库的具体操作try{// 连接数据库dbc = new DataBaseConnection() ;pstmt = dbc.getConnection().prepareStatement(sql) ;pstmt.setString(1,id) ;// 进行数据库更新操作pstmt.executeUpdate() ;pstmt.close() ;}catch (Exception e){throw new Exception("操作出现异常") ;}finally{// 关闭数据库连接dbc.close() ;}}// 按ID查询操作public Person queryById(String id) throws Exception{Person person = null ;String sql = "SELECT id,name,password,age,email FROM person WHERE id=?" ;PreparedStatement pstmt = null ;DataBaseConnection dbc = null ;// 下面是针对数据库的具体操作try{// 连接数据库dbc = new DataBaseConnection() ;pstmt = dbc.getConnection().prepareStatement(sql) ;pstmt.setString(1,id) ;// 进行数据库查询操作ResultSet rs = pstmt.executeQuery() ;if(rs.next()){// 查询出内容,之后将查询出的内容赋值给person对象person = new Person() ;person.setId(rs.getString(1)) ;person.setName(rs.getString(2)) ;person.setPassword(rs.getString(3)) ;person.setAge(rs.getInt(4)) ;person.setEmail(rs.getString(5)) ;}rs.close() ;pstmt.close() ;}catch (Exception e){throw new Exception("操作出现异常") ;}finally{// 关闭数据库连接dbc.close() ;}return person ;}// 查询全部public List queryAll() throws Exception{List all = new ArrayList() ;String sql = "SELECT id,name,password,age,email FROM person" ;PreparedStatement pstmt = null ;DataBaseConnection dbc = null ;// 下面是针对数据库的具体操作try{// 连接数据库dbc = new DataBaseConnection() ;pstmt = dbc.getConnection().prepareStatement(sql) ;// 进行数据库查询操作ResultSet rs = pstmt.executeQuery() ;while(rs.next()){// 查询出内容,之后将查询出的内容赋值给person对象Person person = new Person() ;person.setId(rs.getString(1)) ;person.setName(rs.getString(2)) ;person.setPassword(rs.getString(3)) ;person.setAge(rs.getInt(4)) ;person.setEmail(rs.getString(5)) ;// 将查询出来的数据加入到List对象之中all.add(person) ;}rs.close() ;pstmt.close() ;}catch (Exception e){throw new Exception("操作出现异常") ;}finally{// 关闭数据库连接dbc.close() ;}return all ;}// 模糊查询public List queryByLike(String cond) throws Exception{List all = new ArrayList() ;String sql = "SELECT id,name,password,age,email FROM person WHERE name LIKE ? or email LIKE ?" ;PreparedStatement pstmt = null ;DataBaseConnection dbc = null ;// 下面是针对数据库的具体操作try{// 连接数据库dbc = new DataBaseConnection() ;pstmt = dbc.getConnection().prepareStatement(sql) ;// 设置模糊查询条件pstmt.setString(1,"%"+cond+"%") ;pstmt.setString(2,"%"+cond+"%") ;// 进行数据库查询操作ResultSet rs = pstmt.executeQuery() ;while(rs.next()){// 查询出内容,之后将查询出的内容赋值给person对象Person person = new Person() ;person.setId(rs.getString(1)) ;person.setName(rs.getString(2)) ;person.setPassword(rs.getString(3)) ;person.setAge(rs.getInt(4)) ;person.setEmail(rs.getString(5)) ;// 将查询出来的数据加入到List对象之中all.add(person) ;}rs.close() ;pstmt.close() ;}catch (Exception e){throw new Exception("操作出现异常") ;}finally{// 关闭数据库连接dbc.close() ;}return all ;}};
定义一个数据库连接类,她只负责数据库的连接:
Java代码
packageorg.sky.darkness.dbc ;
importjava.sql.* ;
// 主要功能就是连接数据库、关闭数据库
publicclassDataBaseConnection
{
privatefinalString DBDRIVER ="oracle.jdbc.driver.OracleDriver";
privatefinalString DBURL ="jdbc:oracle:thin:@localhost:1521:SKY";
privatefinalString DBUSER ="scott";
privatefinalString DBPASSWORD ="darkness";
privateConnection conn =null;
publicDataBaseConnection()
{
try
{
Class.forName(DBDRIVER) ;
this.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ;
}
catch(Exception e)
{
}
}
// 取得数据库连接
publicConnection getConnection()
{
returnthis.conn ;
}
// 关闭数据库连接
publicvoidclose()
{
try
{
this.conn.close() ;
}
catch(Exception e)
{
}
}
};
这篇关于jsp DAO连接mysql_JSP复习笔记——第10章连接数据库之DAO设计模式-堕落天使-JavaEy......的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!