其他分享
首页 > 其他分享> > 三层架构dao service 表示层 115721935

三层架构dao service 表示层 115721935

作者:互联网

开发环境的准备

在这里插入图片描述

准备工具包

在这里插入图片描述

在这里插入图片描述

编写DbHelper中的内容

加载驱动

在这里插入图片描述

获取连接对象

在这里插入图片描述
测试代码

在这里插入图片描述

测试结果

在这里插入图片描述

释放资源

三种资源需要释放:

释放资源


    // 释放资源
    public static void closeAll(Connection connection, Statement statement, ResultSet resultSet){
        // 1 防止空指针异常
        // 2 按顺序来关

        // 关查询结果集
        if(resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

        // 关闭执行者
        if(statement!=null){
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

        // 关闭连接对象
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }

测试


public class Test01测连接对象 {
    public static void main(String[] args) {
        Connection connection = DbHelper.getConnection();
        System.out.println(connection);

        // 测一测关闭资源的方法
        // 当前只有一个资源,把它关闭
        DbHelper.closeAll(connection, null, null);
        System.out.println("game over");
    }
}

效果

在这里插入图片描述

分析当前的需求

对于数据表的操作

我们希望有一个工具类

邦我们专门的操作这个表

dao文件

mysql数据与java的关联

java,一门面向对向的编程语言

mysql,一行是一个数据实体

java中的对象与mysql中的数据实体是可以对应上的

mysql的一行,就是java的一个对象

在这里插入图片描述

以刘备的行为例

具有三个属性,id,uname,upwd

我们可以定义一个类来对接mysql的行

定义一个实体类

定义一个实体包

在实体包中存放多个实体类

每一个类对接数据表中的实体行

在这里插入图片描述

定义用户实体类

统一命名

实体类的名称 以:

类名称+Entity

用户实体类,版本一

package Entity;

public class UserEntity {
    // 定义属性(根据数据表来定义)
    // 目前数据中有三列,所以我们定义三个属性
    private int id;
    private String uname;
    private String upwd;

    // 构造器(方便进行实例化)
    public UserEntity() {
    }


    // 添加getter和setter
    // 热键:alt+ins  选:Getter and Setter
    // 全选所有的属性,确定。 最后会自动生成获取器与设置器。

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getUpwd() {
        return upwd;
    }

    public void setUpwd(String upwd) {
        this.upwd = upwd;
    }
}

定义Dao包

在包中新建用户Dao的类

在类中编写需要的数据操作方法

在这里插入图片描述

在这里插入图片描述

用户Dao的具体写法

增,添加对象到数据表

添加java对象,到数据表中,变成数据实体

逻辑

在这里插入图片描述

代码


// 直接操作用户数据表(编写常用的操作在类中)
public class UserMysqlDao {
    // 增
    public int insert(UserEntity user) {
        // 获取连接对象
        Connection connection = DbHelper.getConnection();

        // 构建sql语句
        // 构建?占位符时,记得把'一起带走,这种是错误的占位方法:'?'
        String sql = "INSERT INTO userinfo(uname,upwd) VALUES(?,?);";

        // 获得安全执行者(sql)
        PreparedStatement preparedStatement = null;
        try {
            preparedStatement = connection.prepareStatement(sql);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        // 给占位?添加数据
        String uname = user.getUname();
        String upwd = user.getUpwd();

        try {
            preparedStatement.setString(1, uname);
            preparedStatement.setString(2, upwd);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        // todo 查看sql语句 临时测试,后面要删
        System.out.println(preparedStatement);

        // 让安全执行者运行,得到结果
        int i = 0;
        try {
            i = preparedStatement.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        // 释放资源
        DbHelper.closeAll(connection, preparedStatement, null);

        // 返回数据
        return i;
    }

测试类

package Test;

import Dao.UserMysqlDao;
import Entity.UserEntity;

public class Test02添加用户操作 {
    public static void main(String[] args) {
        // 实例化一个对象,用户对象
        UserEntity user = new UserEntity("dc", "456");
        // 把用户对象的数据存放到数据库
        // 操作数据表的类 实例化它
        UserMysqlDao userMysqlDao = new UserMysqlDao();
        // 让这个dao类,帮我插入数据
        // 光标移到insert这个红字的地方
        int i = userMysqlDao.insert(user);

        // 判断i的结果
        if (i > 0) {
            System.out.println("添加成功");
        } else {
            System.out.println("添加失败");
        }
    }
}

效果

在这里插入图片描述

查 根据id来查

编写了测试类

package Test;

import Dao.UserMysqlDao;
import Entity.UserEntity;

public class Test03查询用户根据id {
    public static void main(String[] args) {
        // 实例化用户dao类
        UserMysqlDao userMysqlDao = new UserMysqlDao();

        // 调用查询id的方法,传入id
        UserEntity user = userMysqlDao.selectById(5);

        // 打印
        System.out.println(user);
        System.out.println(user.getUname());
    }
}

查 根据id的方法


    // 查
    public UserEntity selectById(int id) {
        // 获取连接对象
        Connection connection = DbHelper.getConnection();

        // 构建sql语句
        String sql = "SELECT * FROM userinfo WHERE id = ?;";

        // 安全执行者
        PreparedStatement preparedStatement = null;
        try {
            preparedStatement = connection.prepareStatement(sql);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        // 往?填数据
        try {
            preparedStatement.setInt(1, id);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        // 执行者运行sql语句,得到返回值
        ResultSet resultSet = null;
        try {
            resultSet = preparedStatement.executeQuery();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        // 处理返回值
        UserEntity user = null;
        try {
            if (resultSet.next()) {
                // 获得数据信息了
                int uid = resultSet.getInt("id");
                String uname = resultSet.getString("uname");
                String upwd = resultSet.getString("upwd");
                // 实例化一个对象
                user = new UserEntity(uid, uname, upwd);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        // 关闭资源
        DbHelper.closeAll(connection, preparedStatement, resultSet);

        // 返回内容
        return user;
    }

改造了用户实体类

    // 设置对象的打印显示值
    // alt+ins 选择toString()

    @Override
    public String toString() {
        return "UserEntity{" +
                "id=" + id +
                ", uname='" + uname + '\'' +
                ", upwd='" + upwd + '\'' +
                '}';
    }

最终效果

在这里插入图片描述

删除功能

提供一个对象

这个对象是数据表中已存在的行

把它作为参数,让dao对象来删除

测试类

package Test;

import Dao.UserMysqlDao;
import Entity.UserEntity;

public class Test04删除用户 {
    public static void main(String[] args) {
        UserMysqlDao userMysqlDao = new UserMysqlDao();

        // 获取用户
        UserEntity userEntity = userMysqlDao.selectById(12);

        int i = userMysqlDao.delete(userEntity);

        if (i > 0) {
            System.out.println("ok,success");
        } else {
            System.out.println("not ok,fail");
        }
    }
}

删除方法


    // 删
    public int delete(UserEntity user) {
        // 获取连接对象
        Connection connection = DbHelper.getConnection();

        // 构建sql语句
        String sql = "DELETE FROM userinfo WHERE id = ?;";

        // 安全执行者
        PreparedStatement preparedStatement = null;
        try {
            preparedStatement = connection.prepareStatement(sql);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        // 往?填数据
        try {
            preparedStatement.setInt(1, user.getId());
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        // 执行sql语句
        int i = 0;
        try {
            i = preparedStatement.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }


        // 关闭资源
        DbHelper.closeAll(connection, preparedStatement, null);

        // 返回内容
        return i;
    }

效果

在这里插入图片描述

关于服务

服务是有逻辑

根据不同的业务情况,会有不同的处理

为了完成目标,服务会借用其它工具

在这里插入图片描述

用户管理系统

具有的服务(业务)

服务包与服务类

在这里插入图片描述

测试类

package Test;

import Service.UserService;

import java.util.Scanner;

public class Test05服务的引入 {
    public static void main(String[] args) {
        // 定义变量
        UserService userService = new UserService();
        Scanner ipt = new Scanner(System.in);
        // 询问用户
        System.out.println("请输入需要注册的用户名(不可与其它人重复):");
        String uname = ipt.nextLine();
        System.out.println("请输入需要注册的密码:");
        String upwd = ipt.next();
        // 启动服务
        // 因为服务所需要的数据采集到位,所以可以启动了
        userService.KaiHu(uname, upwd);

    }
}

注册业务

   // 开户
    public void KaiHu(String uname, String upwd) {
        // 变量的定义
        UserMysqlDao userMysqlDao = new UserMysqlDao();

        // 假设开户不允许重名

        // 关卡1:非法数据的校验
        // 如果用户名 是 “”(非法数据)
        // 也需要中止
        if (uname.trim().equals("")) {
            System.out.println("输入的内容为空,无法注册!!!");
            return;
        }

        // 关卡2:重名验证
        // 判断用户名是否存在
        UserEntity user = userMysqlDao.selectByName(uname);
        // 如果用户存在(中止服务)
        if (user != null) {
            System.out.println("用户已存在,无法使用这个用户名" + uname);
            return;
        }

        // 需要冯过上面的两个关卡,才可以执行主业务
        // 业务的核心代码
        UserEntity u = new UserEntity(uname, upwd);
        int i = userMysqlDao.insert(u);

        // 处理结果
        if (i > 0) {
            System.out.println("注册成功");
        } else {
            System.out.println("注册失败");
        }

    }

测试效果

在这里插入图片描述

小结

每一个数据表都会有多个类与它对应

难点:

区分每一类它的职能

知道什么事情找什么类

三层架构

在这里插入图片描述

标签:String,service,表示层,throwables,dao,UserEntity,uname,upwd,public
来源: https://blog.csdn.net/ifubing/article/details/115721935