发表于: 2017-05-19 02:25:18
7 1210
Task1第四天(2017年5月18日)
今日计划
学习DAO编写
十七.编写DAO,注意写清楚Interface和Impl,注意遵守命名规范。
模仿学习:
使用 DAO模式 来对数据库做增删改查操作
这种模式可以大概分为三个层:1.DAO层 2.服务层 3.表现层
1)表现层 :相当于客户端用来查看,提交信息的角色
2)服务层 :是表现层和DAO层的纽带,其实也没干什么事就是通知消息的角色
3)DAO :真正要做事的角色(对数据库的某些操作)
二、代码实现
以之前创建的数据表“apply”作为例子
1.Bean文件,在这主要作用(有点像中介存储的角色):当从数据库拿出数据后,一个个set到该类里,进行赋值,然后把该对象放到集合中,之后再get出来
Apply.Java
//选取 id,name,qq,profession,gschool,oath 做示例
package com.jdbc.bean;
public class Apply {
private Long id;
private String name ;
private String qq;
private String profession ;
private String gschool ;
private String oath;
public Long getid() {
return id;
}
public void setid(long id) {
this.id = id;
}
public String getname() {
return name;
}
public void setname(String name) {
this.name = name;
}
public String getqq() {
return qq;
}
public void setqq(String qq) {
this.qq = qq;
}
public String getprofession() {
return profession;
}
public void setprofession(String profession) {
this.profession = profession;
}
public String getgschool() {
return gschool;
}
public void setgschool(String gschool) {
this.gschool = gschool;
}
public String getoath() {
return oath;
}
public void setoath(String oath) {
this.oath = oath;
}
}
2.java连接数据库的基本操作及关闭,封装在一个类中
JDBCUtils.java
package com.jdbc.utils;
import java.sql.*;
public class JDBCUtils {
//获取连接
public static Connection getConnection()
{
String driverName = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost/students?serverTimezone = UTC";
String user = "root" ;
String password = "920901";
Connection con = null ;
try {
Class.forName(driverName);
con = DriverManager.getConnection(url, user, password);
System.out.println("连接数据库成功!");
} catch (Exception e) {
e.printStackTrace();
}
return con ;
}
//关闭连接
public static void free(ResultSet rs, Statement sta , Connection con)
{
try {
if(rs != null)
{
rs.close();
rs = null ;
}
if(sta != null)
{
sta.close();
sta = null ;
}
if(con!= null)
{
con.close();
con = null ;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.定义一个DAO接口
ApplyDAO.java
package com.jdbc.dao;
import java.util.Set;
import com.jdbc.bean.Apply ;
public interface ApplyDAO {
public int addApply(Apply apply) ;
public int deleteApply(String name);
public int updateApply(String name);
public Apply findApply(String name);
public Set<Apply> findAll();
}
4.实现DAO接口的类,具体DAO,做重要工作的类
ConcreteApplytDao.java
package com.jdbc.dao;
import java.sql.*;
import java.util.HashSet;
import java.util.Set;
import com.jdbc.bean.Apply;
import com.jdbc.dao.ApplyDAO;
import com.jdbc.utils.JDBCUtils;
public class ConcreateApplyDao implements ApplyDAO{
//增加一个申请
public int addApply(Apply apply)
{
Connection con = null ;
PreparedStatement ps = null ;
int i = 0 ;
try
{
con = JDBCUtils.getConnection();
String sql = "insert into apply(id,name,qq,profession,gschool,oath) values(?,?,?,?,?)";
ps = con.prepareStatement(sql);
ps.setString(1, apply.getname());
ps.setString(2, apply.getqq());
ps.setString(3, apply.getprofession());
ps.setString(4, apply.getgschool());
ps.setString(5, apply.getoath());
i = ps.executeUpdate() ;
}
catch(SQLException e)
{
throw new DAOException(e.getMessage(),e);
}
finally
{
JDBCUtils.free(null, ps, con);
}
return i;
}
//删除一个申请
public int deleteApply(String name)
{
Connection con = null ;
PreparedStatement ps = null ;
int i = 0 ;
try
{
con = JDBCUtils.getConnection();
String sql = "delete from apply where name =?";
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;
}
//修改一个申请将其oath改为老大最帅
public int updateApply(String name)
{
Connection con = null ;
PreparedStatement ps = null ;
int i = 0 ;
try
{
con = JDBCUtils.getConnection();
String sql = "update apply set oath = '老大最帅' where name =?";
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 Apply findApply(String name)
{
Connection con = null ;
PreparedStatement ps = null ;
Apply ap = null ;
ResultSet rs = null;
try
{
con = JDBCUtils.getConnection();
String sql = "select name,qq,profession,gschool,oath from apply where name =?";
ps = con.prepareStatement(sql);
ps.setString(1, name);
rs = ps.executeQuery() ;
ap = new Apply();
while(rs.next())
{
ap.setname(rs.getString(1));
ap.setqq(rs.getString(2));
ap.setprofession(rs.getString(3));
ap.setgschool(rs.getString(4));
ap.setoath(rs.getString(5));
}
}
catch(SQLException e)
{
throw new DAOException(e.getMessage(),e);
}
finally
{
JDBCUtils.free(rs, ps, con);
}
return ap;
}
//查询所有
public Set<Apply> findAll()
{
Connection con = null ;
PreparedStatement ps = null ;
Apply ap = null ;
ResultSet rs = null;
Set<Apply> set = null ;
try
{
con = JDBCUtils.getConnection();
String sql = "select name,qq,profession,gschool,oath from apply";
ps = con.prepareStatement(sql);
set = new HashSet<Apply>() ;
rs = ps.executeQuery() ;
while(rs.next())
{
ap = new Apply();
ap.setname(rs.getString(1));
ap.setqq(rs.getString(2));
ap.setprofession(rs.getString(3));
ap.setgschool(rs.getString(4));
ap.setoath(rs.getString(5));
set.add(ap);
}
}
catch(SQLException e)
{
throw new DAOException(e.getMessage(),e);
}
finally
{
JDBCUtils.free(rs, ps, con);
}
return set;
}
}
5.自定义异常 继承了运行时异常,具体操作让父类实现
DAOException.java
package com.jdbc.dao;
/**
* 自定义异常
*
*/
public class DAOException extends RuntimeException {
private static final long serialVersionUID = 1L;
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对象的引用
ApplyService.java
package com.jdbc.service;
import java.util.Set;
import com.jdbc.bean.Apply;
import com.jdbc.dao.ApplyDAO;
import com.jdbc.dao.ConcreteApplyDao;
public class ApplyService {
ApplyDAO sd = new ConcreteApplyDao();
public int add(Apply apply)
{
return this.sd.addApply(apply);
}
public int delete(String name)
{
return this.sd.deleteApply(name);
}
public int update(String name)
{
return this.sd.updateApply(name);
}
public Apply find(String name)
{
return this.sd.findApply(name);
}
public Set<Apply> findAll()
{
return this.sd.findAll();
}
}
7.定义一个测试类,相当于 (表现层)
Client.java
package com.jdbc.test;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import com.jdbc.bean.Apply;
import com.jdbc.service.ApplyService;
public class Client {
public static void main(String[] args)
{
Apply ap= new Apply();
Set<Apply> set = new HashSet<Apply>();
// ap.setname("王二麻子");
// ap.setqq("12345");
// ap.setprofession("JAVA工程师");
// ap.setgschool("南京大学");
// ap.setoath(" ")
ApplyService ss = new ApplyService();
set = ss.findAll() ;
Iterator<Apply> iterator = set.iterator();
while(iterator.hasNext())
{
Apply apply = (Apply)iterator.next() ;
System.out.println(apply.getname() +" " +apply.getqq()+" "+apply.getprofession()+" "+apply.getgschool()+" "+apply.getoath());
}
}
}
成功添加了“王二麻子”
明日计划
继续学习DAO
遇到问题
一葫芦画瓢敲出了第一个DAO。
大致能明白过程,但是很多细节方面还是一头雾水,明日继续学一下,把DAO弄清楚。
收获
尝试敲出了第一个DAO,并测试了一下查询数据与插入数据是可以使用的,但是并不是完全理解了,还需要继续深入学习。
评论