Java Web、DAO设计模式(访问Mysql数据库)
一、DAO设计模式
1.什么是DAO?
DAO模式提供了访问关系型数据系统所需操作的接口,将数据访问和业务逻辑分开,对上层提供面向对象的数据访问接口.
2.使用Dao模式的好处
在编写了dao模式以后,就使得代码变得模块化,更有利于代码的维护和升级。
DAO模式实现两层分离:代码间分工明确,数据访问层代码不影响业务逻辑层代码,这也符合单一职能原则,降低了耦合度,提高了代码的可复用性。
隔离了不同的数据库的实现,采用面向接口编程,如果底层数据变化了,如mysql变成了oracle。中需要增加DAO接口的实现类即可,原来的Mysql实现类不用修改,这符合开闭原则,降低耦合性,提高扩展性和移植性.
3.DAO模式主要组成部分
(1)DAO接口:把对数据库的所有操作定义为抽象方法,放在接口里面,可以提供多种实现
(2)DAO实现类:针对不同的数据库给出不同的DAO接口定义的方法的实现(不同的实现类)
(3)实体类:用于存放传送的对象数据,就直接传递对象就可以,不用传递很多参数
例如:
(1)DAO接口:
具体代码:
public interface BaseDAO {
void getConn(String driver,String url,String user,String pwd);
void query(String sql,String... params);
boolean update(String sql,String... params);
void close();
}
(2)DAO实现类:
具体代码如下:
public class BaseDAOImpl implements BaseDAO {
private Connection conn;
private PreparedStatement pst;
private ResultSet rs;
public ResultSet getRs() {
return rs;
}
@Override
public void getConn(String driver, String url, String user, String pwd) {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
conn = DriverManager.getConnection(url,user,pwd);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void query(String sql, String... params) {
try {
pst=conn.prepareStatement(sql);
for (int i = 0; params!=null&&i < params.length; i++) {
pst.setObject(i + 1, params[i]);
}
rs=pst.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public boolean update(String sql, String... params) {
int num=0;
try {
pst=conn.prepareStatement(sql);
for (int i = 0; params!=null&&i < params.length; i++) {
pst.setObject(i + 1, params[i]);
}
num=pst.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return num>0;
}
@Override
public void close() {
try {
if (rs!=null)
rs.close();
if (pst!=null)
pst.close();
if (conn!=null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
(3)实体类:
具体代码:
public class StudentDAO extends BaseDAOImpl {
//假装这里已经做了接口
private final String DRIVER="com.mysql.jdbc.Driver";
private final String URL="jdbc:mysql://192.168.21.2:3306/test";
public Student getStudentById(String id){
String sql = "select * from student where stu_id=?";
getConn(DRIVER,URL,"root","ok");
query(sql,id);
ResultSet rs = getRs();
//Data Access Object
Student s = new Student();
try {
if (rs.next()) {
s.setStu_id(rs.getInt("Stu_id"));
s.setStu_name(rs.getString("Stu_name"));
s.setGrade_id(rs.getInt("grade_id"));
s.setGender(rs.getString("gender"));
s.setAddress(rs.getString("address"));
s.setPhone(rs.getString("phone"));
s.setIdCard(rs.getString("idCard"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
close();
}
return s;
}
// public boolean setStudentINfo(String Stu_id,String Stu_name,String gender){
// String sql="insert into student(Stu_id,Stu_name,gender) values(?,?,?)";
// getConn(DRIVER,URL,"root","ok");
// return update(sql,Stu_id,Stu_name,gender);
// }
//
//
// public static void main(String[] args) {
// StudentDAO dao = new StudentDAO();
Student student = dao.getStudentById();
System.out.println(student);
// Boolean s = dao.setStudentINfo("15","yy","女");
// System.out.println(s);
// System.out.println(dao.getStudentById("15"));
//
// }
二、单例模式:懒汉式 饿汉式
单件模式用途:
单件模式属于工厂模式的特例,只是它不需要输入参数并且始终返回同一对象的引用。
单件模式能够保证某一类型对象在系统中的唯一性,即某类在系统中只有一个实例。
1、饿汉式:在程序启动或单件模式类被加载的时候,单件模式实例就已经被创建。
2、懒汉式:当程序第一次访问单件模式实例时才进行创建。
三、为什么要使用配置文件来保存数据库连接信息
在开发或部署项目时会用到不同的数据库,也可能因为客户的需求更换数据库,若每次更改数据库需要重新修改代码会比较麻烦,那么将数据库信息写在配置文件中,会比较便捷
四、javaBean是什么,如何使用javaBean传递数据
Javabean 就是一个类,这个类就定义一系列 get 和 set 方法。 So simple !
Javabean 就是为了和 jsp 页面 传数据 化简 交互过程 而产生的。
五、Servlet
5.1 Servlet是什么?什么时候用?
Servlet是什么?
servlet本身不做任何业务处理,只是接收请求并决定调用哪个JavaBean去处理请求确定用哪个页面来显示处理返回的数据
Servlet是什么?
Server+Applet,是—种服务器端的Java应用程序
只有当一个服务器端的程序使用了Servlet API的时候,这个服务端的程序才能称之为Servlet
5.2 web.xml是什么?
一般的web工程中都会用到web.xml,web.xml主要用来配置,可以方便的开发web工程。web.xml主要用来配置Filter、Listener、Servlet等。但是要说明的是web.xml并不是必须的,一个web工程可以没有web.xml文件。
5.3 web.xml 用来配置Servlet中的标签介绍
></servlet> 用来声明一个servlet的数据,主要有以下子元素:
<servlet-name></servlet-name> 指定servlet的名称
<servlet-class></servlet-class> 指定servlet的类名称
<jsp-file></jsp-file> 指定web站台中的某个JSP网页的完整路径
<init-param></init-param> 用来定义参数,可有多个init-param。在servlet类中通过getInitParamenter(String name)方法访问初始化参数
<load-on-startup></load-on-startup>指定当Web应用启动时,装载Servlet的次序。当值为正数或零时:Servlet容器先加载数值小的servlet,再依次加载其他数值大的servlet。当值为负或未定义:Servlet容器将在Web客户首次访问这个servlet时加载它。
<servlet-mapping></servlet-mapping> 用来定义servlet所对应的URL,包含两个子元素
<servlet-name></servlet-name> 指定servlet的名称
<url-pattern></url-pattern> 指定servlet所对应的URL
五、实例1:DAO设计模式demo – 使用‘数据库连接类’连接MySql数据库并实现在网页上注册用户(即添加用户到数据库)
实现效果:用户在页面注册一条信息,添加用户名和密码 点击注册之后会跳转到另一个页面,提示注册成功或者失败。判断成功或者失败,是将添加的username 和 password作为更新语句的条件,用户实体类继承DAO接口实现类,根据update返回的true或者false,显示注册成功与否。
需要用到:
1.DAO接口:baseDAO
2.DAO接口实现类:baseDAOImpl
3.用户接口:UserDAO
4.用户接口实体类:UserDAOImpl
5.两个jsp文件用于网页上用户注册:
–注册页面:createLogin
–跳转反馈注册情况的页面:doLogin
具体代码如下:
(1.DAO接口) 同上
(2.DAO接口实现类)同上
(3.用户接口:UserDAO:)
public interface UserDao {
//注册
boolean createUser(String username,String password);
//登录
boolean login(String username,String password);
//展示所有用户
ArrayList<User> quryAll();
//修改密码
void changPassword(String username,String password);
//删除用户
void deleteUser(String username,String password);
}
(4.用户接口实体类:UserDAOImpl)
public class UserDaoImpl extends BaseDAOImpl implements UserDao {
private final String Driver= Prop.getValue("driver");
private final String URL= Prop.getValue("url");
private final String NAME= Prop.getValue("user");
private final String PWD= Prop.getValue("pwd");
@Override
public boolean createUser(String username, String password) {
String sql="insert into user(user_name,password) values(?,?)";
getConn(Driver, URL,NAME,PWD);
return update(sql,username,password);
}
@Override
public boolean login(String username, String password) {
return false;
}
@Override
public ArrayList<User> quryAll() {
return null;
}
@Override
public void changPassword(String username, String password) {
}
@Override
public void deleteUser(String username, String password) {
}
}
5.两个jsp文件用于网页上用户注册:
–注册页面:createLogin
–跳转反馈注册情况的页面:doLogin
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册页面</title>
</head>
<body>
<form action="doCreate.jsp">
<p>用 户 名:<input type="text" name="user"></p>
<p>密 码:<input type="password" name="pwd"></p>
<p>确认密码:<input type="password" name="cfmPwd" ></p>
<p><input type="submit" value="注册"></p>
</form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册确认</title>
</head>
<body>
<%
String username=request.getParameter("user");
String pwd=request.getParameter("pwd");
String cfmPwd=request.getParameter("cfmPwd");
UserDao ud = new UserDaoImpl();
if (pwd!=null && pwd.equals(cfmPwd)) {
boolean isSuccess = ud.createUser(username, pwd);
out.print(isSuccess?"注册成功":"注册失败");
}
%>
</body>
</html>
六、实例2 : 在实例1的基础上使用servlet,将原本写在jsp中用于请求的语句写到servlet中,使得写在jsp中的语句完全是用于进行页面展示的。
需要用到:
1.DAO接口:baseDAO
2.DAO接口实现类:baseDAOImpl
3.用户接口:UserDAO
4.用户接口实体类:UserDAOImpl
5.两个jsp文件:注册界面和跳转界面
6.UserServlet类
7.web.xml:将 UserServlet类(类名) 和 跳转页面地址 填进去
具体代码如下:
1.DAO接口:baseDAO -----同上实例1,是通用接口
2.DAO接口实现类:baseDAOImpl -----同上实例1
3.用户接口:UserDAO -----同上实例1
4.用户接口实体类:UserDAOImpl -----同上实例1
5.两个jsp文件:注册界面和跳转界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册页面</title>
</head>
<body>
<form action="/doCreate">
<p>用 户 名:<input type="text" name="user"></p>
<p>密 码:<input type="password" name="pwd"></p>
<p>确认密码:<input type="password" name="cfmPwd" ></p>
<p><input type="submit" value="注册"></p>
</form>
</body>
</html>
6.UserServlet类
public class UserServlet extends HttpServlet {
UserService service = new UserServiceLmpl();
UserDao user = new UserDaoImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name=req.getParameter("username");
String pwd =req.getParameter("pwd");
String pwd1=req.getParameter("pwd1");
String pwd2=req.getParameter("pwd2");
//################注册########################
// String cfmPwd=req.getParameter("cfmPwd");
// boolean isSuccess = service.register(name,pwd,cfmPwd);
// System.out.println(isSuccess?"注册成功":"注册失败");
//
// if(isSuccess){
// resp.sendRedirect("/login/home.jsp");
// }else {
// req.getRequestDispatcher("/login/createUser.jsp").forward(req,resp);
// }
//################登录########################
// boolean isSuccess = user.login(name,pwd);
// if(isSuccess){
//
// req.getRequestDispatcher("/login/doLogin.jsp").forward(req,resp);
// //转发
// }else {
// //重定向
// resp.sendRedirect("/login/home.jsp");
// }
//################修改密码####################
// boolean isSuccess = user.changPassword(name,pwd1,pwd2);
// if(isSuccess){
// req.getRequestDispatcher("/login/doLogin.jsp").forward(req,resp);
// //转发
// }else {
// //重定向
// resp.sendRedirect("/login/createUser.jsp");
// }
//################删除用户####################
boolean isSuccess = user.deleteUser(name,pwd);
if(isSuccess){
req.getRequestDispatcher("/login/doDelete.jsp").forward(req,resp);
//转发
}else {
//重定向
resp.sendRedirect("/login/deleteUser.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.service(req, resp);
}
}
7.web.xml:将 UserServlet类(类名) 和 跳转页面地址 填进去
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>userServlet</servlet-name>
<servlet-class>cn.kgc.kb11.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>userServlet</servlet-name>
<url-pattern>/doDelete</url-pattern>
</servlet-mapping>
</web-
七、 <总结:写一个用到 jsp、jdbc、DAO设计模式、Servlet 的JavaWeb工程的步骤>
1.DAO接口:baseDAO
2.DAO接口实现类:baseDAOImpl ---------实现操作数据库的通用步骤,以后直接调用即可
3.用户接口:UserDAO
4.用户接口实体类:UserDAOImpl ----------用户个性化需求,继承DAO接口实现类
5.两个jsp文件:注册界面和跳转界面 ----------展现给用户的界面
6.UserServlet类 ----------接收页面用户请求再去调用JavaBean,起到调度的作用
7.web.xml:将 UserServlet类(类名) 和 跳转页面地址 填进去 -----------配置servlet