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界面,删除完毕直接展示即可。