DAO相关基础

2 篇文章 0 订阅

1.DAO定义:

DAO(DataAccessObjects 数据存取对象)是指代位于业务逻辑和持久化数据的访问,通俗就是对数据库操作的封装。

2.DAO的组成部分:

DAO接口:对数据库的所有操作定义成抽象方法

DAO实现类:对不同的数据库提供不同的实现方法

实体类:存放和实现数据的传递

数据库连接和关闭工具类:避免数据库的连接和关闭代码的重复使用,方便修改

3.servlet+dao+jsp的流程思路:

创建实体类用来传递数据库中的数据,所以属性和数据库中的字段要保持相同,

导入BaseDao为工具类,里面定义了通用的数据库连接关闭等的方法

dao包中定义需要实现的功能接口并实现,主要的操作就是定义sql语句和sql语句中的值,传入继承的工具类中的增删改查中的对应方法,并获取返回值

service包中定义功能和实现,功能和dao包中的接口实现类相同,实现参数的传入的方法的定义,

servlet是总体控制,调度访问的标识,通过判断实现不同的功能实现,从各种jsp页面中获取值,并调用service中的方法传入此值

jsp页面负责显示

个人理解: 

4.DAO的小练习:

servlet+dao+jsp

1)创建工程:

工程中创建包:entity,util,dao,test,service,servlet,jsp

(entity,util,dao,test,service,servlet,jsp)

2)导入jar包

javax.servlet.jar,

jstl.jar,

mysql-connector-java-5.1.7-bin.jar,

servlet-api.jar,

standard.jar

3)创建数据库:

随意添加几条数据 

4)创建实体类:

实体类的属性和数据库中的字段一一对应

Serializable为标记类,无内容

package cn.kgc.entity;

import java.io.Serializable;

public class User implements Serializable {
    private Integer id;
    private String name;
    private  String password;

    public User() {
    }

    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public User(Integer id, String name, String password) {
        this.id = id;
        this.name = name;
        this.password = password;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer 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;
    }
}

5)util/BaseDao

导入BaseDao,这是数据库连接和关闭工具类

package cn.kgc.util;

import java.io.Serializable;
import java.sql.*;

public class BaseDao {
    //三个对象
    //定义连接对象
    protected static Connection connection;
    //定义预编译对象
    protected static PreparedStatement preparedStatement;
    //定义结果集对象
    protected static ResultSet resultSet;

    //连接数据库的方法
    public static void getConnection() {
        try {
            //注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //管理连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/work1", "root", "111");
            //测试连接对象
            System.out.println("连接" + connection);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }

    //关闭数据库的方法
    public static void closeConnection() {
        try {
            //关闭各对象
            if (connection != null)
                connection.close();
            if (preparedStatement != null)
                preparedStatement.close();
            if (resultSet != null)
                resultSet.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //通用的增删改的方法
    public int executeUpdate(String sql, Object[] params){
        int flag = 0;
        //调用连接方法
        getConnection();
        try {
            //调用方法,传递sql语句给数据库
            preparedStatement = connection.prepareStatement(sql);
            if (params != null){
                //循环将方法中的参数塞入结果集
                for (int i = 0; i <params.length; i++){
                    preparedStatement.setObject(i+1,params[i]);
                }
            }
            //执行处理方法
            flag = preparedStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            closeConnection();
        }
        return flag;
    }

    //通用的查询方法
    public ResultSet executeQuery(String sql,Object[] params){
        getConnection();
        try {
            preparedStatement = connection.prepareStatement(sql);
            if (params != null){
                for (int i = 0; i <params.length; i++){
                    preparedStatement.setObject(i+1,params[i]);
                }
            }
            resultSet = preparedStatement.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return resultSet;
    }

    //测试
    public static void main(String[] args) {
        getConnection();
    }
}

6)dao/UserDao和UserDaoImpl

创建Dao接口和实现类,实现类继承工具类,实现接口中定义的方法

实现类中的核心思路就是,在每个方法中定义不同的sql语句和sql语句中的内容,调用在BaseDao中对数据库操作的各种方法,获取得到返回值,增删改获取int类型返回值,以作后续标识,而查询等操作调用的executeQuery()方法,得到返回值类型位ResultSet

先定义接口类:

package cn.kgc.dao;

import cn.kgc.entity.User;

import java.util.ArrayList;

public interface UserDao {
    //1.添加功能
    public Integer addUser(User user);
    //2.展示功能
    public ArrayList<User> list();
    //3.删除功能
    public Integer del(int id);
    //4.模糊查询
    public ArrayList<User> find(String message);
    //5.id查询
    public User findById(Integer id);
    //6.修改
    public Integer update(User user);
}

再将各各类的功能实现:

package cn.kgc.dao;

import cn.kgc.dao.UserDao;
import cn.kgc.entity.User;
import cn.kgc.util.BaseDao;

import java.sql.SQLException;
import java.util.ArrayList;

public class UserDaoImpl extends BaseDao implements UserDao {

    @Override
    public Integer addUser(User user) {
        String sql = "insert into t_student(`name`,password) values(?,?)";//sql语句
        Object[] params = new Object[]{user.getName(),user.getPassword()};//里面是sql语句中?的值,几个?就是几个值
        return super.executeUpdate(sql,params);
    }

    @Override
    public ArrayList<User> list() {
        String sql = "select * from t_student";
        Object[] params = null;
        resultSet = super.executeQuery(sql,params);
        User user = null;
        ArrayList<User> list = new ArrayList<>();
        try {
            while (resultSet.next()){
                user = new User(resultSet.getInt("id"),resultSet.getString("name"),resultSet.getString("password"));
                list.add(user);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            closeConnection();
        }
        return list;
    }

    @Override
    public Integer del(int id) {
        String sql = "delete from t_student where id = ?";
        Object[] params = new Object[]{id};
        return super.executeUpdate(sql,params);
    }

    @Override
    public ArrayList<User> find(String message) {
        if (message==null || message.equals("")){
            String sql = "select * from t_student";
            Object[] params = null;
            resultSet = super.executeQuery(sql,params);
        } else {
            String sql = "select * from t_student where name like concat('%',?,'%');";
            Object[] params = new Object[]{message};
            resultSet = super.executeQuery(sql,params);
        }
        User user = null;
        ArrayList<User> list = new ArrayList<>();
        try {
            while (resultSet.next()){
                user = new User(resultSet.getInt("id"),resultSet.getString("name"),resultSet.getString("password"));
                list.add(user);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            closeConnection();
        }
        return list;
    }

    @Override
    public User findById(Integer id) {
        String sql = "select * from t_student where id = ?";
        Object[] params = new Object[]{id};
        resultSet = super.executeQuery(sql,params);
        User user = null;
        try {
            while (resultSet.next()){
                user = new User(resultSet.getInt("id"),resultSet.getString("name"),resultSet.getString("password"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            closeConnection();
        }
        return user;
    }

    @Override
    public Integer update(User user) {
        String sql = "update t_student set `name`=? ,password=? where id=?";
        Object[] params = new Object[]{user.getName(),user.getPassword(),user.getId()};
        return super.executeUpdate(sql,params);
    }

}

7)service/UserService接口和UserServiceImpl实现类

定义接口和实现类,实现类的核心思想就是创建一个私有的UserDaoImpl对象,里面的各种对数据库的操作方法已经定义完毕,实现的时候需要在方法中传递各种参数,并获取返回值,具体的参数等要结合servlet和jsp页面的值

接口:

package cn.kgc.service;

import cn.kgc.entity.User;

import java.util.ArrayList;

public interface UserService {
    //1.添加功能
    public Integer addUser(User user);
    //2.展示功能
    public ArrayList<User> list();
    //3.删除功能
    public Integer del(int id);
    //4.模糊查询
    public ArrayList<User> find(String message);
    //5.id查询
    public User findById(Integer id);
    //6.修改
    public Integer update(User user);
}

实现类:

package cn.kgc.service;

import cn.kgc.dao.UserDao;
import cn.kgc.dao.UserDaoImpl;
import cn.kgc.entity.User;

import java.util.ArrayList;

public class UserServiceImpl implements UserService{
    private UserDao userDao = new UserDaoImpl();

    @Override
    public Integer addUser(User user) {
        return userDao.addUser(user);
    }

    @Override
    public ArrayList<User> list() {
        return userDao.list();
    }

    @Override
    public Integer del(int id) {
        return userDao.del(id);
    }

    @Override
    public ArrayList<User> find(String message) {
        return userDao.find(message);
    }

    @Override
    public User findById(Integer id) {
        return userDao.findById(id);
    }

    @Override
    public Integer update(User user) {
        return userDao.update(user);
    }
}

8)servlet

servlet相当于总校长,管理标识和方法,不同的标识对应不同的if判断,里面添加要实现的各种功能,实例化serviceImpl对象并调用不同的方法,方法中的参数就是jsp页面中获取的值

创建servlet文件管理service,配置web.xml文件

再servlet中添加标识和各种不同访问对应的代码:

package cn.kgc.servlet;

import cn.kgc.entity.User;
import cn.kgc.service.UserService;
import cn.kgc.service.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;

@WebServlet(name = "UserServlet")
public class UserServlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.给request和response对象设置字符集
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        //2.获取请求url后的标识位
        String action = request.getParameter("action");
        if (action.equals("toAdd")) {
            //分支,跳转到添加页面
            request.getRequestDispatcher("add.jsp").forward(request, response);
        } else if (action.equals("add")) {
            //分支,执行添加方法
            //获取值
            String name = request.getParameter("name");
            String password = request.getParameter("password");
            //实例化对象并赋值
            User user = new User(name, password);
            //实例化UserServiceImpl对象
            UserService userService = new UserServiceImpl();
            int flag = userService.addUser(user);
            if (flag > 0)
                request.getRequestDispatcher("UserServlet?action=find").forward(request, response);
        }  else if (action.equals("del")) {
            UserService userService = new UserServiceImpl();
            String id = request.getParameter("id");
            int flag = userService.del(Integer.parseInt(id));
            if (flag > 0) {
                request.getRequestDispatcher("UserServlet?action=find").forward(request, response);
            }
        } else if (action.equals("findById")) {
            UserService userService = new UserServiceImpl();
            String id = request.getParameter("id");
            User user = userService.findById(Integer.parseInt(id));
            request.setAttribute("user",user);
            request.getRequestDispatcher("findById.jsp").forward(request, response);
        } else if (action.equals("find")) {
            UserService userService = new UserServiceImpl();
            String message = request.getParameter("message");
            ArrayList<User> list = userService.find(message);
            request.setAttribute("list", list);
            request.getRequestDispatcher("list.jsp").forward(request, response);
        } else if (action.equals("update")) {
            UserService userService = new UserServiceImpl();
            String id = request.getParameter("id");
            String name = request.getParameter("name");
            String password = request.getParameter("password");
            User user = new User(Integer.parseInt(id),name,password);
            userService.update(user);
            request.getRequestDispatcher("UserServlet?action=find").forward(request, response);
        } else if (action.equals("toUpdate")) {
            UserService userService = new UserServiceImpl();
            String id = request.getParameter("id");
            User user = userService.findById(Integer.parseInt(id));
            request.setAttribute("user", user);
            request.getRequestDispatcher("update.jsp").forward(request, response);
        }
//        else if (action.equals("list")) {
//            UserService userService = new UserServiceImpl();
//            ArrayList<User> list = userService.list();
//            request.setAttribute("list", list);
//            request.getRequestDispatcher("list.jsp").forward(request, response);
//        }
    }
}

list查看全部数据和模糊查询原理相同,在模糊查询中添加逻辑判断,合并两端代码

9)jsp文件,创建不同的jsp文件,对应各种需要的功能:

 访问servlet中的toAdd准备添加:http://localhost:8080/UserServlet?action=toAdd

进行转发到添加add.jsp界面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="UserServlet?action=add" method="post">
    <table border="1px solid" width="300px">
        <tr>
            <th colspan="2">添加页面</th>
        </tr>
        <tr>
            <td>用户名称</td>
            <td><input type="text" name="name"></td>
        </tr>
        <tr>
            <td>用户密码</td>
            <td><input type="text" name="password"></td>
        </tr>
        <tr>
            <td colspan="2" style="text-align: center">
                <input type="submit" value="提交"><input type="reset" value="重置">
            </td>
        </tr>
    </table>
</form>

</body>
</html>

输入值进行提交,访问servlet中的add模块,进行添加操作,之后转发至查看界面:

查看界面jsp代码如下:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="UserServlet?action=find" method="post">
    <table border="1px">
        <tr>
            <td>用户id</td>
            <td>用户名字</td>
            <td>用户密码</td>
            <td>操作</td>
            <td>操作</td>
        </tr>
        <c:forEach items="${list}" var="user">
            <tr>
                <td><a href="UserServlet?action=findById&id=${user.id}">${user.id}</a></td>
                <td>${user.name}</td>
                <td>${user.password}</td>
                <td><a href="UserServlet?action=del&id=${user.id}">删除</a></td>
                <td><a href="UserServlet?action=toUpdate&id=${user.id}">修改</a></td>
            </tr>
        </c:forEach>
        <tr>
            <td>模糊查询</td>
            <td><input type="text" name="message"></td>
            <td><input type="submit" value="提交"></td>
        </tr>
    </table>
</form>
</body>
</html>

 结果如下:

 点击用户id查看详情是findById.jsp界面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <table border="1px solid" width="300px">
        <tr>
            <th colspan="2">查询页面</th>
        </tr>
        <tr>
            <td>用户id</td>
            <td><input type="text" name="name" value="${user.id}"></td>
        </tr>
        <tr>
            <td>用户名称</td>
            <td><input type="text" name="name" value="${user.name}"></td>
        </tr>
        <tr>
            <td>用户密码</td>
            <td><input type="text" name="password" value="${user.password}"></td>
        </tr>
        <tr>
            <td colspan="2" style="text-align: center">
                <input type="button" value="返回上界面" onclick="javascript:window.history.back()">
            </td>
        </tr>
    </table>
</body>
</html>

 效果如下:

点击修改按钮访问的是update.jsp页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="UserServlet?action=update" method="post">
    <table border="1px solid" width="300px">
        <tr>
            <th colspan="2">修改页面</th>
        </tr>
        <tr>
            <td><input type="hidden" name="id" value="${user.id}"></td>
        </tr>
        <tr>
            <td>用户名称</td>
            <td><input type="text" name="name" value="${user.name}"></td>
        </tr>
        <tr>
            <td>用户密码</td>
            <td><input type="text" name="password" value="${user.password}"></td>
        </tr>
        <tr>
            <td colspan="2" style="text-align: center">
                <input type="submit" value="提交">
                <input type="reset" value="重置">
            </td>
        </tr>
    </table>
</form>
</body>
</html>

 结果如下:

在输入框中修改值以后提交,进行展示:

 删除无需额外添加jsp界面,删除完毕直接展示即可。

 

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值