1.基本要求:该网站必须采用MVC设计模式;使用MySQL数据库存储数据,用JDBC操作数据库;功能齐全、结构完整;操作简便。
2.功能模块:除用户模块外,还应包含至少一个能实现该主题网站的基本功能模块。
请看:简单的Javaweb项目(mvc模式,数据库用MySQL)jsp+MySQL+servlet :https://blog.csdn.net/bueke/article/details/103478054
如有帮助,望采纳
1.首先数据库连接池C3P0的一些实现需要导五个开源的架包:
c3p0-0.9.1.2.jar
commons-dbcp-1.4.jar
commons-dbutils-1.3.jar
commons-pool-1.5.5.jar
mysql-connector-java-5.1.6-bin.jar
---------------------------------------------------------------------------
2.连接数据库连接池的文件为:在src目录下建立XML文件c3p0-config.xml;
root
lxn123
com.mysql.jdbc.Driver
jdbc:mysql:///test
5
10
10
50
20
5
---------------------------------------------------------------------------
3.连接数据库连接池的类:JdbcUtils
public class JdbcUtils {
//释放connection连接
public static void releaseConnection(Connection connection){
try {
if (connection!=null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
//该静态代码块只执行一次
private static ComboPooledDataSource dataSource=null;
static{
//通过配置文件实现数据库的连接,只能被创建一次
dataSource=new ComboPooledDataSource("mvcapp");
}
//获取数据库连接,返回数据源的Connection对象
public static Connection getConnection() throws SQLException{
return dataSource.getConnection();
}
}
---------------------------------------------------------------------------
4.建立一个测试类(建立方法类似于class的建立,在src,所在包下建立,建立时找java下的JUnit,建立就行了):JdbcUtilsTest类,对数据库连接池进行测试,看是否连接成功!!!
public class JdbcUtilsTest {
//测试类包,测试数据库是否连接成功
@Test
public void testGetConnection() throws SQLException{
Connection connection=JdbcUtils.getConnection();
System.out.println(connection);
}
}
---------------------------------------------------------------------------
5.java是以面向对象的思想编程的,所以建立customer类,CriteriaCustomer类,对数据库里面的属性进行封装处理,便于后边功能调用的实现
customer类:对数据库里面的属性进行封装处理
public class Customer {
//建立了一个Customer类,对id,name,address,phone这些属性进行封装
private Integer id;
private String name;
private String address;
private String phone;
public Customer() {
super();
}
public Customer( String name, String address, String phone) {
this.name = name;
this.address = address;
this.phone = phone;
}
public Customer(Integer id, String name, String address, String phone) {
super();
this.id = id;
this.name = name;
this.address = address;
this.phone = phone;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "Customer [id=" + id + ", name=" + name + ", address=" + address + ", phone=" + phone + "]";
}
}
-------------------
CriteriaCustomer类:模糊查询的类
//模糊查询的类
public class CriteriaCustomer {
private String name;
private String address;
private String phone;
public CriteriaCustomer() {
super();
}
public CriteriaCustomer(String name, String address, String phone) {
super();
this.name = name;
this.address = address;
this.phone = phone;
}
public String getName() {
if (name==null) {
name="%%";
}
else{
name="%"+name+"%";
}
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
if (address==null) {
address="%%";
}
else{
address="%"+address+"%";
}
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
if (phone==null) {
phone="%%";
}
else{
phone="%"+phone+"%";
}
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
---------------------------------------------------------------------------
6.在该包下建立一个接口类(创建时找interface,创建):CustomerDAO,里边封装了一些方法:
(1)模糊查询方法
(2)查询的方法
(3)插入数据
(4)通过jsp超链接里面?后面的id,获取id值的方法
(5)通过jsp超链接里面?后面的id,并且实现删除的方法
(6)查村和该name值相等的个数的方法
(7)修改方法
//创建以CustomerDAO接口,可以实现其他类的调用
public interface CustomerDAO {
//模糊查询方法,通过输入的字符,查看数据表里的数据里,是否包含这些字符,
public List getForListWithCriteriaCustomer(CriteriaCustomer cc);
//查询的方法,将数据库的所有数据放在list集合中,并实现输出的查询
public List getAll();
//插入数据,在页面上输入数据name,address,phone,就直接插入
public void save(Customer customer);
//通过jsp超链接里面?后面的id,获取该id下的各属性的值
public Customer get(Integer id);
//通过jsp超链接里面?后面的id,并且实现删除的功能
public void delete(Integer id);
//返回和该name相等的个数
public long getCountWithName(String name);
//修改的方法
void update(Customer customer);
}
---------------------------------------------------------------------------
7.建立一个DAO类,封装了基本的增删改查方法,以供子类继承使用; 当前DAO没有事务,直接在方法中获取数据库的链接
(1)类的构造方法,用到了反射,便有后面Servlet类实现*.do的操作
(2)返回数据库里面一条记录的值:比如返回某一条记录的customerName,或返回有多少条记录
(3)返回所对应的list集合,获得的是数据库的所有记录值
(4)返回对应的T的一个实体类的对象,该类泛型类的方法
(5)该方法封装了增删改操作,可实现对数据库中的数据进行增加,删除,修改操作
/*
* 封装了基本的增删改查方法,以供子类继承使用;
* 当前dao没有事务,直接在方法中获取数据库的链接
* */
public class DAO {
//这个是线程安全的
private QueryRunner queryRunner=new QueryRunner();
private Class clazz;
//类的构造方法
public DAO() {
//得到父类带泛型的类型
//type类型导包为import java.lang.reflect.Type;反射类型里面的
//反射。。。。。。Type所有超级类接口,ParameterizedType表示参数化类型,参数化类型在反射方法首次需要时创建(在此包中指定)。
//当创建参数化类型 p 时,p 实例化的一般类型声明会被解析,并且按递归方式创建 p 的所有类型参数。
//superClass instanceof ParameterizedType,判断superClass是否为首次出现的该类型,instanceof是用法,参数,例子的意思;
Type superClass=getClass().getGenericSuperclass();
if (superClass instanceof ParameterizedType) {
ParameterizedType parameterizedType=(ParameterizedType) superClass;
// getActualTypeArguments():返回表示此类型实际类型参数的 Type 对象的数组。
Type[] typeArgs=parameterizedType.getActualTypeArguments();
if (typeArgs!=null && typeArgs.length>0) {
if (typeArgs[0] instanceof Class) {
clazz=(Class) typeArgs[0];
}
}
}
}
//返回数据库里面一条记录的值:比如返回某一条记录的customerName,或返回有多少条记录
public E getForValue(String sql,Object...args){
Connection connection=null;
try {
connection=JdbcUtils.getConnection();
return (E) queryRunner.query(connection,sql,new ScalarHandler(),args);
} catch (Exception e) {
e.printStackTrace();
}finally {
JdbcUtils.releaseConnection(connection);
}
return null;
}
//返回所对应的list集合,获得的是数据库中所有数据的集合
public List getForList(String sql,Object...args){
Connection connection=null;
try {
connection=JdbcUtils.getConnection();
return queryRunner.query(connection,sql,new BeanListHandler<>(clazz),args);
} catch (Exception e) {
e.printStackTrace();
}finally {
JdbcUtils.releaseConnection(connection);
}
return null;
}
//返回对应的T的一个实体类的对象
public T get(String sql,Object...args){
Connection connection=null;
try {
connection=JdbcUtils.getConnection();
return queryRunner.query(connection,sql,new BeanHandler<>(clazz),args);
} catch (Exception e) {
e.printStackTrace();
}finally {
JdbcUtils.releaseConnection(connection);
}
return null;
}
//该方法封装了增删改操作
public void update(String sql,Object...args){
Connection connection=null;
try {
connection=JdbcUtils.getConnection();
queryRunner.update(connection, sql, args);
} catch (Exception e) {
e.printStackTrace();
}finally {
JdbcUtils.releaseConnection(connection);
}
}
}
---------------------------------------------------------------------------
8.CustomerDAOJdbcImpl类,继承了父类DAO和继承了接口CustomerDAO,及可获得父类DAO的非构造方法,和接口CustomerDAO封装的方法,并在此类中将接口封装的方法加以实现
CustomerDAOJdbcImpl extends DAO implements CustomerDAO
//实现各个功能的类
public class CustomerDAOJdbcImpl extends DAO implements CustomerDAO{
@Override
//模糊查询的方法
public List getForListWithCriteriaCustomer(CriteriaCustomer cc) {
String sql="select id,name,address,phone from customer "
+ "where name like ? and address like ? and phone like ?";
//修改了CriteriaCustomer的get方法,使其返回的字符串中含有%%
return getForList(sql,cc.getName(),cc.getAddress(),cc.getPhone());
}
@Override
//获取整个数据库中的所有数据
public List getAll() {
String sql1="select id,name,address,phone from customer";
return getForList(sql1);
}
@Override
//插入数据到数据库的方法
public void save(Customer customer) {
String sql2="insert into customer(name,address,phone) values(?,?,?)";
update(sql2, customer.getName(),customer.getAddress(),customer.getPhone());
}
@Override
//获取某个数据
public Customer get(Integer id) {
String sql3="select id,name,address,phone from customer where id=?";
return get(sql3,id);
}
@Override
//删除id=?的数据
public void delete(Integer id) {
String sql4="delete from customer where id=?";
update(sql4, id);
}
推荐一个非常的开源平台的给你,部署简单,特别适合入门,若依开发框架,地址:https://gitee.com/y_project/RuoYi
个人认为楼上的两位说的对,如果不是为了纯粹的写论文或者搞清楚原理,完全可以使用现成的框架来做网站,少了很多bug,效率也高