用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字

小蜜锋    -  云代码空间

—— 技术宅拯救世界!

广东海洋大学体育馆管理系统 开发日记(13)——数据库访问层(DAO)

2013-02-03|3076阅||

摘要:由于数据库访问层属于底层,因此不分管理员和用户模块。dao是数据库访问对象(Data Access Objects)的缩写,服务层可以通过调用相关的dao实现跟数据库交互,dao的作用就是隐藏数据库操作的细节,并且提高数据库安全性,防止误操作。

        由于数据库访问层属于底层,因此不分管理员和用户模块。dao是数据库访问对象(Data Access Objects)的缩写,服务层可以通过调用相关的dao实现跟数据库交互,dao的作用就是隐藏数据库操作的细节,并且提高数据库安全性,防止误操作。
        跟服务层一样,dao里存放接口,dao.impl里存放实现类。目录结构如下:



        下面就UserDao讲解一下。
UserDao.java
package com.gym.dao;

import java.util.List;

import com.gym.model.UserModel;

public interface UserDao {

	/**
	 * 添加用户
	 * 
	 * @param userModel
	 * @return
	 */
	public int addUser(UserModel userModel);

	/**
	 * 删除用户
	 * 
	 * @param aId
	 * @return
	 */
	public int delUser(String uId);

	/**
	 * 修改用户信息
	 * 
	 * @param userModel
	 * @return
	 */
	public int alterUser(UserModel userModel);

	/**
	 * 修改用户密码
	 * 
	 * @param userModel
	 * @return
	 */
	public int alterUserPwd(UserModel userModel);

	/**
	 * 查询所有用户
	 * 
	 * @return
	 */
	public List queryUser();

	/**
	 * 根据用户名字查询用户
	 * 
	 * @param aName
	 * @return
	 */
	public UserModel queryUserByName(String uName);

	/**
	 * 根据用户id查询用户
	 * 
	 * @param aId
	 * @return
	 */
	public UserModel queryUserById(String uId);

	/**
	 * 查询此用户id是否存在
	 * 
	 * @param aId
	 * @return
	 */
	public boolean isExist(String uId);

	/**
	 * 启用用户
	 * 
	 * @param aId
	 * @return
	 */
	public boolean onUser(String uId);

	/**
	 * 禁用用户
	 * 
	 * @param aId
	 * @return
	 */
	public boolean offUser(String uId);

	/**
	 * 验证用户名密码
	 * 
	 * @param userModel
	 * @return
	 */
	public UserModel checkUser(UserModel userModel);

	/**
	 * 查询我的预约
	 * 
	 * @param userModel
	 * @return
	 */
	public List queryMyBook(UserModel userModel);

	/**
	 * 查询我的租借
	 * 
	 * @param userModel
	 * @return
	 */
	public List queryMyRent(UserModel userModel);

}
         以上是UserDao接口,具备用户的增删改查基本操作。其中添加、删除、修改类操作一般返回int类型,这是sql语句执行后影响的行数,如果为1,说明操作成功,否则,说明操作失败;而查询类操作一般返回List对象,List中每一行对应一个userModel,这是一个javabean,是MVC中的M(Model),关于userModel下一篇文章会讲到。这个接口的实现类代码稍长,就不全部粘贴过来了。
添加用户的实现代码:
	public int addUser(UserModel userModel) {
		// TODO Auto-generated method stub
		Statement statement = DbConnection.getStatement();
		int affect = 0;

		String sql = "INSERT INTO `user` "
				+ "(uId, uName, uPassword, uEmail, uIdCard, uPhone, date, status)"
				+ "VALUES( '" + userModel.getuId() + "', '"
				+ userModel.getuName() + "', '" + userModel.getuPassword()
				+ "', '" + userModel.getuEmail() + "', '"
				+ userModel.getuIdCard() + "', '" + userModel.getuPhone()
				+ "', '" + userModel.getDate() + "','1')";
		// System.out.println(sql);

		try {
			affect = statement.executeUpdate(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return affect;
	}
        注册的时候会调用到这个代码,如果要查看执行的sql语句,可以打开// System.out.println(sql);前面的开关。
INSERT INTO `user` (uId, uName, uPassword, uEmail, uIdCard, uPhone, date, status)VALUES( '201011700000', '郭剑锋', '0e484dad66ec4f08e101ac9b28bc805d', '1421560459@qq.com', '400000000000000000', '13000000000', '2013-2-3 21:12:20','1')
        密码在服务层已经经过md5加密。

	public List queryUser() {
		// TODO Auto-generated method stub

		Statement statement = DbConnection.getStatement();
		ResultSet resultSet = null;
		UserModel userModel = null;

		List list = new ArrayList();

		String sql = "SELECT * FROM `user`";
		System.out.println(sql);

		try {
			resultSet = (ResultSet) statement.executeQuery(sql);

			while (resultSet.next()) {
				userModel = new UserModel();
				userModel.setDate(resultSet.getString("date"));
				userModel.setStatus(resultSet.getString("status"));
				userModel.setuEmail(resultSet.getString("uEmail"));
				userModel.setuId(resultSet.getString("uId"));
				userModel.setuIdCard(resultSet.getString("uIdcard"));
				userModel.setuName(resultSet.getString("uName"));
				userModel.setuPassword(resultSet.getString("uPassword"));
				userModel.setuPhone(resultSet.getString("uPhone"));

				list.add(userModel);
			}

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return list;

	}

        管理员查询所有用户时,把数据库查询记录遍历,每一行的每个字段都封装进去userModel里面,所有userModel封装在ArrayList里面,前台通过以下方式调用:
      <c:forEach items="${requestScope.userList}" var="list">
        <tr>
          <td>${list.getuId()}</td>
          <td>${list.getuName()}</td>
          <td>${list.getuEmail()}</td>
          <td>${list.getuIdCard()}</td>
           <td>${list.getStatus()}</td>
          <td><a href="index.html?action=deluser&uid=${list.getuId()}">封禁</a></td>
        </tr>
      </c:forEach>
        注意顶部要导入jstl标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

        为了方便,我在数据库连接类里面写了一个方法getStatement(),直接返回Statement对象,整个系统只用一个Connection对象。这样如果频繁访问数据库的话,可能会造成性能下降,因为只用了一个连接。
        Connection和Statement对象都
没有使用close()方法,让jvm调度自动关闭。如果Connection自动关闭了,下次调用时会自动重新连接。而Statement则是每次都返回一个新的对象,用过的让jvm自动垃圾回收。其实也可以像Connection那样使用单例模式,但这个项目用到的数据库驱动不支持statement.isClosed(),没办法判断是否已关闭,所以每次都新建一个新的返回。也可以在dao类中显式调用statement.close()方法,时间关系,代码就不改了。
	/**
	 * 获取 Statement
	 * 
	 * @return
	 * @throws SQLException
	 */
	public static Statement getStatement() {

		try {
			// 判断conn是否为空或已关闭
			if (conn == null || conn.isClosed()) { // 重新连接数据库

				String url = "jdbc:mysql://localhost/gymdb?user=" + dbUser
						+ "&password=" + dbPassword
						+ "&characterEncoding=utf-8";

				try {
					Class.forName("org.gjt.mm.mysql.Driver").newInstance();
				} catch (InstantiationException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (IllegalAccessException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (ClassNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}

				try {
					conn = DriverManager.getConnection(url, dbUser, dbPassword);
					System.out.println("数据库连接成功");
					statement = (Statement) conn.createStatement();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				return statement;

			} else {// 使用旧连接

				statement = (Statement) conn.createStatement();

			}

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return statement;

	}




顶 7踩 1收藏
文章评论
    发表评论

    个人资料

    • 昵称: 小蜜锋
    • 等级: 高级设计师
    • 积分: 7088
    • 代码: 757 个
    • 文章: 360 篇
    • 随想: 211 条
    • 访问: 1261 次
    • 关注

    标签

    设计模式(4)java(9)命名规范(2)广告创意(1)愤怒的小鸟(1)游戏(5)jsp(1)配置(1)Surface(1)windows(1)javabean(1)设计方法(1)开发工具(2)web(4)大数据(2)GPU(1)硬盘(1)内部结构(1)黑客(1)窃取(1)编码(1)解决方法(1)php(28)mysql(9)数据库备份(1)数据库还原(1)命令(2)数据库(1)安装(1)2012(2)世界末日(3)仙剑5前传(1)默哀(1)电源(1)女生(1)装饰器模式(2)古剑奇谭(1)电脑桌(1)史上最牛(1)编程语言(2)小米(3)电视机顶盒(1)营销策略(1)Android(8)手势(1)诺亚方舟(1)Eclipse(1)汽车(1)操作系统(1)软件(1)互联网(5)大事记(1)设计师(2)壁纸(1)古剑奇谭2(1)古剑奇谭网络版(1)云计算(2)服务器(1)框架(2)Socket(1)jquery(1)构造函数执行顺序(1)火车票(1)3D(1)数据中心(2)正则表达式(2)Web前端(1)开发框架(1)系统瘫痪(1)12306(2)cpu(1)javascript(2)开发日记(15)体育馆管理系统(15)网页设计(1)CSS3(3)腾讯(3)小游戏(1)interface(1)平板(2)面试(2)设计(5)摄影(2)数据挖掘(1)钢琴谱(1)情人节(1)陈欧体(1)程序员(3)漫画(1)UserAgent(1)iPhone(2)NoSQL(1)ui(9)越狱(1)指南(1)abstract(1)css(3)git(2)八核(2)三星(1)linux(11)数据类型(1)html5(2)UML(2)perftools(1)创意(1)logo(1)色谱(1)响应式(5)Metro(2)虚拟机(1)jvm(1)垃圾回收(1)left(1)join(1)连接查询(1)溯源系统(1)Override(1)SAE(2)WordPress(1)指针(1)链表(1)系统分析师(1)中间件(1)corba(1)static(1)无线(1)监控(1)iPad(1)Apache(2)比特币(2)命名规则(1)手机支付(1)curl(3)笔记(1)导航(1)thinkphp(1)异常导致本地路径泄漏(1)web设计(1)网络安全(1)诗句(1)4K对齐(1)代码库(1)色彩(1)动画片(1)struts2(3)漏洞(5)确认框(1)心情驿站(1)ArscEditor(1)resources.(1)apktool(1)AppKey(1)新浪微博(1)app(5)广告(3)赚钱(1)响应式布局(1)html(1)淘宝(2)微信(1)重构(5)缓存(1)破解(1)后门(1)七夕(1)SEO(2)概念设计(1)面向对象(1)bootstrap(1)性能(2)优化(1)iis(1)爬虫(1)采集(1)算法(2)文本相似度(2)cto(1)js(1)fsockopen(1)扁平化设计(2)网页(1)心情(7)小米电视(1)开箱(1)励志(2)招聘(3)命名(1)notepad++(1)python(1)配色(3)扁平化(4)ps(2)搞笑(2)创业(3)渲染(1)电影(1)模板(1)微博(1)企业家(1)公司(1)总结(1)前端(1)运营(1)变形(1)svn(4)教程(3)搜狗(1)泄密(1)双11(1)天猫(1)UC(1)启动界面(1)光棍节(1)双十一(2)物流(1)备份(1)更新(1)插入(1)插件(2)jsTree(1)(1)海量数据(1)分辨率(1)草图(1)手绘(1)速度(1)文本处理(1)实习(1)感想(1)文件(1)简历(1)65.49.2.17(1)yum(1)解决办法(1)阿里云(2)推广(1)来往(1)春运(1)LBS(1)gb2312(1)utf-8(1)log4j(1)详解(1)收购(1)私服(1)TortoiseGi(1)post(1)异常(2)flappyBird(1)应用创新大赛(1)宙斯杯(1)学习方法(1)xp(1)退役(1)安全(1)技术贴(1)flash(1)刷机(1)京东(1)电商(1)Tomcat(1)JDK(1)免费(1)长投影(1)图标(1)Photoshop(1)云端集成开发环境(1)软件开发(1)可视化(1)工具(2)OpenSSL(1)Heartbleed(1)vsftp(1)中国知网(1)学术论文(1)免费下载(1)开发(1)手册(1)速查表(1)追随战略(1)sdk(1)文章(1)发布(1)文件管理(1)沙画(1)动效(2)原型(1)感悟人生(1)哲理(1)Bash(1)类图(1)知识管理(1)Console(1)调试命令(1)rpm(1)报错(1)挂载(1)数据盘(1)云主机(1)产品经理(1)原型设计(1)mql4(1)mt4(1)ea(1)程序化交易(1)CURLOPT_PO(1)阿里云​(1)CentOS6(2)OpenSSH(1)漏洞修复(2)升级(1)安骑士(1)链克(1)

    站长推荐