三层架构dao service 表示层 115721935
开发环境的准备
- 新建lib目录
- 把驱动文件放进去
- 设置lib目录为库目录
准备工具包
- DbHelper,数据库操作工具包
- 配置文件,让数据库的连接更加动态
编写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的方法,传入idUserEntity 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()@Overridepublic 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("注册失败");}}
测试效果
小结
每一个数据表都会有多个类与它对应
- 用户服务类
- 用户dao类
- 用户实体类
- 测试类
难点:
区分每一类它的职能
知道什么事情找什么类
三层架构
三层架构dao service 表示层 115721935相关推荐
- Springboot三层架构--DAO层、Service层、Colltroler层--这波我在外太空
目录 1.DAO层 Dao层的设计 2.Service层 Service层的设计 设计Service层的优点 Dao与Service的关系 3.Colltroler层 Collertroler层的设计 ...
- java三层架构,表示层MVC,和前端视图层mvvm
1.三层架构 Java的三层架构分别为表示层.业务逻辑层和数据持久层. 表示层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得. 业务逻辑层(BLL):针对具体问题的操作, ...
- 杨老师课堂之JavaWeb体系的MVC与三层架构有什么区别
首先,声明一下,三层是三层,MVC是MVC,这俩是毫无关系的. 三层是从整个应用程序架构的角度来分的三层(如果程序需要,还可以分多层). 三层架构通常包括表示层,业务逻辑层以及数据访问层.虽然三层架构 ...
- JSP-05三层架构+MVC
文章目录 @[toc] 一.回顾三层架构 1.1基本概念 1.2作用与组成 1.3三层架构命名规范 1.3.1UI层(表示层) 1.3.2业务逻辑层 1.3.3数据访问层 二.MVC 2.1MVC简介 ...
- 项目架构之传统三层架构和领域模型三层架构
一.架构之传统三层架构 传统三层架构是一种软件架构,是一种典型的.基于贫血模型的.面向过程的JavaWeb分层方式.该架构分为以下三个层次: 数据访问层(DAL - Data Access Layer ...
- 【软件架构】三层架构
三层架构 三层架构简介 三层架构的必要性 经典两层架构 三层架构 三层架构逐层浅析 表示层 业务逻辑层 数据访问层 三层架构层间关系 层间依赖关系 层间数据流向 三层架构与实体类 需要实体类的理由 实 ...
- C#回顾学习笔记四十:三层架构
1)三层框架是什么? 按照书籍和博客文章里千篇一律的解释就是:UI层.BLL层.DAL层.这样的解释通常无法让人一时半会理解含义,总而言之在这里先大概说明一下三层架构.正如其他文章提到的一样,三层架构 ...
- 10个常见软件架构模式和三层架构模式
10个常见软件架构模式: 1. 分层模式: 信息系统常见的4层划分:Presentation layer表示层(也就是UI层).Application layer应用层(也就是服务层).Busines ...
- javaWeb 11(三层架构)
分层模式 分层模式是最常见的一种架构模式 分层模式是很多架构模式的基础 分层 将解决方案的组件分隔到不同的层中 在同一个层中组件之间保持内聚性 层与层之间保持松耦合 三 ...
最新文章
- C#_uploadify_mvc_version
- 《强化学习周刊》第39期:近似最优深度、多智能体广义、角色动画强化学习...
- oracle 显示格式化
- SAP Event Mesh 简介
- SAP CRM responsibility的维护
- 从产品展示页面谈谈Hybris系列之二: DTO, Converter和Populator
- centos8.2安装mysql_为CentOS 8操作系统安装MySQL的方法,以安装MySQL 8为例
- Go面试题 | []int 能转换为 []interface 吗?
- php 使用上传文件预览插件,bootstrap fileinput插件实现预览上传照片功能方法详解...
- Android 换行符号(\n)放到Android当中的TextView显示双斜杠(\\n)
- O(N)求出1~n逆元
- java正则过滤小括号,java正则表达式获取大括号小括号内容并判断数字和小数亲测可用...
- linux date命令 下月,Linux date命令用法和使用技巧(获取今天.昨天.一分钟前等)
- gxworks2软件测试对话框,超实用!GX Works2软件的启动与窗口功能应用
- .Net中使用数据库(sqlite)的大体流程(简单向)
- 《人类简史-从动物到上帝》读后感
- 网络营销推广文案如何量化工作和管理
- google-hacking
- 关于ASMM和AMM
- Unknown custom element: <uni-data-checkbox> - did you register the component correctly? For recursi
热门文章
- python3 缺少PIP解决办法
- 网站颜色变黑白的CSS代码,Chrome、火狐、IE
- spss 卡方检验_SPSS篇—卡方检验
- 解决ubuntu18.04中python兼容以及pip兼容问题
- 【跨域问题】Vue简单封装axios—解决post请求后端接收不到参数问题
- oracle 10g db_file,oracle 10g的db_file_multiblock_read_count参数
- 向日葵企业版 v2.0.0.17075
- java的调试页面_[Java教程]使用开发者工具调试jsp页面中的脚本
- 考研 | 手把手教你打赢考研情报战,巧用有关考研的三大网站
- WebStorm搭建Node开发环境