面向对象--数据访问层

本文介绍了面向对象编程中的数据访问层,探讨了持久化概念及其在DAO模式中的应用。通过分层开发,详细阐述了如何创建实体对象、DAO接口及其实现,以及如何封装数据库连接代码。此外,还讨论了DAO模式的优势,如隔离数据访问代码和业务逻辑,以及便于代码复用和程序扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据访问层

1.持久化

持久化:持久化是将程序中的数据在瞬时状态和持久状态间转换的机制

DAO 模式的优势就在于它实现了两次隔离。

  • 隔离了数据访问代码和业务逻辑代码。

  • 隔离了不同数据库实现。

一个典型的 DAO 模式主要由以下几部分组成:

  • DAO 接口:把对数据库的所有操作定义成抽象方法,可以提供多种实现。

  • DAO 实现类:针对不同数据库给出 DAO 接口定义方法的具体实现。

  • 实体类:用于存放与传输对象数据。

  • 数据库连接和关闭工具类:避免了数据库连接和关闭代码的重复使用,方便修改

Dao:数据库操作放在dao层中

dao层的组成:

1、dao层接口

2、dao层接口实现

3、实体类

2 .分层开发

分层开发优势

每一层专注于自己功能的实现,便于提高质量。

便于分工协作,从而提高效率。

便于代码复用。

便于程序扩展。

使用实体类传递数据

  • 实体类的属性一般使用 private 修饰。

  • 根据业务需要和封装性要求对实体类的属性提供 getter/setter 方法,负责属性的读取和

赋值,一般使用 public 修饰。

  • 对实体类提供无参构造方法,根据业务需要提供相应的有参构造方法。

  • 实体类最好实现 java.io.Serializable 接口,支持序列化机制,可以将该对象转换成字节序

列而保存在磁盘上或在网络上传输。

  • 如果实体类实现了 java.io.Serializable 接口,就应该定义属性 serialVersionUID,解决不同

版本之间的序列化问题。

2.1.1、编写persion实体对象

import java.util.Date;
​
public class PersonEntity {
    private int id;      //人物id
    private int masterId;//主公id
    private String name; // 昵称
    private int typeId;  //类型id
    private int health ;// 生命值
    private Date addTime;//购买时间
    private String status; //状态
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getMasterId() {
        return masterId;
    }
    public void setMasterId(int masterId) {
        this.masterId = masterId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getTypeId() {
        return typeId;
    }
    public void setTypeId(int typeId) {
        this.typeId = typeId;
    }
    public int getHealth() {
        return health;
    }
    public void setHealth(int health) {
        this.health = health;
    }
    public Date getAddTime() {
        return addTime;
    }
    public void setAddTime(Date addTime) {
        this.addTime = addTime;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
}
​

2.1.2、编写dao接口

import com.dzqc.cn.test01.entit.PersonEntity;
​
/**
 * persion接口
 *
 */
public interface PersionDao {
    //执行新增
    public int save(PersonEntity pes);
    
}
​

2.1.3、编写dao接口实现

​
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
​
import com.dzqc.cn.test01.dao.PersionDao;
import com.dzqc.cn.test01.entit.PersonEntity;
/**
 * dao接口实现
 * 
 */
public class PersionDaoImpl implements PersionDao{
    @Override
    public int save(PersonEntity pes) {
        int result = 0;
        Connection connection = null;
         PreparedStatement  pst = null;
        //1、加载驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");//固定写法
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        
        //2、建立连接
        /**
         * url: 连接数据库的链接
         */
        String url = "jdbc:mysql://localhost:3306/test";
        try {
             connection = DriverManager.getConnection(url,"root","020323");//链接数据库
            //3、数据操作--新增,修改,删除,查询
            /**
             * 需要一个Statement 接口 ---里面有执行新增修改,删除,查询的方法
             * connection 接口产生
             */
             //编写sql语句、
             String sql = "insert into person (pname,health) values(?,?)";
            //得到一个prepareStatement对象
             pst= connection.prepareStatement(sql);
             pst.setString(1, pes.getName());
             pst.setInt(2, pes.getHealth());
            //执行sql-- 新增修改删除 --executeUpdate()
            result = pst.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //4、关闭连接
        finally {
            try {
                if(connection!=null) {
                    connection.close(); //关闭connection接口
                }else if(pst!=null) {
                    pst.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
​
}

2.1.4、编写测试类


import com.dzqc.cn.test01.dao.impl.PersionDaoImpl;
import com.dzqc.cn.test01.entit.PersonEntity;
​
public class TestPersion {
    public static void main(String[] args) {
        PersonEntity ps = new PersonEntity();
        ps.setName("诺克");
        ps.setHealth(100);
        PersionDaoImpl persion = new PersionDaoImpl();
        int result = persion.save(ps);
        System.out.println(result);
    }
}
​

2.2、封装数据库连接代码--BaseDao

package com.dzqc.testStu.tools;
​
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
​
/**
 * 连接数据库的封装类
 * 
 */
public class BaseDao {
    public static String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
    public static String user = "root";//数据库用户名
    public static String pwd = "";//自己数据库的密码
    public static Connection connection = null;
    public static PreparedStatement ps = null;
    
    //获取数据库连接
    public static Connection getConnection() {
        if (connection == null) {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                connection = DriverManager.getConnection(url, user, pwd);
                System.out.println("连接成功");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return connection;
    }
    /**
     * (增删改)
     * 
     * @return Connection
     */
    public static Integer getPreparedStatement(String sql, List<Object> objects) {
        int execute = 0;
        try {
            ps = connection.prepareStatement(sql);
            for (int i = 0; i < objects.size(); i++) {
                ps.setObject(i + 1, objects.get(i));
            }
            execute = ps.executeUpdate();
            System.out.println("更新成功");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return execute;
    }
​
    //执行返回结果集
    public static ResultSet getResultSet(String sql, List<Object> objects) {
        ResultSet rs = null;
        try {
            if (ps == null) {
                ps = connection.prepareStatement(sql);
                for (int i = 0; i < objects.size(); i++) {
                    ps.setObject(i + 1, objects.get(i));
                }
                rs = ps.executeQuery();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
​
    }
​
    /**
     * 关闭数据库连接
     * 
     */
    public static void closeAll(Connection conn, Statement stmt, ResultSet rs) {
        // 若结果集对象不为空,则关闭
        try {
            if (rs != null) {
                rs.close();
            }
            if (stmt != null) {
                stmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
​
}
​

2.3、三层架构

1、dao层包括: 实体类,basedao-工具类

dao--层和数据库打交道的--链接数据库,执行数据操作的步骤

(1)执行新增修改,删除--executeUpdate();

(2)执行查询方法--executeQuery();

package com.dzqc.cn.daoI.impl;
​
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.List;
​
import com.dzqc.cn.daoI.PersionDaoI;
import com.dzqc.cn.tools.BaseDao;
​
public class PersionDaoImpl extends BaseDao implements PersionDaoI{
​
    //执行新增,修改删除方法
    @Override
    public int executeUpdate(String sql, List<Object> param) {
        //连接数据库成功
        Connection connection = BaseDao.getconnection();
        //执行新增修改方法
        int rsult = BaseDao.getPreparedStatement(sql, param);
        //关闭连接
        BaseDao.closeAll(connection, null, null);
        return rsult;
    }
​
    //执行查询
    @Override
    public ResultSet executeQuery(String sql, List<Object> param) {
        //连接数据库成功
        Connection connection = BaseDao.getconnection();
        //执行查询
        ResultSet raResultSet = BaseDao.getResultSet(sql, param);
        //关闭连接
    //  BaseDao.closeAll(connection, null, raResultSet);
        return raResultSet;
    }
​
}
​

2、service-- 业务层

import java.sql.ResultSet;
import java.util.List;
​
​
public interface PersonServiceI {
    //执行新增
    public int addPerson(String sql ,List<Object> param);
    //修改、
    
    //删除
    
    //执行查询
    public ResultSet SelectPerson(String sql ,List<Object> param);
    
}
​


​
import java.sql.ResultSet;
import java.util.List;
​
import com.dzqc.cn.daoI.impl.PersionDaoImpl;
import com.dzqc.cn.service.PersonServiceI;
/**
 * 业务层代码
 * 调用到层接口
 * 
 */
public class PersonServiceImpl implements PersonServiceI{
    PersionDaoImpl person = new PersionDaoImpl();
    //执行新增
    @Override
    public int addPerson(String sql, List<Object> param) {
        int rsult = person.executeUpdate(sql, param);
        return rsult;
    }
    
    //执行查询
    @Override
    public ResultSet SelectPerson(String sql, List<Object> param) {
        ResultSet rs = person.executeQuery(sql, param);
        return rs;
    }
​
}
​

3、测试类

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.dzqc.cn.service.impl.PersonServiceImpl;

public class TestPersonAdd {
	public static void main(String[] args) {
		PersonServiceImpl per =  new PersonServiceImpl();
		/*
		 * String sql = "insert into person (masterId,pname,health) VALUES(?,?,?)";
		 * List<Object> param = new ArrayList<Object>(); param.add(25); param.add("大乔");
		 * param.add(500); int result = per.addPerson(sql, param);
		 * System.out.println(result);
		 */
		String sql  ="select * from person where id = ?";
		List<Object> plist = new ArrayList<Object>();
		plist.add(14);
		ResultSet rs = per.SelectPerson(sql, plist);
		try {
			while(rs.next()) {
				System.out.println(rs.getInt("id"));
				System.out.println(rs.getString("pname"));
				System.out.println(rs.getString("health"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值