开发环境的准备

  • 新建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相关推荐

  1. Springboot三层架构--DAO层、Service层、Colltroler层--这波我在外太空

    目录 1.DAO层 Dao层的设计 2.Service层 Service层的设计 设计Service层的优点 Dao与Service的关系 3.Colltroler层 Collertroler层的设计 ...

  2. java三层架构,表示层MVC,和前端视图层mvvm

    1.三层架构 Java的三层架构分别为表示层.业务逻辑层和数据持久层. 表示层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得. 业务逻辑层(BLL):针对具体问题的操作, ...

  3. 杨老师课堂之JavaWeb体系的MVC与三层架构有什么区别

    首先,声明一下,三层是三层,MVC是MVC,这俩是毫无关系的. 三层是从整个应用程序架构的角度来分的三层(如果程序需要,还可以分多层). 三层架构通常包括表示层,业务逻辑层以及数据访问层.虽然三层架构 ...

  4. JSP-05三层架构+MVC

    文章目录 @[toc] 一.回顾三层架构 1.1基本概念 1.2作用与组成 1.3三层架构命名规范 1.3.1UI层(表示层) 1.3.2业务逻辑层 1.3.3数据访问层 二.MVC 2.1MVC简介 ...

  5. 项目架构之传统三层架构和领域模型三层架构

    一.架构之传统三层架构 传统三层架构是一种软件架构,是一种典型的.基于贫血模型的.面向过程的JavaWeb分层方式.该架构分为以下三个层次: 数据访问层(DAL - Data Access Layer ...

  6. 【软件架构】三层架构

    三层架构 三层架构简介 三层架构的必要性 经典两层架构 三层架构 三层架构逐层浅析 表示层 业务逻辑层 数据访问层 三层架构层间关系 层间依赖关系 层间数据流向 三层架构与实体类 需要实体类的理由 实 ...

  7. C#回顾学习笔记四十:三层架构

    1)三层框架是什么? 按照书籍和博客文章里千篇一律的解释就是:UI层.BLL层.DAL层.这样的解释通常无法让人一时半会理解含义,总而言之在这里先大概说明一下三层架构.正如其他文章提到的一样,三层架构 ...

  8. 10个常见软件架构模式和三层架构模式

    10个常见软件架构模式: 1. 分层模式: 信息系统常见的4层划分:Presentation layer表示层(也就是UI层).Application layer应用层(也就是服务层).Busines ...

  9. javaWeb 11(三层架构)

    分层模式         分层模式是最常见的一种架构模式 分层模式是很多架构模式的基础 分层         将解决方案的组件分隔到不同的层中 在同一个层中组件之间保持内聚性 层与层之间保持松耦合 三 ...

最新文章

  1. C#_uploadify_mvc_version
  2. 《强化学习周刊》第39期:近似最优深度、多智能体广义、角色动画强化学习...
  3. oracle 显示格式化
  4. SAP Event Mesh 简介
  5. SAP CRM responsibility的维护
  6. 从产品展示页面谈谈Hybris系列之二: DTO, Converter和Populator
  7. centos8.2安装mysql_为CentOS 8操作系统安装MySQL的方法,以安装MySQL 8为例
  8. Go面试题 | []int 能转换为 []interface 吗?
  9. php 使用上传文件预览插件,bootstrap fileinput插件实现预览上传照片功能方法详解...
  10. Android 换行符号(\n)放到Android当中的TextView显示双斜杠(\\n)
  11. O(N)求出1~n逆元
  12. java正则过滤小括号,java正则表达式获取大括号小括号内容并判断数字和小数亲测可用...
  13. linux date命令 下月,Linux date命令用法和使用技巧(获取今天.昨天.一分钟前等)
  14. gxworks2软件测试对话框,超实用!GX Works2软件的启动与窗口功能应用
  15. .Net中使用数据库(sqlite)的大体流程(简单向)
  16. 《人类简史-从动物到上帝》读后感
  17. 网络营销推广文案如何量化工作和管理
  18. google-hacking
  19. 关于ASMM和AMM
  20. Unknown custom element: <uni-data-checkbox> - did you register the component correctly? For recursi

热门文章

  1. python3 缺少PIP解决办法
  2. 网站颜色变黑白的CSS代码,Chrome、火狐、IE
  3. spss 卡方检验_SPSS篇—卡方检验
  4. 解决ubuntu18.04中python兼容以及pip兼容问题
  5. 【跨域问题】Vue简单封装axios—解决post请求后端接收不到参数问题
  6. oracle 10g db_file,oracle 10g的db_file_multiblock_read_count参数
  7. 向日葵企业版 v2.0.0.17075
  8. java的调试页面_[Java教程]使用开发者工具调试jsp页面中的脚本
  9. 考研 | 手把手教你打赢考研情报战,巧用有关考研的三大网站
  10. WebStorm搭建Node开发环境