JDBC-DAO经典模式 实现对数据库的增、删、改、查
JDBC(Java Data Base Connection)的作用是连接数据库
先看下jdbc连接SQLServer数据库的简单例子
代码实现(FirstJDBC):
- package com.jdbc;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.Statement;
- public class FirstJDBC {
- public static void main(String[] args)
- {
- //调用连接数据库的操作
- Connection con = createConnection();
- }
- /**
- * JDBC 建立 SQL Server数据库连接
- */
- private static Connection createConnection() {
- //定义加载驱动程序
- String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
- //定义 连接 服务器 和 数据库sample
- String dbURL = "jdbc:sqlserver://localhost:1433; DataBaseName = sample1" ;
- //默认用户名,不要用windows默认身份验证
- String userName = "sa" ;
- String userPassword = "zhichao" ;
- Connection connection = null ;
- Statement sta = null ;
- try {
- //正式加载驱动
- Class.forName(driverName);
- //开始连接
- connection = DriverManager.getConnection(dbURL, userName, userPassword);
- System.out.println("Connection Success !");
- //向数据库中执行SQL语句
- sta = connection.createStatement() ;
- ResultSet rs = sta.executeQuery("SELECT id,name,height From Table_1");
- while(rs.next())
- {
- int id = rs.getInt("id");
- String name = rs.getString("name");
- float height = rs.getFloat("height");
- System.out.println("id = "+id+" name = "+name+" height = "+height);
- }
- } catch (Exception e) {
- System.out.println("Connection Fail !");
- e.printStackTrace() ;
- }
- /**
- * 关闭数据库
- * @param connection
- */
- finally
- {
- try {
- if (null != sta)
- {
- sta.close() ;
- sta = null;
- System.out.println("Statement 关闭成功");
- }
- if (null != connection)
- {
- connection.close() ;
- connection = null;
- System.out.println("Connection 关闭成功");
- }
- } catch (Exception e) {
- e.printStackTrace() ;
- }
- }
- return connection ;
- }
- }
小结:
要写一个jdbc程序,先要加载相应数据库的驱动程序,驱动程序最好放在你建的工程里面,可以在你的工程下面建一个 lib文件夹以存储外部的jar文件,这样的话把你的工程拷贝到别的计算机运行,仍能成功执行。
jdbc代码一般步骤:
1)加载外部驱动程序(jar包)
2)正式加载驱动程序 (Class.forName(driverName) )
3)获取connection连接 (在jdk中的sql包中,只提供了一个类那就是DriverManeger,通过调用它的静态方法getConnection(),可以得到以数据库的连接
4)创建sql语句的声明(Statement),执行sql语句(查询),遍历结果集
5)关闭数据库连接(一般用finally{}来处理,或者调用方法的形式来完成,关闭之前先判断你要关闭的对象连接是否为空,如果空那会抛异常,所以先判断)
------------------------------------- ------------------------------------- ------------------------Data Access Objects-------------------- ------------------------------------------- ---------------------------
使用 DAO模式 来对数据库做增删改查操作
这种模式可以大概分为三个层:1.DAO层 2.服务层 3.表现层
1)表现层 :相当于客户端用来查看,提交信息的角色
2)服务层 :是表现层和DAO层的纽带,其实也没干什么事就是通知消息的角色
3)DAO :真正要做事的角色(对数据库的某些操作)
举个生活中的例子:
就好比你去餐厅吃饭,你充当一个 (表现层)的角色,然后有美女服务员(服务层),问你需要吃什么东西,给你下一张订单,让你填。之后服务员把订单传到 厨师(DAO层)那里,具体操作厨师会搞定,一段时间后厨师把做好的食物传给服务员,服务员把食物在传给客户,这些操作就算基本完成了。
执行顺序: 表现层-->服务层-->DAO层-->返回服务层-->返回表现层
来看看实现DAO模式的UML图:

代码实现:
1.Bean文件,在这主要作用(有点像中介存储的角色):当从数据库拿出数据后,一个个set到该类里,进行赋值,然后把该对象放到集合中,之后再get出来
Student.java
- package com.myjdbc.bean;
- public class Student {
- private Integer stuId;
- private String stuName ;
- private Integer stuAge;
- private String stuTel ;
- private String stuAddress ;
- private Integer groupId;
- public Integer getStuId() {
- return stuId;
- }
- public void setStuId(Integer stuId) {
- this.stuId = stuId;
- }
- public String getStuName() {
- return stuName;
- }
- public void setStuName(String stuName) {
- this.stuName = stuName;
- }
- public Integer getStuAge() {
- return stuAge;
- }
- public void setStuAge(Integer stuAge) {
- this.stuAge = stuAge;
- }
- public String getStuTel() {
- return stuTel;
- }
- public void setStuTel(String stuTel) {
- this.stuTel = stuTel;
- }
- public String getStuAddress() {
- return stuAddress;
- }
- public void setStuAddress(String stuAddress) {
- this.stuAddress = stuAddress;
- }
- public Integer getGroupId() {
- return groupId;
- }
- public void setGroupId(Integer groupId) {
- this.groupId = groupId;
- }
- }
2.java连接数据库的基本操作及关闭,封装在一个类中
JDBCUtils.java
- package com.myjdbc.utils;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.Statement;
- public class JDBCUtils {
- /**
- * 获取连接
- *
- */
- public static Connection getConnection()
- {
- String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
- String url = "jdbc:sqlserver://localhost:1433; DataBaseName = studentManager";
- String user = "sa" ;
- String password = "zhichao";
- Connection con = null ;
- try {
- Class.forName(driverName);
- con = DriverManager.getConnection(url, user, password);
- System.out.println("success");
- } catch (Exception e) {
- e.printStackTrace();
- }
- return con ;
- }
- /**
- * 关闭连接
- */
- public static void free(ResultSet rs, Statement sta , Connection con)
- {
- try {
- if(null != rs)
- {
- rs.close();
- rs = null ;
- }
- if(null != sta)
- {
- sta.close();
- sta = null ;
- }
- if(null != con)
- {
- con.close();
- con = null ;
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
3.定义一个DAO接口
StudentDAO.java
- package com.myjdbc.dao;
- import java.util.Set;
- import com.myjdbc.bean.Student ;
- public interface StudentDAO {
- public int addStudent(Student student) ;
- public int deleteStudent(String name);
- public int updateStudent(String name);
- public Student findStudent(String name);
- public Set<Student> findAll();
- }
4.实现DAO接口的类,具体DAO,做重要工作的类
ConcreteStudentDao.java
- package com.myjdbc.dao;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.HashSet;
- import java.util.Set;
- import com.myjdbc.bean.Student;
- import com.myjdbc.dao.StudentDAO;
- import com.myjdbc.utils.JDBCUtils;
- public class ConcreteStudentDao implements StudentDAO{
- //增加一个学生
- public int addStudent(Student student)
- {
- Connection con = null ;
- PreparedStatement ps = null ;
- int i = 0 ;
- try
- {
- con = JDBCUtils.getConnection();
- String sql = "insert into student(stuName,stuAge,stuTel,stuAddress,groupId) values(?,?,?,?,?)";
- ps = con.prepareStatement(sql);
- ps.setString(1, student.getStuName());
- ps.setInt(2, student.getStuAge());
- ps.setString(3, student.getStuTel());
- ps.setString(4, student.getStuAddress());
- ps.setInt(5, student.getGroupId());
- i = ps.executeUpdate() ;
- }
- catch(SQLException e)
- {
- throw new DAOException(e.getMessage(),e);
- }
- finally
- {
- JDBCUtils.free(null, ps, con);
- }
- return i;
- }
- //删除一个学生
- public int deleteStudent(String name)
- {
- Connection con = null ;
- PreparedStatement ps = null ;
- int i = 0 ;
- try
- {
- con = JDBCUtils.getConnection();
- String sql = "delete from student where stuName =?";
- ps = con.prepareStatement(sql);
- ps.setString(1, name);
- i = ps.executeUpdate() ;
- }
- catch(SQLException e)
- {
- throw new DAOException(e.getMessage(),e);
- }
- finally
- {
- JDBCUtils.free(null, ps, con);
- }
- return i;
- }
- //修改一个学生
- public int updateStudent(String name)
- {
- Connection con = null ;
- PreparedStatement ps = null ;
- int i = 0 ;
- try
- {
- con = JDBCUtils.getConnection();
- String sql = "update student set stuAge=stuAge+1 where stuName =?";
- ps = con.prepareStatement(sql);
- ps.setString(1, name);
- i = ps.executeUpdate() ;
- }
- catch(SQLException e)
- {
- throw new DAOException(e.getMessage(),e);
- }
- finally
- {
- JDBCUtils.free(null, ps, con);
- }
- return i;
- }
- //查询一行
- public Student findStudent(String name)
- {
- Connection con = null ;
- PreparedStatement ps = null ;
- Student stu = null ;
- ResultSet rs = null;
- try
- {
- con = JDBCUtils.getConnection();
- String sql = "select stuName,stuAge,stuTel,stuAddress,groupId from student where stuName =?";
- ps = con.prepareStatement(sql);
- ps.setString(1, name);
- rs = ps.executeQuery() ;
- stu = new Student();
- while(rs.next())
- {
- stu.setStuName(rs.getString(1));
- stu.setStuAge(rs.getInt(2));
- stu.setStuTel(rs.getString(3));
- stu.setStuAddress(rs.getString(4));
- stu.setGroupId(rs.getInt(5));
- }
- }
- catch(SQLException e)
- {
- throw new DAOException(e.getMessage(),e);
- }
- finally
- {
- JDBCUtils.free(rs, ps, con);
- }
- return stu;
- }
- //查询所有
- public Set<Student> findAll()
- {
- Connection con = null ;
- PreparedStatement ps = null ;
- Student stu = null ;
- ResultSet rs = null;
- Set<Student> set = null ;
- try
- {
- con = JDBCUtils.getConnection();
- String sql = "select stuName,stuAge,stuTel,stuAddress,groupId from student";
- ps = con.prepareStatement(sql);
- set = new HashSet<Student>() ;
- rs = ps.executeQuery() ;
- while(rs.next())
- {
- stu = new Student();
- stu.setStuName(rs.getString(1));
- stu.setStuAge(rs.getInt(2));
- stu.setStuTel(rs.getString(3));
- stu.setStuAddress(rs.getString(4));
- stu.setGroupId(rs.getInt(5));
- set.add(stu);
- }
- }
- catch(SQLException e)
- {
- throw new DAOException(e.getMessage(),e);
- }
- finally
- {
- JDBCUtils.free(rs, ps, con);
- }
- return set;
- }
- }
5.自定义异常 继承了运行时异常,具体操作让父类实现
DAOException.java
- package com.myjdbc.dao;
- /**
- * 自定义异常
- * @author Administrator
- *
- */
- public class DAOException extends RuntimeException {
- public DAOException()
- {
- super();
- }
- public DAOException(String messege,Throwable cause)
- {
- super(messege,cause);
- }
- public DAOException(String messege)
- {
- super(messege);
- }
- public DAOException(Throwable cause)
- {
- super(cause);
- }
- }
6定义一个服务类(服务层),本来还要定义一个接口,这里简写了,客户与DAO的纽带,持有DAO对象的引用
StudentService.java
- package com.myjdbc.service;
- import java.util.Set;
- import com.myjdbc.bean.Student;
- import com.myjdbc.dao.StudentDAO;
- import com.myjdbc.dao.ConcreteStudentDao;
- public class StudentService {
- StudentDAO sd = new ConcreteStudentDao();
- public int add(Student student)
- {
- return this.sd.addStudent(student);
- }
- public int delete(String name)
- {
- return this.sd.deleteStudent(name);
- }
- public int update(String name)
- {
- return this.sd.updateStudent(name);
- }
- public Student find(String name)
- {
- return this.sd.findStudent(name);
- }
- public Set<Student> findAll()
- {
- return this.sd.findAll();
- }
- }
7.定义一个测试类,相当于 (表现层)
Client.java
- package com.myjdbc.test;
- import java.util.HashSet;
- import java.util.Iterator;
- import java.util.Set;
- import com.myjdbc.bean.Student;
- import com.myjdbc.service.StudentService;
- public class Client {
- public static void main(String[] args)
- {
- Student stu = new Student();
- Set<Student> set = new HashSet<Student>();
- // stu.setStuName("zhangsan");
- // stu.setStuAge(20);
- // stu.setStuTel("18779157911");
- // stu.setStuAddress("china");
- // stu.setGroupId(1);
- StudentService ss = new StudentService();
- //System.out.println(ss.add(stu));
- //System.out.println(ss.delete("aa"));
- //System.out.println(ss.update("bb"));
- //stu = ss.find("cc");
- //System.out.println(stu.getStuName() +" " +stu.getStuAge()+" "+stu.getStuTel()+" "+stu.getStuAddress()+" "+stu.getGroupId());
- set = ss.findAll() ;
- Iterator<Student> iterator = set.iterator();
- while(iterator.hasNext())
- {
- Student student = (Student)iterator.next() ;
- System.out.println(student.getStuName() +" " +student.getStuAge()+" "+student.getStuTel()+" "+student.getStuAddress()+" "+student.getGroupId());
- }
- }
- }
JDBC-DAO经典模式 实现对数据库的增、删、改、查的更多相关文章
- 怎样从C#中打开数据库并进行 增 删 改 查 操作
首先 在C#中引用数据库的操作! (因为我们用的是SQLserver数据库,所以是SqlClient) using System.Data.SqlClient; 1:要实现对数据库的操作,我们必须先登 ...
- 简单的php数据库操作类代码(增,删,改,查)
这几天准备重新学习,梳理一下知识体系,同时按照功能模块划分做一些东西.所以.mysql的操作成为第一个要点.我写了一个简单的mysql操作类,实现数据的简单的增删改查功能. 数据库操纵基本流程为: 1 ...
- Django(十)模型:django模型类对数据库的:增/删/改/查、自关联、管理器、元选项(指定表名)
一.插入.更新和删除 调用一个模型类对象的save方法的时候就可以实现对模型类对应数据表的插入和更新. 调用一个模型类对象的delete方法的时候就可以实现对模型类对应数据表数据的删除. 二.自关联 ...
- JDBC中执行sql语句的 增 , 删 , 改 , 查 的方法
executeQuery() : 执行 SELECT 语句,它几乎是使用最多的 SQL 语句 executeUpdate() : 执行 INSERT.UPDATE 或 DELETE 语句以及 S ...
- 第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据
第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据 ADO.NET 为什么要学习? 我们要搭建一个平台(Web/Winform ...
- 【WPF学习笔记】之如何通过后台C#代码添加(增/删/改按钮)实现对SQLServer数据库数据的更改
首先,需要连接SQLServer数据库的服务器名称server.数据库名database.数据库用户名uid以及密码pwd,如下图: 然后需要以下数据库SQL代码段,还有一个myHelper.cs代码 ...
- JDBC 笔记3 通过PreparedStatement 对数据库进行增删改查 (转载)
之前MVC时一直用它,学了框架后就没怎么用了.这里转载一位同学的博客,以后可能也会用到的. 转自:https://www.cnblogs.com/zilong882008/archive/2011/1 ...
- PHP数据库的 增 删 查
一.匹配数据库登录 步骤: 1.做一个普通的登录界面,注意提交方式为post. <!--登录界面--> <form action="chuli.php" meth ...
- django中对数据库的增删改查
Django的配置文件时settings.py中的 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplate ...
随机推荐
- Codeforces 160 D. Edges in MST
\(>Codeforces \space 160 D. Edges in MST<\) 题目大意 : 给出一张带权无向图,求对于这张图上的每一条边,其是必然存在于每一种最小生成树中,还是至 ...
- POJ2222 Keywords Search AC自动机模板
http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:给出一些单词,求多少个单词在字符串中出现过(单词表单词可能有相同的,这些相同的单词视为不同的分别计数 ...
- 【插头DP】hdu1964-Pipes
[题目大意] 给出一个网格,经过边要付出代价.求走过每一个格子的欧拉回路的最小代价.[思路] 裸裸的插头DP~然而写了好久orz [错误点] 整个人跟制杖了一样QAQ hash实力写挂…m和n搞反了. ...
- bzoj1715 虫洞
Description John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N ...
- 读书笔记_Effective_C++_条款二十六:尽可能延后变量定义式的出现时间
这个条款从字面意思还是很好理解的,就是在使用这个变量前才去定义,而不是很早就定义了它,而在很后面的时候才去使用.这个条款只适用于对变量声明位置没有要求的语言,比如C++.对于像C或者一些脚本语言,语法 ...
- AMScrollingNavbar框架(自动隐藏导航栏)使用简介
AMScrollingNavbar框架是一个可以上拉隐藏导航栏和下拉显示导航栏的框架,这个开源框架的调用也很简单,本章节就给大家介绍一下这个框架的用法. 一.下载及导入框架 AMScrollingNa ...
- Shell基础学习(七) 输入输出重定向
命令 说明 command>file 将输出重定向到file command<file 将输入重定向到file command >> file 将输出追加到file n > ...
- mybatis源码分析(4)----org.apache.ibatis.binding包
1. 我们通过接口操作数据库时,发现相关的操作都是在org.apache.ibatis.binding下 从sqSessin 获取getMapper() SqlSession session = s ...
- android启动之SystemServer启动
SystemServer是Android系统的核心,APK应用中可以直接交互的大部分系统服务都在该进程中执行,常见的比方WindowManagerServer(Wms).ActivityManager ...
- Assembly.Load()方法,Assembly.LoadFrom()方法,Assembly.LoadFile()方法的区别!
参考: http://www.cnblogs.com/benwu/archive/2009/10/24/1589096.html http://www.cnblogs.com/xuefeng1982/ ...