如题:此BaseDao实现的功能是增删查改。诞生背景是学院要求我们做JavaWeb课程设计,要求:只能使用原生的Servlet等开发,而不能使用SSM,SpringBoot,SSH等框架。
遇到的问题和解决办法:由于原生的JavaWeb开发需要写大量的Dao操作,这些Dao操作都会有最基本的增删查改,大量相对比较重复且写起来毫无营养的SQL语句,以及Java代码,会使人写得很厌烦。于是我研究了一下Hibernate和Mybatis的一些源码,理解和学习了Jpa的思想,借助Apache的开源项目——DBUtils操作数据库,c3p0管理数据源,实现和封装了这个BaseDao,让我免于写那些重复的SQL,以及没有营养的Java增删查改代码。
以前每个Dao类都要自己实现增删查改方法,大量重复的工作,一直做。现在不需要了,BaseDao类似Jpa只需要写一个Dao类继承自BaseDao,即可自动拥有增删查改模糊查询等方法,满足日常开发需要。
现在将我写的BaseDao项目分享出来,希望给后来者提供一些参考,帮助大家理解框架和更好的完成JavaWeb课程设计。
BaseDao项目结构图:
项目依赖:c3p0(管理数据源)、mysql驱动(连接数据库)、dbutils(jdbc操作)
项目介绍:
wiki.zimo.annotation包是放自定义注解的包,该包下有五个自定义注解类,功能分别是:
Table类:@Table,标注实体类对应的关系数据库(MySQL)表名。
ID类:@ID,标注实体类的属性对应的字段为数据表的主键。
AutoIncrement类:@AutoIncrement,标注实体类ID是否是自增的,主键为Integer时,默认自增(当主键为Integer时,有效,配置在非主键字段无效,即要配合@ID注解一起使用)。
Column类:@Column,标注实体类的属性对应的字段为数据表的非主键字段,即普通字段。
Keyword类:@Keyword,标注实体类的普通字段是否用于模糊查询(当配合@Column注解一起使用时,有效)。
wiki.zimo.dao包是存放Dao接口的包,该包下只有一个Dao接口。功能是定义BaseDao的规范,即定义BaseDao需要实现什么功能。
wiki.zimo.dao.impl是存放BaseDao类的包,该包下有着Dao类的实现和BaseDao的源码(核心)。
wiki.zimo.utils是存在工具类的包,该包下有两个工具类,分别是封装的数据源工具类,以及驼峰命名工具类。
使用方法:以写一个用户管理的小项目为例。
建立的MySQL数据表结构如下:
# Host: localhost (Version: 5.5.53)
# Date: 2019-08-02 20:38:33
# Generator: MySQL-Front 5.3 (Build 4.234)
/*!40101 SET NAMES utf8 */;
#
# Structure for table "user"
#
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(255) DEFAULT NULL,
`user_password` varchar(255) DEFAULT NULL,
PRIMARY KEY (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
- 导入依赖包,将这四个包复制到 /你的项目/WebContent/WEB-INF/lib下
- 导入BaseDao.jar,将BaseDao.jar复制到 /你的项目/WebContent/WEB-INF/lib下,下载链接我会放在文末
- 配置c3p0,新增配置文件,在 /你的项目/src/c3p0-config.xml,注意:必须有默认配置的数据源。其他参考下面的配置,改为你自己的项目数据库用户名和密码以及jdbcUrl即可。
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/test?useSSL=false</property> <property name="user">test</property> <property name="password">test</property> <property name="checkoutTimeout">15000</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> <property name="maxStatements">200</property> </default-config> </c3p0-config>
- 新建实体类加上相关注解,如下
package wiki.zimo.domain; import wiki.zimo.annotation.Column; import wiki.zimo.annotation.ID; import wiki.zimo.annotation.Keyword; import wiki.zimo.annotation.Table; @Table("`user`") public class User { @ID("Id") private Integer Id; @Column("user_name") @Keyword private String userName; @Column("user_password") private String userPassword; //必须要有无参的构造方法 public User() { super(); } public User(Integer id) { this(id,null,null); } public User(String userName, String userPassword) { this(0,userName,userPassword); } public User(Integer id, String userName, String userPassword) { super(); Id = id; this.userName = userName; this.userPassword = userPassword; } public Integer getId() { return Id; } public void setId(Integer id) { Id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } @Override public String toString() { return "User [Id=" + Id + ", userName=" + userName + ", userPassword=" + userPassword + "]"; } }
- 编写Dao类继承自BaseDao
package wiki.zimo.dao; import wiki.zimo.dao.impl.BaseDao; import wiki.zimo.domain.User; public class UserDao extends BaseDao<Integer, User>{// 第一个泛型为主键的类型,一般只有两种,Integer或者String,第二个泛型是对应数据表的实体类 }
- 编写逻辑,简单的测试逻辑如下,示例代码,包括了基本的增删查改操作,如需进行其他操作,可以参考DBUtils的文档,所有继承自BaseDao的类默认存在一个qr(QueryRunner实例)。
package wiki.zimo.test; import wiki.zimo.dao.UserDao; import wiki.zimo.domain.User; public class Test { public static void main(String[] args) throws Exception { testInsert();//插入 // testUpdate();//更新 // testDelete();//删除 // testFindAll();//查询全部 // testFindOneById();//根据id查询 // testFuzzyQuery();//模糊查询 } private static void testFuzzyQuery() { System.out.println(new UserDao().getLikeSql()); } private static void testFindOneById() throws Exception { System.out.println(new UserDao().findOneById(1)); } private static void testFindAll() throws Exception { System.out.println(new UserDao().findAll()); } private static void testDelete() throws Exception { new UserDao().delete(new User(1)); } private static void testUpdate() throws Exception { Integer id = 1; String userName = "子墨修改了"; String userPassword = "123456"; UserDao dao = new UserDao(); User user = new User(id,userName,userPassword); dao.update(user); } private static void testInsert() throws Exception { String userName = "子墨"; String userPassword = "123456"; UserDao dao = new UserDao(); User user = new User(userName,userPassword); dao.insert(user); } }
- 一些效果图
- 实现Servlet逻辑复用,可参考我另一篇博客BaseServlet,博客地址:https://blog.csdn.net/qq_36737934/article/details/82911374
- BaseDao项目源代码以及打包好的jar包文件,包含完整测试项目,开源地址:
https://gitee.com/zimolove3/BaseDao - 使用BaseServlet和BaseDao项目开发的JavaWeb课程设计作品——子墨商城,功能包括但不限于:用户注册,登陆,邮箱验证,购买商品,购物车,后台商品管理,支付宝沙箱支付,商城管理员发货管理,后台商品统计,开源地址:https://gitee.com/pineapple_skin/ZimoStore