1.案例
(1)添加用户
step1.建表
create table t_user(
id int primary key auto_increment,
username varchar(50) unique,
password varchar(20),
phone varchar(20),
email varchar(30)
);
step2.导包
jdbc驱动,连接池,junit
step3.将jdbc.properties文件添加到resource下。
step4.将DBUtils类添加到util包下。
step5.测试DBUtils类(可以利用junit)。
step6.修改AddUserServlet,添加jdbc代码,完成
插入操作。
2. DAO (Data Access Object 数据访问对象)
(1)什么是DAO?
封装了数据访问逻辑的一个对象。
(2)如何写DAO?
step1.写一个实体类。
注:
因为数据库里面存放的是一条条记录,
而java是面向对象的语言,处理对象更方便,
所以,我们经常将查询到的记录存放到一个对应
的java对象里面,这个时候,就需要设计一个
java类,该类与表的结构一致:
表有哪些字段,该类一般就会有对应的属性,
并且类型要匹配。
step2.写DAO类。
(3)DAO的优点
a.方便测试
比如将数据访问逻辑写在DAO类里面,可以
直接测试,而如果将数据访问逻辑写在Servlet
里面,需要部署之后才能测试。
b.方便代码的复用
c.方便分工协作
d.方便代码的维护
下面是全部代码:
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.tedu.servlet</groupId>
<artifactId>day03</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>MySQL</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<servlet-name>addUserServlet</servlet-name>
<servlet-class>web.AddUserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>addUserServlet</servlet-name>
<url-pattern>/add</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>listUserServlet</servlet-name>
<servlet-class>web.ListUserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>listUserServlet</servlet-name>
<url-pattern>/list</url-pattern>
</servlet-mapping>
</web-app>
addUser.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body style="font-size:30px;">
<form action="add" method="post">
<fieldset>
<legend>添加用户</legend>
用户名:<input name="uname"/><br/>
密码:<input type="password" name="pwd"/><br/>
电话:<input name="phone"/><br/>
邮箱:<input name="email"/><br/>
<input type="submit" value="确定"/>
</fieldset>
</form>
</body>
</html>
jdbc.properties:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jsd1711db
user=root
password=root
initSize=2
max=3
上面是配置文件,下面写java代码:
dao.UserDAO.java
package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import entity.User;
import util.DBUtils;
/**
* DAO类
*
*/
public class UserDAO {
/**
* 依据id从数据库中删除对应的用户
*/
public void delete(int id){
}
/**
* 将用户信息添加到数据库
*/
public void save(User user){
Connection conn = null;
try {
conn = DBUtils.getConn();
String sql = "INSERT INTO t_user "
+ "VALUES(null,?,?,?,?)";
PreparedStatement ps =
conn.prepareStatement(sql);
ps.setString(1, user.getUname());
ps.setString(2, user.getPwd());
ps.setString(3, user.getPhone());
ps.setString(4, user.getEmail());
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally{
DBUtils.closeConn(conn);
}
}
/**
* 查询出所有用户信息
*/
public List<User> findAll(){
List<User> users =
new ArrayList<User>();
Connection conn = null;
try {
conn = DBUtils.getConn();
String sql = "SELECT * FROM t_user";
PreparedStatement ps =
conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()){
int id = rs.getInt("id");
String uname = rs.getString(
"username");
String pwd = rs.getString(
"password");
String phone = rs.getString(
"phone");
String email = rs.getString(
"email");
User user = new User();
user.setId(id);
user.setUname(uname);
user.setPwd(pwd);
user.setPhone(phone);
user.setEmail(email);
users.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally{
DBUtils.closeConn(conn);
}
return users;
}
}
entity.User.java
package entity;
/**
* 实体类
*/
public class User {
private int id;
private String uname;
private String pwd;
private String phone;
private String email;
@Override
public String toString() {
return "User [id=" + id + ", uname=" + uname + ", pwd=" + pwd + ", phone=" + phone + ", email=" + email + "]";
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
util.DBUtils.java
package util;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.dbcp.BasicDataSource;
public class DBUtils {
//准备数据库连接参数
private static String driver;
private static String url;
private static String user;
private static String password;
private static String initSize;
private static String max;
private static BasicDataSource ds;
static{
//准备Properties对象
Properties prop = new Properties();
//获取文件的输入流
InputStream ips = DBUtils.class.getClassLoader()
.getResourceAsStream("jdbc.properties");
try {
//把文件通过流加载进来
prop.load(ips);
//从prop中获取数据库连接参数
driver = prop.getProperty("driver");
url = prop.getProperty("url");
user = prop.getProperty("user");
password = prop.getProperty("password");
initSize = prop.getProperty("initSize");
max = prop.getProperty("max");
//创建数据源
ds = new BasicDataSource();
//设置数据库连接参数
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(user);
ds.setPassword(password);
//设置初始化连接数量
ds.setInitialSize(Integer.parseInt(initSize));
ds.setMaxActive(Integer.parseInt(max));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConn() throws SQLException{
Connection conn = ds.getConnection();
return conn;
}
public static void closeConn(Connection conn){
if (conn!=null) {
try {
conn.setAutoCommit(true);
//此时因为使用了数据库连接池,
// close不再是关闭而是归还到连接池
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void rollback(Connection conn) {
if (conn!=null) {
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
web.AddUserServlet.java
package web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dao.UserDAO;
import entity.User;
public class AddUserServlet extends HttpServlet{
@Override
protected void service(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException,
IOException {
//处理表单中文参数值问题
request.setCharacterEncoding("utf-8");
//输出中文
response.setContentType(
"text/html;charset=utf-8");
//读取用户信息
String uname = request.getParameter(
"uname");
String pwd = request.getParameter("pwd");
String phone = request.getParameter(
"phone");
String email = request.getParameter(
"email");
//将用户信息插入到数据库
try {
UserDAO dao = new UserDAO();
User user = new User();
user.setUname(uname);
user.setPwd(pwd);
user.setPhone(phone);
user.setEmail(email);
dao.save(user);
response.getWriter().println(
"添加成功");
} catch (Exception e) {
//记日志(保留现场)
e.printStackTrace();
/*
* 看异常能否恢复,如果不能够恢复
* (比如数据库服务停止,这样的异常,
* 我们称之为系统异常),则提示用户
* 稍后重试。如果能够恢复,则立即恢复。
*/
response.getWriter().println(
"系统繁忙,稍后重试");
}
}
}
web.ListUserServlet.java
package web;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dao.UserDAO;
import entity.User;
public class ListUserServlet extends HttpServlet{
@Override
protected void service(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException,
IOException {
response.setContentType(
"text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//查询出所有用户的信息
UserDAO dao = new UserDAO();
try {
List<User> users = dao.findAll();
//将查询到的用户信息以表格的形式输出
out.println("<table border='1' "
+ "width='60%' cellpadding='0' "
+ "cellspacing='0'>");
out.println("<tr><td>ID</td>"
+ "<td>用户名</td>"
+ "<td>密码</td>"
+ "<td>电话</td>"
+ "<td>邮箱</td></tr>");
for(User user : users){
int id = user.getId();
String uname = user.getUname();
String pwd = user.getPwd();
String phone = user.getPhone();
String email = user.getEmail();
out.println("<tr><td>" + id + "</td>"
+ "<td>" + uname + "</td>"
+ "<td>" + pwd + "</td>"
+ "<td>" + phone + "</td>"
+ "<td>" + email + "</td></tr>");
}
out.println("</table>");
} catch (Exception e) {
e.printStackTrace();
out.println(
"系统繁忙,稍后重试");
}
}
}