35、Java——一个案例学会Dao+service层对数据表的增删改查

news2024/11/29 11:48:04

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:乐趣国学的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:Java案例分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:一个案例学会Dao+service层对数据表的增删改查

文章目录

    • 案例
    • 建表
    • 配置
    • Animal类
    • DBUtils数据库工具类
    • DateUtils日期类
    • AnimalDaoImpl类
    • AnimalServiceImpl类
    • AnimalTest测试类

案例

  使用读取配置文件的形式连接数据库,(Dao层+service层)对animal表进行增删改查操作。

animal表字段如下
  aid int 主键 自增长 -->宠物编号
  name varchar(10) 非空 -->宠物名称
  age int 非空 -->宠物年龄
  birthday Date 非空

建表

CREATE TABLE IF NOT EXISTS `animal`(
`aid` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(10) NOT NULL,
`age` INT NOT NULL,
`birthday` DATE
);

配置

  添加mysql-connector-java-5.1.0-bin.jar文件并使用。
  添加db.properties文件
在这里插入图片描述

Animal类

  定义一个Animal类,添加和animal表字段相同的私有变量

	// 定义属性
	private int aid;
	private String name;
	private int age;
	private Date birthday;

  添加一个无参构造

	public Animal() {
		super();
	}

  添加一个全部字段的有参构造

	public Animal(int aid, String name, int age, Date birthday) {
		super();
		this.aid = aid;
		this.name = name;
		this.age = age;
		this.birthday = birthday;
	}

  添加一个不带aid字段的有参构造

	public Animal(String name, int age, String gender, Date birthday,
			String identityCard, String phone, String address, double salary) {
		super();
		this.name = name;
		this.age = age;
		this.birthday = birthday;
	}

  给私有变量添加get/set方法

	public int getAid() {
		return aid;
	}

	public void setAid(int aid) {
		this.aid = aid;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

  重写ToString方法

	@Override
	public String toString() {
		return "Animal [aid=" + aid + ", name=" + name + ", age=" + age
				+ ", birthday=" + birthday + "]";
	}

DBUtils数据库工具类

  声明一个ThreadLocal对象,用来存储Connection连接对象;注册驱动、获取连接、然后释放资源方法。

	private static final Properties PROPERTIES = new Properties();
	// 声明一个ThreadLocal<Connection>对象,用来存储Connection连接对象
	private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();

	static {
		InputStream is = DBUtils.class.getResourceAsStream("/db.properties");
		try {
			PROPERTIES.load(is);
			// 1、注册驱动
			Class.forName(PROPERTIES.getProperty("driver"));
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
		// 2、获取连接方法
	public static Connection getConnection() {
		Connection connection = threadLocal.get();
		// 2、获取连接对象
		try {
			// 如果连接对象为null,创建一个连接对象
			if (connection == null) {
				connection = DriverManager.getConnection(
						PROPERTIES.getProperty("url"),
						PROPERTIES.getProperty("username"),
						PROPERTIES.getProperty("password"));
				threadLocal.set(connection);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return connection;

	}

	// 3、释放资源方法
	public static void closeAll(ResultSet resultSet, Statement statement,
			Connection connection) {
		try {
			if (resultSet != null) {
				resultSet.close();
			}
			if (statement != null) {
				statement.close();
			}
			if (connection != null) {
				connection.close();
				// 移除 ThreadLocal<Connection> 对象
				threadLocal.remove();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

  开启事务

	public static void startTransaction() {
		Connection connection = getConnection();
		try {
			connection.setAutoCommit(false);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

  提交事务

	public static void commitTransaction() {
		Connection connection = getConnection();
		try {
			connection.commit();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtils.closeAll(null, null, connection);
		}
	}

  回滚事务

	public static void rollbackTransaction() {
		Connection connection = getConnection();
		try {
			connection.rollback();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtils.closeAll(null, null, connection);
		}
	}

DateUtils日期类

public class DateUtils {
	// 声明一个SimpleDateFormat类型的静态常量
	public static final SimpleDateFormat SIMPLEDATEFORMAT=new SimpleDateFormat("yyyy-MM-dd");

	// 定义方法实现将字符串类型的数据转换成java.util.Date类型
	public static java.util.Date strToUtilDate(String strDate){
		try {
			return SIMPLEDATEFORMAT.parse(strDate);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	// 定义方法实现将java.util.Date类型转换为字符串
	public static String utilDateToString(java.util.Date utilDate){
		return SIMPLEDATEFORMAT.format(utilDate);
	}
	
	// 定义方法实现架构java.util.Date类型转换为java.sql.Date类型
	public static java.sql.Date utilDateToSqlDate(java.util.Date utilDate){
		return new java.sql.Date(utilDate.getTime());
	}
}

AnimalDaoImpl类

  DAO层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表的增删改查,也就是说某个DAO一定是和数据库的某一张表一一对应的,其中封装了增删改查基本操作,建议DAO只做原子操作,增删改查。

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

public class AnimalDaoImpl {

	//全局变量
	PreparedStatement preS=null;
	Connection connection;

	//增
	public int insert(Animal animal){
		
		//获取链接
		connection=DBUtils.getConnection();
		String sql="insert into animal values(?,?,?,?);";
		
		try {
			preS=connection.prepareStatement(sql);
			// 绑定参数
			preS.setInt(1, animal.getAid());
			preS.setString(2, animal.getName());
			preS.setInt(3, animal.getAge());
			preS.setDate(4, DateUtils.utilDateToSqlDate(animal.getBirthday()));
			
			return preS.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			DBUtils.closeAll(null, preS, null);
		}		
		return 0;		
	}
	
	//删
	public int delete(int aid) {
		
		//获取链接
		connection = DBUtils.getConnection();
		String sql = "delete from animal where aid = ?;";
		
		try {
			preS = connection.prepareStatement(sql);
			// 绑定参数
			preS.setInt(1, aid);
			
			return preS.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtils.closeAll(null, preS, null);
		}
		return 0;
	}
	
	//改
	public int update(Animal animal) {
		
		//获取链接
		connection = DBUtils.getConnection();
		String sql = "update animal set name = ?,age = ?,birthday= ? where aid=?;";

		try {
			preS = connection.prepareStatement(sql);
			// 绑定参数
			preS.setString(1, animal.getName());
			preS.setInt(2, animal.getAge());
			preS.setDate(3, DateUtils.utilDateToSqlDate(animal.getBirthday()));
			preS.setInt(4, animal.getAid());

			return preS.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtils.closeAll(null, preS, null);
		}
		return 0;
	}
	
	//查(单个)
	public Animal select(int aid) {
		ResultSet resultSet = null;
		Animal animal = null;

		//获取连接
		connection = DBUtils.getConnection();
		String sql = "select * from animal where aid = ?";

		try {
			preS = connection.prepareStatement(sql);

			// 绑定参数
			preS.setInt(1, aid);
			resultSet = preS.executeQuery();

			if (resultSet.next()) {
				animal=new Animal(aid, resultSet.getString(2), resultSet.getInt(3), resultSet.getDate(4));
			}

			return animal;
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtils.closeAll(resultSet, preS, null);
		}
		return null;
	}
	
	//查(全部)
	public List<Animal> selectAll() {
		ResultSet resultSet = null;
		Animal animal = null;
		List<Animal> animalList = new ArrayList<Animal>();

		//获取连接
		connection = DBUtils.getConnection();
		String sql = "select * from animal";

		try {
			preS = connection.prepareStatement(sql);
			resultSet = preS.executeQuery();

			while (resultSet.next()) {
				animal=new Animal(resultSet.getInt(1), resultSet.getString(2), resultSet.getInt(3), resultSet.getDate(4));
				animalList.add(animal);
			}

			return animalList;
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtils.closeAll(resultSet, preS, null);
		}
		return null;
	}
}

AnimalServiceImpl类

  Service层叫服务层,被称为服务,粗略的理解就是对一个或多个DAO进行的再次封装,封装成一个服务,所以这里也就不会是一个原子操作了,需要事物控制。

public class AnimalServiceImpl {

	//定义AnimalDaoImpl对象
	AnimalDaoImpl animalDao=new AnimalDaoImpl(); 			

	//新增信息
	public boolean addNewData(Animal animal) {
		int num=animalDao.insert(animal);
		if(num!=0){
			return true;
		}else{
			return false;
		}
	}
	
	//删除信息
	public boolean delDate(int aid){
		int num=animalDao.delete(aid);
		if(num!=0){
			return true;
		}else{
			return false;
		}
	}
	
	//修改信息
	public boolean updateDate(Animal animal){
		int num=animalDao.update(animal);
		if(num!=0){
			return true;
		}else{
			return false;
		}
	}
	
	//查询信息
	public boolean selectDate(int aid){
		Animal animal=animalDao.select(aid);
		if(animal!=null){
			return true;
		}else{
			return false;
		}
	}
	
	//查询所有信息
	public void selectAllDates(){
		List<Animal> animalList=animalDao.selectAll();
		if(animalList.size()>0){
			System.out.println("****所有动物信息****");
			for (Animal animal : animalList) {
				System.out.println(animal);
			}
		}
	}
}

AnimalTest测试类

package cn.bdqn.demo02;
public class AnimalTest {

	public static void main(String[] args) {
		
		//创建AnimalServiceImpl对象
		AnimalServiceImpl animalServiceImpl = new AnimalServiceImpl();
		
		//增加三条数据
		Animal animal1 = new Animal(1, "旺财", 3,DateUtils.strToUtilDate("2019-08-18"));
		Animal animal2 = new Animal(2, "tom", 4,DateUtils.strToUtilDate("2018-06-25"));
		Animal animal3 = new Animal(3, "佩奇", 5,DateUtils.strToUtilDate("2017-07-02"));
		animalServiceImpl.addNewData(animal1);
		animalServiceImpl.addNewData(animal2);
		animalServiceImpl.addNewData(animal3);
		
		//删(aid=3)的数据
		animalServiceImpl.delDate(3);
		
		//改
		Animal animal4 = new Animal(1, "旺财", 4,DateUtils.strToUtilDate("2018-12-18"));
		animalServiceImpl.updateDate(animal4);
		
		//查一条(aid=2)的数据
		animalServiceImpl.selectDate(2);
		
		//查全部
		animalServiceImpl.selectAllDates();
	}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

deployment html--->JDBC--->mysql

spec: 相关属性定义 spec.selector: 符合该条件的收到该deployment管理 #spec.selector.matchLables 和 spec.template.metadata.labels 标签要一致 mysql Service metadata.name: Service的服务名 spec.ports: 虚拟端口 spec.selector: 哪些pod&#xff08;实列&…

《Java》深浅拷贝解析(还不会区分深浅拷贝吗?快进来)

目录 一、深浅拷贝的意义 浅拷贝 深拷贝 二、深浅拷贝举例 浅拷贝 深拷贝 一、深浅拷贝的意义 首先我们来了解一下深浅拷贝的意义 浅拷贝 浅拷贝是会将对象的每个属性进行依次复制&#xff0c;但是当对象的属性值是引用类型时&#xff0c;实质复制的是其引用&#xff0c…

全网最全【数据结构与算法】408真题实战(含代码+详解)—— 线性表专题(持续更新...)

线性表专题 每道题目均有对应的代码&#xff0c;大家自行查看哦&#xff01; 顺序表 ADT&#xff1a;SeqList 文件名&#xff1a;SeqList.hpp #include <iostream> #include <cstdlib> using namespace std; // 以上是实际运行所需依赖&#xff0c;考试不用写t…

怎样编写裸片启动程序-ARMv8的Boot Code和ROM程序

ROM程序就是固化在芯片的ROM里面&#xff0c;把应用程序从存储器里加载/搬移到RAM中并使处理器开始执行应用程序的一段程序 1 Boot Code和ROM程序 从多普通单核MCU&#xff08;如STM32&#xff09;的使用者的角度来看&#xff0c;只需要把编译好的hex文件烧写到片上Flash中&am…

JavaScript(WebAPI) (前端)

文章目录前言一、WebAPI二、DOM1.选中元素2.事件3.获取/修改元素内容4.获取/修改元素属性5.获取/修改表单元素属性6.操作复选框7.获取/修改样式属性①行内样式②通过css class 指定的样式8.新增节点9.删除节点总结前言 虽然学了一些js的语法,但是仍然无法写出页面的动态效果~~…

【JavaScript高级进阶】构造函数和原型,学会prototype

目录 前言 1.构造函数和原型 1.1使用prototype解决内存浪费的问题 1.2constructor构造函数构造器构造函数 2.原型链 2.1js中成员查找规则 2.2原型对象this指向 2.3扩展内置对象 3.call作用 4.继承 4.1利用原型对象继承 写在最后 前言 哈喽哈喽大家好&#xff0c;因为…

【Day1】零基础学java--》记事本运行java程序,通熟语言让你彻底明白为什么配置java环境变量

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#xff0c;从今天开始我将协同大家一起从零基础学习Java&#xff0c;期待与君为伴&#xff0c;走向海的彼岸。&#x1f495;&#x1f495;&#x1f495; &#x1f9d1;个人主页&#xff1a;良辰针不戳 &#x1f4d6;所属专栏&a…

C语言之数组练习题

第1关&#xff1a;数组插入元素 300 任务要求参考答案评论106 任务描述相关知识 数组数组元素的表示方法编程要求测试说明任务描述 本关需要你将一个数插入到一组已经排好序的数组并输出。 相关知识 数组在程序设计中&#xff0c;为了处理方便&#xff0c; 把具有相同类型…

【C++】多态 — 多态的原理 (下篇)

文章目录&#x1f4d6; 前言1. 虚函数表1.1 虚函数表的引入&#xff1a;1.2 基类的虚表&#xff1a;1.3 派生类虚表&#xff1a;2. 多态的原理2.1 多态虚函数的调用和普通函数的调用&#xff1a;2.1 - 1 到底什么是多态&#xff08;重点&#xff09;2.1 - 2 父类的指针实现多态…

Allegro基本规则设置指导书之Analysis Modes

Allegro基本规则设置指导书之Analysis Modes 下面介绍基本规则设置指导书之Analysis Modes 点击set-up-constrains-Modes 调出Analysis Modes,这个是所有DRC的总开关 下面介绍常用的一些开关设置 Design Options (Soldermask) 从上往下 阻焊到阻焊的间距 阻焊到pad和走线…

EasyCVR及智能分析网关在校园视频融合及明厨亮灶项目中的应用方案设计

随着校园智能化需求的不断增长&#xff0c;越来越多的校园逐渐开始升级校园监控视频平台&#xff0c;将原先传统的视频监控系统&#xff0c;逐渐升级转变为灵活性强、视频能力丰富、具备AI检测能力、并能支持视频汇聚与统一管理的智能化校园综合管理平台。 在某学校的视频监控…

MapReduce概述

MapReduce概述 MapReduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并发运行在一个Hadoop集群上。 MapReduce…

【优化算法】鹈鹕优化算法(POA)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

ARMv7/ARMv8/ARMv9架构你不知道的那些事

快速链接: . &#x1f449;&#x1f449;&#x1f449; 个人博客笔记导读目录(全部) &#x1f448;&#x1f448;&#x1f448; 付费专栏-付费课程 【购买须知】: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; 以下仅代表个人观点&…

七大排序算法——快速排序

AcWing算法专题——快速排序 文章目录AcWing算法专题——快速排序前言一、快速排序的核心二、算法图示三、算法代码四、算法详解1.递归停止的条件2.下标移动的实现3.下标初始值的设定4.边界情况分析4.1区间划分4.2 do while循环条件五、思考题总结前言 现在我们开始进入算法模块…

【第一章 虚拟机】

第一章 虚拟机 1. 虚拟机VM ①虚拟机就是一台虚拟的计算机&#xff0c;它是一款软件&#xff0c;用来执行一系列虚拟计算机指令。 ②虚拟机分为系统虚拟机和程序虚拟机。系统虚拟机&#xff08;比如VMware&#xff09;,它们完全是对物理计算机的仿真&#xff0c;提供了一个可运…

瑞芯微rk3568移植openbmc(三)

2022.11.04 更新 1、关于h264 novnc openbmc中使用的ipkvm其server端调用的是libvncserver库&#xff0c;而其web client端调用的则是novnc的库&#xff0c;既上篇研究修改了libvncserver后&#xff0c;再次继续研究了一下novnc。 Github搜索一圈以后&#xff0c;发现https://…

Java设计模式之单例模式详细讲解

设计模式与单例模式 1、什么是单例模式 ​ 单例模式是指保证某个类在整个软件系统中只有一个对象实例&#xff0c;并且该类仅提供一个返回其对象实例的方法&#xff08;通常为静态方法&#xff09; 2、单例模式的种类 ​ 经典的单例模式实现方式一般有五种 2.1 饿汉式 //…

【SpringBoot】SpringBoot整合SpringSecurity+thymeleaf实现认证授权(配置对象版)

一.概述 1.框架概述 Spring Security 是 Spring 家族中的一个安全管理框架&#xff0c;Spring Security 的两大核心功能就是认证&#xff08;authentication&#xff09;和授权&#xff08;authorization&#xff09;。 认证 &#xff1a;你是什么人。授权 &#xff1a;你能…

RHCE学习 --- 第一次作业

RHCE学习 — 第一次作业 首先我们先设置网卡开机自动启动 vi /etc/sysconfig/network-scripts/ifcfg-ens160 最下面修改ONBOOTyes 然后安装好chrony&#xff0c;配置/etc/chrony.conf文件&#xff0c;添加题目要求的时间服务器 然后设置一个例行性工作&#xff0c;每天早上九…