利用Java反射机制和自定义注解实现万能的BaseDao,功能类似Jpa,即不用写SQL语句,也可完成对数据库表进行增删查改操作

如题:此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;
  1. 导入依赖包,将这四个包复制到 /你的项目/WebContent/WEB-INF/lib下
  2. 导入BaseDao.jar,将BaseDao.jar复制到 /你的项目/WebContent/WEB-INF/lib下,下载链接我会放在文末
  3. 配置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>
  4. 新建实体类加上相关注解,如下
    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 + "]";
    	}
    	
    }
    
  5. 编写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,第二个泛型是对应数据表的实体类
    
    }
    
  6. 编写逻辑,简单的测试逻辑如下,示例代码,包括了基本的增删查改操作,如需进行其他操作,可以参考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);
    	}
    }
    
  7. 一些效果图
  8. 实现Servlet逻辑复用,可参考我另一篇博客BaseServlet,博客地址:https://blog.csdn.net/qq_36737934/article/details/82911374
  9. BaseDao项目源代码以及打包好的jar包文件,包含完整测试项目,开源地址:
    https://gitee.com/zimolove3/BaseDao
  10. 使用BaseServlet和BaseDao项目开发的JavaWeb课程设计作品——子墨商城,功能包括但不限于:用户注册,登陆,邮箱验证,购买商品,购物车,后台商品管理,支付宝沙箱支付,商城管理员发货管理,后台商品统计,开源地址:https://gitee.com/pineapple_skin/ZimoStore
发布了69 篇原创文章 · 获赞 50 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_36737934/article/details/93324649