1.增删改查
2.条件查询
3.分页查询
create database manager;
use manager;
create table t_custom(
id varchar(40) primary key,
username varchar(20),
gender varchar(10),
birthday varchar(20),
cellphone varchar(20),
email varchar(20),
love varchar(100),
type varchar(40)
);
1.mysql驱动包
2.beanutils包
3.JSTL标签库
4.DButils
5.连接池c3p0
其中
mine.action用来存servlet的程序,属于web层
mine.dao用来存和数据库交互的java文件,属于dao层
mine.service用来存服务层的java文件,起到了连接dao层和web层的作用
mine.utils用来存一些工具方法
mine.vo用来存储一些封装的对象,内有get和set方法
第四步,设置连接池c3p0的配置文件,文件名字必须是c3p0-config.xml,文件在各个包的同级目录之下
com.mysql.jdbc.Driver
jdbc:mysql:///OCmanager
root
123456
第五步,创建一些工具类,简化项目中的一些编程过程,文件创建在mine.utils下
MyJdbcUtil.java
package mine.utils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class MyJdbcUtil {
//创建一个c3p0连接池对象
public static ComboPooledDataSource dataSource = new ComboPooledDataSource();
//将获取连接池链接对象封装为一个方法
public static Connection getConnection() throws SQLException{
return dataSource.getConnection();
}
//将获取c3p0连接池对象也封装为一个方法
public static DataSource getDataSource(){
return dataSource;
}
//写了两种不同参数的release方法,由于释放资源的过程比较繁琐,每次都是一样的,所以封装为了两个简单的方法
public static void release(ResultSet rs,Statement stmt,Connection conn){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
public static void release(Statement stmt,Connection conn){
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
UUIDUtil.java
package mine.utils;
import java.util.UUID;
public class UUIDUtil {
public static String getUUID(){
//这个方法可以获取一个唯一的比较长的ID
return UUID.randomUUID().toString().replace("-", "");
}
}
第六步,创建需要封装的用户对象,分页对象,在mine.vo包下
Customer.java
package mine.vo;
public class Customer {
//正好是数据库里面创建的8个对象,并在这里设置他们的get和set方法,等待着被封装
private String id;
private String username;
private String gender;
private String birthday;
private String cellphone;
private String email;
private String love;
private String type;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getCellphone() {
return cellphone;
}
public void setCellphone(String cellphone) {
this.cellphone = cellphone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getLove() {
return love;
}
public void setLove(String love) {
this.love = love;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String toString() {
return "Customer [id=" + id + ", username=" + username + ", gender="
+ gender + ", birthday=" + birthday + ", cellphone="
+ cellphone + ", email=" + email + ", love=" + love + ", type="
+ type + "]";
}
}
PageBean.java
package mine.vo;
import java.util.List;
public class PageBean {
/*这是一个分页功能实现的对象,在这个对象里有多个变量
* pagecode当前页,从页面获取
* totalpage总页数,通过计算可以得出
* totalcount总记录数,从数据库中查询可得
* pagesize每页显示的条数,由自己设定
* beanlist每页的数据,存储在beanlist当中
*
*/
private int pageCode;
private int totalCount;
private int pageSize;
private List beanList;
//URL的封装,当分页查询和条件查询相结合的时候,会出现一个问题,就是条件查找之后,在进行分页的跳转
//会使得条件消失,所以,需要采用一种拼接字符串的方式,将url返回给jsp页面。
private String url;
//设置get和set方法,但这里有些是需要设置的,有些是要自己计算的,所以与普通封装的get和set方法有些许不同
public int getPageCode() {
return pageCode;
}
public void setPageCode(int pageCode) {
this.pageCode = pageCode;
}
//获取总页数的方法,如果总条数除以每页条数余数为0,那么结果就是totalpage
//如果有余数,那么就让页数再加上1来显示剩下的内容
public int getTotalPage() {
int totalPage = totalCount / pageSize;
if(totalCount % pageSize == 0){
return totalPage;
}else{
return totalPage + 1;
}
}
/*不需要设置的方法,因为是计算的,所以只需要获取就可以了
* public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}*/
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public List getBeanList() {
return beanList;
}
public void setBeanList(List beanList) {
this.beanList = beanList;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
第七步,写出相应的jsp页面,并添加相应的反应的servlet程序,在servlet中调用service中的方法,service中的方法再调用dao中的方法,也就是jsp页面需要一个功能,然后这个功能发到这个功能的servlet中,在这里获取数据,然后把数据封装为对象,也就是上面的vo中的对象,然后只在这里调用sevice中的方法,service其实就算是一个中继作用的层,然后再调用dao层中的方法,与数据库进行交互。
mine.service中的CustomerService.java
package mine.service;
import java.util.List;
import mine.dao.CustomerDao;
import mine.utils.UUIDUtil;
import mine.vo.Customer;
import mine.vo.PageBean;
//这里面的方法,都在servlet中得到调用,然后,他也会调用dao中的方法
public class CustomerService {
//通过条件和页码进行查询
public PageBean findAllByConditionPage(String username,String type,int pageCode,int pageSize){
CustomerDao dao = new CustomerDao();
return dao.findAllByConditionPage(username,type,pageCode,pageSize);
}
//通过页码进行查询
public PageBean findAllByPage(int pageCode,int pageSize){
CustomerDao dao = new CustomerDao();
return dao.findAllByPage(pageCode,pageSize);
}
//通过条件名字进行查询
public List findAllByName(String username,String type){
CustomerDao dao = new CustomerDao();
return dao.findAllByName(username,type);
}
//更新用户,也就是实现对用户实现编辑修改的功能
public void updateCustomer(Customer c){
CustomerDao dao = new CustomerDao();
dao.update(c);
}
//加一个用户
public void addCustomer(Customer c){
//为用户获取一个唯一的ID
String id = UUIDUtil.getUUID();
c.setId(id);
CustomerDao dao = new CustomerDao();
dao.save(c);
}
//找到所有的用户,不用分页的功能
public List findAll(){
CustomerDao dao = new CustomerDao();
return dao.findAll();
}
//通过ID找到相应的用户
public Customer findById(String id){
CustomerDao dao = new CustomerDao();
return dao.findById(id);
}
//删除一个用户数据
public void deleteCustomer(String id) {
CustomerDao dao = new CustomerDao();
dao.deleteCustomer(id);
}
}
mine.dao中的CustomerDao.java
package mine.dao;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import mine.utils.MyJdbcUtil;
import mine.vo.Customer;
import mine.vo.PageBean;
public class CustomerDao {
//找到所有用户的方法,返回一个List
public List findAll(){
//DButils的方法,创建一个QueryRunner类,传入的参数是c3p0连接池对象
QueryRunner runner = new QueryRunner(MyJdbcUtil.getDataSource());
try {
//DButils的特定的增删查方法,一共有九个实现类,可以查询我的CSDN的DButils的那一篇
//返回一个List
return runner.query("select * from t_customer", new BeanListHandler(Customer.class));
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("查询全部结果失败");
}
}
//该方法在addCustomer得到调用
public void save(Customer c){
try {
/**
* id varchar(40) primary key,
username varchar(20),
gender varchar(10),
birthday varchar(20),
cellphone varchar(20),
email varchar(40),
love varchar(100),
type varchar(40)
*/
QueryRunner runner = new QueryRunner(MyJdbcUtil.getDataSource());
// 先写出sql语句
String sql = "insert into t_customer values (?,?,?,?,?,?,?,?)";
// custom对象已经传过来了,我们可以获取它的参数
Object [] params = {c.getId(),c.getUsername(),c.getGender(),c.getBirthday(),c.getCellphone(),c.getEmail(),c.getLove(),c.getType()};
// 将custom的内容作为参数的内容传到上面的?当中,位置是相对应的
runner.update(sql, params);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("添加失败");
}
}
//通过ID来进行查找用户
public Customer findById(String id) {
QueryRunner runner = new QueryRunner(MyJdbcUtil.getDataSource());
try {
return runner.query("select * from t_customer where id = ?", new BeanHandler(Customer.class) ,id);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("通过ID查询失败");
}
}
//编辑用户,更新用户的信息
public void update(Customer c) {
QueryRunner runner = new QueryRunner(MyJdbcUtil.getDataSource());
try {
String sql = "update t_customer set username = ? , gender = ? , birthday = ? , cellphone=? ,email = ?, love = ?, type=? where id = ?";
Object [] params = {c.getUsername(),c.getGender(),c.getBirthday(),c.getCellphone(),c.getEmail(),c.getLove(),c.getType(),c.getId()};
runner.update(sql, params);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("编辑失败");
}
}
//不分页的条件查找
public List findAllByName(String username, String type) {
QueryRunner runner = new QueryRunner(MyJdbcUtil.getDataSource());
try {
// 创建一个StringBuffer对象进行字符串的拼接
StringBuffer sb = new StringBuffer("select * from t_customer where 1=1 ");
//这个List用来存参数,在下面赋值给?
List
然后就是相应的JSP对应相应的servlet,再调用相应的方法,由于内容比较多,所以在此不在赘述了,在文末会附上整个项目的内容,读者可以根据自己的需要进行获取。