文章目录
综合案例-联系人管理系统
01-案例演示和功能说明-[★★]
查询联系人
删除联系人
添加联系人
修改联系人
02-项目环境搭建和数据准备-[★★★]
- 使用三层架构开发实现联系人CURD
项目结构
准备数据表
create table contact(
id int primary key auto_increment ,
name varchar(20) not null ,
sex char(1) ,
age int(3) unsigned , -- 无符号
address varchar(10) , -- 籍贯
qq varchar(18) ,
email varchar(25)
) ;
-- 插入记录
insert into contact(name,sex,age,address,qq,email) values
('猪八戒','男',25,'广东','834523234','zhuzhuxia@163.com'),
('貂蝉','女',18,'湖南','59869834','diaochan@qq.com'),
('孙悟空','男',28,'湖南','87967822','wukong@qq.com'),
('周瑜','男',25,'广西','2743759345','zhou@163.com');
select * from contact;
主配置文件 sqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--给数据类型取别名-->
<typeAliases>
<!-- 包扫描给类取别名,默认别名就是类名 -->
<package name="com.pkx.entity"/>
</typeAliases>
<!--配置数据库连接参数-->
<environments default="mybatis">
<environment id="mybatis">
<!--事务管理器-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源-->
<dataSource type="pooled">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///day29"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 加载接口映射文件 -->
<mappers>
<!-- 加载指定包(包括子包下)的所有接口映射映射文件 -->
<package name="com.pkx.dao"/>
</mappers>
</configuration>
03-创建工具类-[★★★★★]
SqlSession工具类
- 目标:简化SqlSession对象的创建和接口代理对象的创建
/**
* sqlSession工具类
*/
public class SqlSessionUtils {
// 1. sqlSessionFactory对象
private static SqlSessionFactory sqlSessionFactory;
// 2. 加载主配置文件并获得SqlSessionFactory对象
static {
try{
// 2.1 获得字节输入流关联sqlMapConfig.xml文件
InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
// 2.2 获得SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 2.3 创建sqlSessionFactory对象
sqlSessionFactory = builder.build(in);
} catch(Exception e){
e.printStackTrace();
}
}
// 3. 返回一个sqlSession对象
public static SqlSession openSession(){
return sqlSessionFactory.openSession();
}
// 4. 返回Dao接口代理对象
public static <T> T getMapper(Class<T> interfaceClass){
// 创建代理对象并返回
return (T) Proxy.newProxyInstance(
SqlSessionUtils.class.getClassLoader(),
new Class[]{
interfaceClass},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 1. 获得连接对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 2. 获得接口代理对象 ==》 (真实对象)
T dao = sqlSession.getMapper(interfaceClass);
// 4. 调用真实对象的方法
Object result = method.invoke(dao, args);
// 5. 关闭连接
sqlSession.commit();
sqlSession.close();
return result;
}
});
}
}
字符编码过滤器
- 目标:解决全局POST参数乱码问题
/**
* 目标:解决全局POST请求参数乱码问题
*/
@WebFilter(urlPatterns = "/*")
public class CharacterEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 类型转换
HttpServletRequest request = (HttpServletRequest) servletRequest;
// 获取请求方式:GET或POST
String method = request.getMethod();
// 判断是否是POST请求
if ("post".equalsIgnoreCase(method)){
// 设置请求参数编码:utf-8
request.setCharacterEncoding("utf-8");
}
// 放行请求
filterChain.doFilter(request, servletResponse);
}
@Override
public void destroy() {
}
}
04-显示联系人列表-[★★★★★]
ContactDao接口代码
/**
* 数据访问层接口
实现功能的步骤
1. 后端服务器
调用顺序:表现层 -> 业务层 -> 数据访问层
开发顺序:数据访问层 -> 业务层 -> 表现层
问题1:要明确方法的参数个数和类型
问题2:要明确方法的返回值类型
2. 前台页面
1. 发送请求获取数据(是否需要传递参数,需要传递几个)
2. 显示后台返回的数据
*/
public interface ContactDao {
/**
* 查询所有联系人
*/
@Select("select * from contact")
List<Contact> findAll();
}
ContactService业务层代码
/**
* 业务层
*/
public class ContactService {
// 获得接口实现类对象
private ContactDao contactDao = SqlSessionUtils.getMapper(ContactDao.class);
/**
* 查询所有联系人
*/
public List<Contact> findAll(){
return contactDao.findAll();
}
}
ListContactServlet控制器代码
/**
* 目标:接收请求查询所有联系人
*
* 步骤:
1. 创建业务层对象
2. 调用业务层方法:查询所有联系人
3. 将联系人数据存储到请求域
4. 转发到list.jsp页面展示数据
*/
@WebServlet(urlPatterns = "/list")
public class ListContactServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 创建业务层对象
ContactService cs = new ContactService();
// 2. 调用业务层方法:查询所有联系人
List<Contact> contactList = cs.findAll();
// 3. 将联系人数据存储到请求域
request.setAttribute("contactList", contactList);
// 4. 转发到list.jsp页面展示数据
request.getRequestDispatcher("list.jsp").forward(request, response);
}
}
list.jsp页面代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>查询所有联系人</title>
<!-- 1. 导入CSS的全局样式 -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- 2. jQuery导入,建议使用1.9以上的版本 -->
<script src="js/jquery-2.1.0.min.js"></script>
<!-- 3. 导入bootstrap的js文件 -->
<script src="js/bootstrap.min.js"></script>
<style type="text/css">
tr,th {
text-align: center;
}
</style>
</head>
<body>
<div class="container">
<form action="list" method="get" class="form-inline" id="contactForm">
<h2 class="text-center">联系人列表</h2>
<div class="row text-right" style="margin-bottom: 10px; margin-top: 15px;">
<div class="col-md-4 text-left">
<a class="btn btn-primary" href="add.jsp" style="width: 120px">添加联系人</a>
</div>
</div>
<div class="row">
<div class="col-md-12">
<table border="1" class="table table-bordered table-hover">
<tr class="success">
<th>编号</th>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>籍贯</th>
<th>QQ</th>
<th>邮箱</th>
<th