MVC模式,结合JDBC开发的项目流程
1. 创建业务对象(domain包的业务类)
2、创建业务对象对应的数据库表
3、把业务对象保存到数据库中
3.1 创建得到连接池的工具类(util包)
DataSourceUtil.java
package cn.itcast.cd.util;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class DataSourceUtil {
private static DataSource dataSource; //因为连接池是提供数据库连接,只需要在内存一个就可以了.所以说声明成静态的
//dbcp连接池, 因为连接池只需要创建一次,所以在静态代码块中创建...
static{
try {
Properties properties = new Properties(); //连接池所需要的配置
properties.load(DataSourceUtil.class.getClassLoader().getResourceAsStream("jdbc.properties"));
dataSource = BasicDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接池的对象
* @return
*/
public static DataSource getDataSource() {
return dataSource;
}
}
注:把jdbc.properties配置文件放到resource包中,
把驱动jar放到lib中
3.2 写DAO(操作方法,如增删改查,类命名一般为I+业务对象名+DAO),
注意,这只是一个接口,还需要实现;DAO接口实现的命名采用业务对象名+DAOImpl
注:通过DBUtil工具类操作数据库,需要一个DButil.jar文件
DAOImpl的例子
package cn.itcast.cd.dao.impl;
import java.sql.SQLException;
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 cn.itcast.cd.dao.IDepartmentDAO;
import cn.itcast.cd.domain.Department;
import cn.itcast.cd.util.DataSourceUtil;
public class DepartmentDAOImpl implements IDepartmentDAO {
private QueryRunner queryRunner;
public DepartmentDAOImpl() {
//创建queryRunner对象的时候就给他一个数据库连接池, 在后面调用queryRunner的方法的时候就不用connection对象了
this.queryRunner = new QueryRunner(DataSourceUtil.getDataSource());
}
@Override
public void save(Department department) {
String sql = "insert into department values(null,?)";
Object[] params = new Object[]{department.getName()};
update(sql, params);
}
@Override
public void remove(Long id) {
String sql = "delete from department where id = ?";
Object[] params = {id};
update(sql, params);
}
@Override
public void update(Long id, Department department) {
String sql = "update department set name = ? where id = ?";
Object[] params = {department.getName(),id};
update(sql, params);
}
public void update(String sql,Object...params){
try {
this.queryRunner.update(sql, params);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public Department get(Long id) {
String sql = "select * from department where id = ?";
Object[] params = {id};
try {
return this.queryRunner.query(sql, new BeanHandler<Department>(Department.class), params);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public List<Department> list() {
String sql = "select * from department";
try {
return this.queryRunner.query(sql, new BeanListHandler<Department>(Department.class));
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
4. 写Servlet(servlet包中),接收用户的请求,调用DAO中的方法.可以用一个servlet接收用户的不同请求,调用不同的方法,并跳转到不同页面,用?cmd=xxx来控制
例子:
public class DepartmentServlet extends HttpServlet {
private IDepartmentDAO departmentDAO;
@Override
public void init() throws ServletException {
departmentDAO = new DepartmentDAOImpl();
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8"); //注意编码
String cmd = request.getParameter("cmd");
if(StringUtils.isNotBlank(cmd)){
try {
Method method = this.getClass().getMethod(cmd, HttpServletRequest.class,HttpServletResponse.class);
method.invoke(this, request,response);
} catch (Exception e) {
add(request, response);
e.printStackTrace();
}
}else{
add(request, response);
}
}
public void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
.......
}
public void save() {............}
public void list() {............}
public void remove() {............}
其中method对象取得本程序中与cmd的名称所匹配的方法名
并用.invoke执行该方法,调用相关的DAO操作,将数据库的操作显示到相应的jsp上
5、写JSP来作显示,JSP中的参数由servlet转发,JSP目录位于WebContent--->WEB-INF--->新建一个view文件夹