三层架构dao service 表示层 115721935

开发环境的准备

  • 新建lib目录
  • 把驱动文件放进去
  • 设置lib目录为库目录

三层架构dao service 表示层 115721935

准备工具包

  • DbHelper,数据库操作工具包
  • 配置文件,让数据库的连接更加动态

三层架构dao service 表示层 115721935

三层架构dao service 表示层 115721935

编写DbHelper中的内容

加载驱动

三层架构dao service 表示层 115721935

获取连接对象

三层架构dao service 表示层 115721935
测试代码

三层架构dao service 表示层 115721935

测试结果

三层架构dao service 表示层 115721935

释放资源

三种资源需要释放:

  • 连接对象
  • 执行者
  • 结果集

释放资源


    // 释放资源
    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 service 表示层 115721935

分析当前的需求

对于数据表的操作

我们希望有一个工具类

邦我们专门的操作这个表

dao文件

mysql数据与java的关联

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

mysql,一行是一个数据实体

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

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

三层架构dao service 表示层 115721935

以刘备的行为例

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

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

定义一个实体类

定义一个实体包

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

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

三层架构dao service 表示层 115721935

定义用户实体类

统一命名

实体类的名称 以:

类名称+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 service 表示层 115721935

三层架构dao service 表示层 115721935

用户Dao的具体写法

增,添加对象到数据表

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

逻辑

三层架构dao service 表示层 115721935

代码


// 直接操作用户数据表(编写常用的操作在类中)
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("添加失败");
        }
    }
}

效果

三层架构dao service 表示层 115721935

查 根据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 service 表示层 115721935

删除功能

提供一个对象

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

把它作为参数,让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;
    }

效果

三层架构dao service 表示层 115721935

关于服务

服务是有逻辑

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

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

三层架构dao service 表示层 115721935

用户管理系统

具有的服务(业务)

  • 开户
  • 修改
  • 查询密码
  • 注销

服务包与服务类

三层架构dao service 表示层 115721935

测试类

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("注册失败");
        }

    }

测试效果

三层架构dao service 表示层 115721935

小结

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

  • 用户服务类
  • 用户dao类
  • 用户实体类
  • 测试类

难点:

区分每一类它的职能

知道什么事情找什么类

三层架构

三层架构dao service 表示层 115721935

上一篇:linux中ulimit作用


下一篇:Hibernate Validation验证