文档章节

我的JDBC通用DAO(解说)

高得顺
 高得顺
发布于 2013/03/15 11:22
字数 1686
阅读 3242
收藏 50

前两篇的连接:

1,我的JDBC通用DAO  

2,我的JDBC通用DAO(续)

为了方便大家阅读和调试,现在把demo发出来

先介绍一下新增的类

首先是主角登场,业务模型类

@Table(name="model")
public class OneModel {
	private Integer id;
	private String name;
	private Date date;
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
    @Column(name = "test_name")
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	@Override
	public String toString() {
		return "OneModel [id=" + id + ", name=" + name + ", date=" + date + "]";
	}
}
这个类是和数据库中的表关联的,所以需要一个名叫test的库,然后建一张表
CREATE TABLE `model` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `name` varchar(64) DEFAULT NULL,
   `date` datetime DEFAULT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
然后就可以写模型的操作接口和实现了

先是模型操作接口

public interface ModelDao extends BaseDao<OneModel, Integer>{

}

再是接口实现

@Repository("modelDao")
public class ModelDaoImpl extends BaseDaoMysqlImpl<OneModel, Integer> implements ModelDao {
	public ModelDaoImpl() {
		super(OneModel.class);
	}
}

好了,写完了。你没看错,基本都是空的

咱写个main方法测一下

public class Main {
 public static void main(String[] args) {
     new Main().demo();
 }
 
 public void demo(){
     ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
     ModelDao modelDao=context.getBean("modelDao",ModelDao.class);
     //增
     OneModel model=new OneModel();
     model.setDate(new Date());
     model.setName("随便写");
     model=modelDao.save(model);
     Integer id=model.getId();
     //查一下
     model=modelDao.get(id);
     System.out.println(model);
     //改
     model.setName("再试一次");
     modelDao.update(model);
     //再查一下
     model=modelDao.get(id);
     System.out.println(model);
     //删了吧
     modelDao.del(id);
    }
}

增删改查全都搞定,是不是很简单?

什么?你说的用的不是jdbc?我晕...给你看日志

[2013-12-08 23:39:55,507] DEBUG main (BaseDaoMysqlImpl.java:269) - sql : insert into model(test_name,date) values(?,?) values:[随便写, Sun Dec 08 23:39:55 CST 2013]
[2013-12-08 23:39:55,933] INFO  main (BaseDaoMysqlImpl.java:129) - sql : select * from model where id=? values:[2]
OneModel [id=2, name=随便写, date=2013-12-08 23:39:55.0]
[2013-12-08 23:39:55,945] DEBUG main (BaseDaoMysqlImpl.java:375) - sql : update model set test_name=?, date=?  where id=? values:[再试一次, 2013-12-08 23:39:55.0, 2]
[2013-12-08 23:39:55,955] INFO  main (BaseDaoMysqlImpl.java:129) - sql : select * from model where id=? values:[2]
OneModel [id=2, name=再试一次, date=2013-12-08 23:39:55.0]
[2013-12-08 23:39:55,959] DEBUG main (BaseDaoMysqlImpl.java:415) - sql : delete from model where id=? values:[2]


2013-12-16 追加

小伙伴们要求写个多表查询的demo,就在这里了

最近几天事情比较多,天天加班,今天才有时间弄这个,很抱歉

好吧,现在切入正题

首选建测试表

CREATE TABLE `user` (
   `user_id` int(11) NOT NULL AUTO_INCREMENT,
   `user_name` varchar(32) DEFAULT NULL,
   PRIMARY KEY (`user_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `user_info` (
   `user_id` int(11) NOT NULL,
   `birthday` datetime DEFAULT NULL,
   `address` varchar(128) DEFAULT NULL,
   PRIMARY KEY (`user_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
然后是程序中对应的模型类
@Table(name = "user")
public class User {
	
	private Integer userId;
	private String userName;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "user_id")
	public Integer getUserId() {
		return userId;
	}

	public void setUserId(Integer userId) {
		this.userId = userId;
	}

	@Column(name = "user_name")
	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	@Override
	public String toString() {
		return "User [userId=" + userId + ", userName=" + userName + "]";
	}
}

@Table(name = "user_info")
public class UserInfo {
	
	private Integer userId;
	private Date birthday;
	private String address;
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "user_id")
	public Integer getUserId() {
		return userId;
	}
	public void setUserId(Integer userId) {
		this.userId = userId;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "UserInfo [userId=" + userId + ", birthday=" + birthday
				+ ", address=" + address + "]";
	}
}
相关的DAO层类就不给出了,请大家参照OneModel的相关接口与实现,或者下载打包好的代码  我的JDBC通用DAO(demo)


下边是测试方法和多表查询demo

public class Main1 {

	public static void main(String[] args) {
		new Main1().demo();
	}
	
	public void demo(){
		ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
		UserDao userDao = context.getBean("userDao",UserDao.class);
		UserInfoDao userInfoDao = context.getBean("userInfoDao",UserInfoDao.class);
		
		//首先插入测试数据
		User user = new User();
		user.setUserName("测试用户");
		user = userDao.save(user);
		
		UserInfo info = new UserInfo();
		info.setUserId(user.getUserId());
		info.setAddress("未知位置");
		info.setBirthday(new Date());
		info = userInfoDao.save(info);
		
		//查一下看看
		user = userDao.get(user.getUserId());
		System.out.println("保存后的user=" + user);
		info = userInfoDao.get(user.getUserId());
		System.out.println("保存后的userInfo=" + info);
		
		//改一下
		user.setUserName("改一改");
		userDao.update(user);
		System.out.println("修改后的user=" + user);
		
		//多表查询
		String searchSql = "select user.user_id, user_name, address, birthday "
				+ "from user, user_info where user.user_id = user_info.user_id "
				+ "and user.user_id = ?";
		List<Object> searchValues = new ArrayList<Object>();
		searchValues.add(user.getUserId());
		//可以使用Map作为多表查询结果的数据结构
		List<Map<String, Object>> totalInfoMap = userDao.searchForMap(searchSql, searchValues);
		System.out.println("map风格的查询结果totalInfoMap=" + totalInfoMap);
		//也可以自定义一个类作为多表查询结果的数据结构
		List<TotalUserInfo> totalInfo = userDao.search(searchSql, searchValues, TotalUserInfo.class);
		System.out.println("对象风格的查询结果totalInfo=" + totalInfo);
		
		//分页查询
		PageBean<TotalUserInfo> page = new PageBean<TotalUserInfo>();
		page.setPageNo(1);
		page = userDao.search(searchSql, searchValues, page , TotalUserInfo.class);
		System.out.println("分页查询结果 page=" + page);
	}
}

复杂查询的结果可以用java原生的map来存储(比较便捷),也可以自定义一个盒子(类)来存储查询结果,这种方式写出的代码风格会比较友好,所以我本人喜欢这种

测试中使用的盒子(类)的声明

/**
 * 这个类是一个盒子,仅仅用来装查询后的结果,在数据库中没有表和
 * 它对应,所以不用指定表名与主键
 */
public class TotalUserInfo {
	
	private Integer userId;
	private String userName;
	private Date birthday;
	private String address;
	
	public Integer getUserId() {
		return userId;
	}
	public void setUserId(Integer userId) {
		this.userId = userId;
	}
	
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "TotalUserInfo [userId=" + userId + ", userName=" + userName
				+ ", birthday=" + birthday + ", address=" + address + "]";
	}
}


最后看一下上边测试生成的日志:

[2013-12-16 23:40:17,903] INFO  main (BaseDaoMysqlImpl.java:277) - sql : insert into user(user_name) values(?) values:[测试用户]
[2013-12-16 23:40:18,120] INFO  main (BaseDaoMysqlImpl.java:266) - sql : insert into user_info(birthday,address,user_id) values(?,?,?) values:[Mon Dec 16 23:40:18 CST 2013, 未知位置, 1]
[2013-12-16 23:40:18,135] INFO  main (BaseDaoMysqlImpl.java:137) - sql : select * from user where user_id=? values:[1]
保存后的user=User [userId=1, userName=测试用户]
[2013-12-16 23:40:18,140] INFO  main (BaseDaoMysqlImpl.java:137) - sql : select * from user_info where user_id=? values:[1]
保存后的userInfo=UserInfo [userId=1, birthday=2013-12-16 23:40:18.0, address=未知位置]
[2013-12-16 23:40:18,145] INFO  main (BaseDaoMysqlImpl.java:383) - sql : update user set user_name=?  where user_id=? values:[改一改, 1]
修改后的user=User [userId=1, userName=改一改]
[2013-12-16 23:40:18,151] INFO  main (BaseDaoMysqlImpl.java:755) - sql : select user.user_id, user_name, address, birthday from user, user_info where user.user_id = user_info.user_id and user.user_id = ? values:[1]
map风格的查询结果totalInfoMap=[{user_id=1, user_name=改一改, address=未知位置, birthday=2013-12-16 23:40:18.0}]
[2013-12-16 23:40:18,154] INFO  main (BaseDaoMysqlImpl.java:670) - sql : select user.user_id, user_name, address, birthday from user, user_info where user.user_id = user_info.user_id and user.user_id = ? values:[1]
对象风格的查询结果totalInfo=[TotalUserInfo [userId=1, userName=改一改, birthday=2013-12-16 23:40:18.0, address=未知位置]]
[2013-12-16 23:40:18,158] INFO  main (BaseDaoMysqlImpl.java:435) - sql : select count(*) from (select user.user_id, user_name, address, birthday from user, user_info where user.user_id = user_info.user_id and user.user_id = ?) as _tn values:[1]
[2013-12-16 23:40:18,163] INFO  main (BaseDaoMysqlImpl.java:670) - sql : select user.user_id, user_name, address, birthday from user, user_info where user.user_id = user_info.user_id and user.user_id = ? limit 0,10 values:[1]
分页查询结果 page=PageBean [pageNo=1, nextNo=0, priorNo=0, pageCount=1, rowCount=1, pageSize=10, startRow=0, orderBy=null, orderType=null, pageList=null, pageListSize=10, list=[TotalUserInfo [userId=1, userName=改一改, birthday=2013-12-16 23:40:18.0, address=未知位置]], groupby=null]




最后是整个demo打包

我的JDBC通用DAO(demo)

osc博文没找到文件上传,就请各位移步代码分享模块下载吧

© 著作权归作者所有

高得顺

高得顺

粉丝 18
博文 4
码字总数 2891
作品 0
徐汇
高级程序员
私信 提问
加载中

评论(7)

J
Java编程思想
唉,问题找到了,和你的代码无关。
J
Java编程思想
我用了你的代码,可查询时,id无法映射到结果中,其它字段都可以,RowMapper里也有id啊,怎么回事?
何若智
何若智
79
linapex
linapex
我也是这么写的,貌似应该更简单一点。我现在是在Hibernate的基础上改进的。只有一些复杂的查询我才使用JDBC,我省略了Dao层,使用一个Service即可。或不使用Service层使用一个CommonDao即可。不在构造方法中写 指定类。。。

兼容性/跨数据库性良好,因为在Hibernate基础上。节省开发效率,编码人员集中处理业务逻辑即可。
zcqshine
zcqshine
不错...赞一个
小痴
小痴
赞!学习中。。。
寒武纪
寒武纪
赞,复用了hibernate的思想
hibernate、c3p0、jdbc理解

大家好,请教大家概念问题,hibernate、c3p0、jdbc这三者是什么关系, 我的理解是:hibernate 是对jdbc的封装,可以面向对象(实体类)实现数据操作,jdbc就是java api提供的连接操作数据库的...

樱木花道VS康
2017/06/30
270
2
Hibernate反射DAO模式

在持久层框架中,如果我们要像简单的JDBC连接数据库那样写一个通用的Dao方法的话,那么把JDBC简单的业务逻辑搬到hibernate持久层框架中,当然是不可能的,这里主要的问题就在于hibernate持久...

zretc
2013/07/19
625
0
jdbc一个connection 下的事务问题

jdbc一个connection 下的事务问题[转] 在不分层的情况下,一个JDBC事务处理代码片断如下: try { conn =DriverManager.getConnection("url","username","userpwd"; conn.setAutoCommit(false......

哎呦-又忘了
2016/01/25
490
4
基于 Maven Archetype 创建项目

说说如何使用 Maven Archetype 来创建项目模版,从项目模块结构上,统一开发规范 Maven Archetype 了解 maven 的同学,应该使用过如下命令来构建一个空的 项目骨架 这里我们看到下面的参数就是用...

fabself
2016/10/19
135
0
【广州】我想求职一份Java程序员的工作

您好! 在自我介绍之前,感谢您在百忙当中抽空浏览我的求职信。 楼主是一名毕业于佛山职业技术学院的应届生,信息安全专业。从大一第二学开始学Java起,就对这门编程语言产生浓厚兴趣,没有停...

__啊
2014/04/01
544
4

没有更多内容

加载失败,请刷新页面

加载更多

kubernetes pod exec接口调用

正文 一般生产环境上由于网络安全策略,大多数端口是不能为集群外部访问的。多个集群之间一般都是通过k8s的ApiServer组件提供的接口通信,如https://192.168.1.101:6443。所以在做云平台时,...

码农实战
36分钟前
4
0
3_数组

3_数组

行者终成事
今天
8
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部