一、需求设计分析
1.需求:用户信息的增删改查操作
2.设计:
1.技术选型:Servlet+JSP+MySQL+JDBCTemplate+Duird+BeanUtils+tomcat
注:Servlet擅长于流程控制和事务处理,所以用于我们控制用户数据在服务器端的增删改查操作。
JSP擅长于动态页面的编写,所以我们使用它编写页面中的一些动态按钮和显示形式。
MySQL数据库则用于存储用户数据信息。
JDBCTemplate则是spring架构中为我们提供的一个对象,用于搭建该案例的一个三层架构(界面层、业务逻辑层、数据访问层)。
Durid是阿里巴巴的一个数据库连接池,我们可以使用durid配置文件将数据库和我们编码使用的软件连接起来。
BeanUtils也是spring中的一个工具类,我们可以使用它来进行简化封装数据。
2.数据库设计:
create database day17; --创建数据库
use day17; --使用数据库
create table user( --创建表
id int primary key auto_increment, 注:数据库的元素类型根据用户的信息类型进行添加和修改。
name varchar(20) no null,
gender varchar(5),
age int,
address varchar(32),
qq varchar(20),
email varchar(50)
);
3.开发:
1.环境搭建
1.创建数据库环境
2.创建项目,导入需要的jar包
注:根据分析,我们可以先把项目包和类创建好。
其中dao包下有UserDao接口和其实现类UserDaoImpl,用于封装和实现对于数据库的操作代码。
package dao;
import domain.User;
import java.util.List;
import java.util.Map;
/*
用户操作的DAO
*/
public interface UserDao {
public List<User> findAll();
User findUserByUsernameAndPassword(String username, String password);
void add(User user);
void delete(int i);
User findById(int parseInt);
void update(User user);
//查询总记录数
int findTotalCount(Map<String, String[]> condition);
//分页查询每页记录
List<User> findByPage(int start, int rows, Map<String, String[]> condition);
}
package dao.impl;
import dao.UserDao;
import domain.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import util.JDBCUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class UserDaoImpl implements UserDao {
private JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
@Override
public List<User> findAll() {
//使用JDBC操作数据库
//1.定义sql
String sql="select * from user";
List<User> users = template.query(sql, new BeanPropertyRowMapper<User>(User.class));
return users;
}
public User findUserByUsernameAndPassword(String username,String password){
try {
String sql="SELECT * FROM `user` WHERE username = ? AND `password` = ? ;";
User user=template.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),username,password);
return user;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
@Override
public void add(User user) {
//1.定义sql
String sql="insert into user values(null,?,?,?,?,?,?,null,null)";
//2.执行sql
template.update(sql,user.getName(),user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail());
}
@Override
public void delete(int id) {
//1.定义sql
String sql="delete from user where id = ? ";
//2.执行sql
template.update(sql,id);
}
@Override
public User findById(int id) {
String sql="select * from user where id = ? ";
return template.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),id);
}
@Override
public void update(User user) {
String sql="update user set name = ? ,gender = ? ,age = ? ,address = ? ,qq = ? ,email = ? where id = ? ";
template.update(sql,user.getName(),user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail(),user.getId());
}
@Override
public int findTotalCount(Map<String, String[]> condition) {
//1.定义模板初始化sql
String sql="select count(*) from user where 1 = 1 ";
StringBuilder sb = new StringBuilder(sql);
//2.遍历map
Set<String> keySet = condition.keySet();
//定义参数的集合
List<Object> params = new ArrayList<>();
for (String key:keySet) {
//排除分页条件参数
if("currentPage".equals(key)||"rows".equals(key)){
continue;
}
//获取value
String value = condition.get(key)[0];
//判断value是否有值
if(value !=null&& !"".equals(value)){
//有值
sb.append(" and "+key+" like ? ");
params.add("%"+value+"%");//?条件的值
}
}
return template.queryForObject(sb.toString(),Integer.class,params.toArray());
}
@Override
public List<User> findByPage(int start, int rows, Map<String, String[]> condition) {
String sql="select * from user where 1 = 1 ";
StringBuilder sb = new StringBuilder(sql);
//2.遍历map
Set<String> keySet = condition.keySet();
//定义参数的集合
List<Object> params = new ArrayList<>();
for (String key:keySet) {
//排除分页条件参数
if("currentPage".equals(key)||"rows".equals(key)){
continue;
}
//获取value
String value = condition.get(key)[0];
//判断value是否有值
if(value !=null&& !"".equals(value)){
//有值
sb.append(" and "+key+" like ? ");
params.add("%"+value+"%");//?条件的值
}
}
//添加分页的查询
sb.append("limit ?,?");
//添加分页查询参数值
params.add(start);
params.add(rows);
sql=sb.toString();
return template.query(sql,new BeanPropertyRowMapper<User>(User.class),params.toArray());
}
}
domain中的User类用于声明用户的属性和获取修改方法,PageBean类则用于声明后面分页显示数据功能中总页面数,当前页面数等属性。
package domain;
public class User {
private int id;
private String name;
private String gender;
private int age;
private String address;
private String qq;
private String email;
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
", age=" + age +
", address='" + address + '\'' +
", qq='" + qq + '\'' +
", email='" + email + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
package domain;
import java.util.List;
/*
分页对象
*/
public class PageBean<T> {
private int totalCount;//总记录数
private int totalPage;//总页码
private List<T> list;//每页的数据
private int currentPage;//当前页码
private int rows;//每页显示的记录数
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
@Override
public String toString() {
return "PageBean{" +
"totalCount=" + totalCount +
", totalPage=" + totalPage +
", list=" + list +
", currentPage=" + currentPage +
", rows=" + rows +
'}';
}
}
service中的接口和实现类用于封装用户增删查改的方法,并dao包下的实现类方法连接使用达到效果。
package service;
import domain.PageBean;
import domain.User;
import java.util.List;
import java.util.Map;
/*
用户管理的业务接口
*/
public interface UserService {
//查询所有用户信息
public List<User> findAll();
//登录方法
User login(User user);
//保存User
void addUser(User user);
//根据id删除user
void deleteUser(String id);
//根据id查询
User findUserById(String id);
//修改用户信息
void updateUser(User user);
//删除选中用户
void delSelectedUser(String[] ids);
//分页条件查询
PageBean<User> findUserByPage(String currentPage, String rows, Map<String, String[]> condition);
}
package service.impl;
import dao.UserDao;
import dao.impl.UserDaoImpl;
import domain.PageBean;
import domain.User;
import service.UserService;
import java.util.List;
import java.util.Map;
public class UserServiceImpl implements UserService {
private UserDao dao=new UserDaoImpl();
@Override
public List<User> findAll(){
//调用Dao完成查询
return dao.findAll();
}
@Override
public User login(User user){
return dao.findUserByUsernameAndPassword(user.getUsername(),user.getPassword());
}
@Override
public void addUser(User user) {
dao.add(user);
}
@Override
public void deleteUser(String id) {
dao.delete(Integer.parseInt(id));
}
@Override
public User findUserById(String id) {
return dao.findById(Integer.parseInt(id));
}
@Override
public void updateUser(User user) {
dao.update(user);
}
@Override
public void delSelectedUser(String[] ids) {
if(ids !=null&&ids.length>0){
//1.遍历数组
for (String id :ids) {
//2.调用dao删除
dao.delete(Integer.parseInt(id));
}
}
}
@Override
public PageBean<User> findUserByPage(String _currentPage, String _rows, Map<String, String[]> condition) {
int currentPage=Integer.parseInt(_currentPage);
int rows=Integer.parseInt(_rows);
if(currentPage<=0){
c