JavaWeb /// JDBC连接数据库 /// DAO设计模式访问Mysql数据库 /// DAO设计模式demo /// Servlet

一、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>&nbsp;码:<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>&nbsp;码:<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

猜你喜欢

转载自blog.csdn.net/qq_42005540/article/details/114537199