Java开发基础-JDBC-对其技术的支持—02

(JDBC)01_JDBC基本使用------随堂练习 01_JDBC基本使用------随堂练习 练习题1:从控制台向数据库的表customers中插入一条数据,表结构如下: 练习题2:创立数据库表 examstudent,表结构如下: 向数据表中添加如下数据: 代码实现1:插入一个新的student 信息 请输入考生的详细信息 Type: IDCard: ExamCard: StudentName: Location: Grade... 阅读详情

JDBC应用中对数据库对象记录的映射JavaBean及增删改查(CRUD)的封装DAO

应用程序中使用数据访问对象(DAO)使我们可以将底层数据访问逻辑与业务逻辑分离开来。构建了为每一个数据源提供 CRUD (创建、读取、更新、删除)操作的 DAO 类。

Dao其实一般没有这个类,一般是指java中MVC架构中的model的概念,主要是访问数据库的一些常用方法。

相关概念:

JavaBean

满足如下规范的类: - 有package - 有无参构造器 - 实现序列化接口 - 有get/set方法

DAO


下面通过简单实例演示如何封装常用数据库操作类Dao

项目目录结构如下图


1.编写实体类:Emp

/**
 * 1.通常实体类和表名一致
 * 2.通常该类中属性名和字段名一致
 * 3.通常该类中属性都使用封装类型
 * @author Cher_du
 *
 */
public class Emp implements Serializable{
	
	private static final long serialVersionUID = 1L;
	
	private Integer empno;
	private String ename;
	private String job;
	private Integer mgr;
	private Date hiredate;
	private Double sal;
	private Double comm;
	private Integer deptno;
	
	
	public Integer getEmpno() {
		return empno;
	}
	public void setEmpno(Integer empno) {
		this.empno = empno;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	public Integer getMgr() {
		return mgr;
	}
	public void setMgr(Integer mgr) {
		this.mgr = mgr;
	}
	public Date getHiredate() {
		return hiredate;
	}
	public void setHiredate(Date hiredate) {
		this.hiredate = hiredate;
	}
	public Double getSal() {
		return sal;
	}
	public void setSal(Double sal) {
		this.sal = sal;
	}
	public Double getComm() {
		return comm;
	}
	public void setComm(Double comm) {
		this.comm = comm;
	}
	public Integer getDeptno() {
		return deptno;
	}
	public void setDeptno(Integer deptno) {
		this.deptno = deptno;
	}
	
}

2.编写数据库操作类EmpDao:【封装CURD】

public class EmpDao {
	
	//查询所有
	public List<Emp> findAll(){
		Connection conn = null;
		List<Emp> empList = new ArrayList<Emp>();
		try {
			conn = DBUtil.getConnection();
			String sql = "select * from emp ";
			PreparedStatement ps = conn.prepareStatement(sql);
			
			ResultSet rs  = ps.executeQuery();
			while(rs.next()){
				Emp e =new Emp();
				e.setEmpno(rs.getInt("empno"));
				e.setEname(rs.getString("ename"));
				e.setJob(rs.getString("job"));
				e.setMgr(rs.getInt("mgr"));
				e.setHiredate(rs.getDate("hiredate"));
				e.setSal(rs.getDouble("sal"));
				e.setComm(rs.getDouble("comm"));
				e.setDeptno(rs.getInt("deptno"));
				empList.add(e);
			}
			return empList;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return empList;
	}

	public Emp findById(int id){
		
		Connection conn =null;
		try {
			conn = DBUtil.getConnection();
			String sql = "select * from emp "
					    +"where empno =?";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setInt(1, id);
			ResultSet rs = ps.executeQuery();
			if(rs.next()){
				Emp e =new Emp();
				e.setEmpno(rs.getInt("empno"));
				e.setEname(rs.getString("ename"));
				e.setJob(rs.getString("job"));
				e.setMgr(rs.getInt("mgr"));
				e.setHiredate(rs.getDate("hiredate"));
				e.setSal(rs.getDouble("sal"));
				e.setComm(rs.getDouble("comm"));
				e.setDeptno(rs.getInt("deptno"));
				return e;
			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException("根据ID查询员工失败!",e);
		}finally{
			DBUtil.close(conn);
		}	
		return null;	
	}
	
	public boolean save(Emp emp){
		Connection conn = null;
		
		try {
			conn = DBUtil.getConnection();
			String sql = "insert into emp values("
					     +"?,?,?,?,?,?,?,?)";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setInt(1, emp.getEmpno());
			ps.setString(2, emp.getEname());
			ps.setString(3, emp.getJob());
			ps.setInt(4, emp.getMgr());
			ps.setDate(5, emp.getHiredate());
			ps.setDouble(6,emp.getSal());
			ps.setDouble(7, emp.getComm());
			ps.setInt(8, emp.getDeptno());
			
		    int count = ps.executeUpdate();
			
		    if(count>0){
		    	return true;
		    }else{
		    	return false;
		    }
			
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException("保存员工失败!",e);
		}finally{
			DBUtil.close(conn);
		}
	}
	
	public void update(Emp emp){
		Connection conn = null;
		
		try {
			conn = DBUtil.getConnection();
			String sql = "update emp set "
					     +"ename =?,"
					     +"job =?,"
					     +"mgr =?,"
					     +"hiredate =?,"
					     +"sal =?,"
					     +"comm =?,"
					     +"deptno =? "
					     +"where empno=?";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setString(1, emp.getEname());
			ps.setString(2, emp.getJob());
			ps.setInt(3, emp.getMgr());
			ps.setDate(4, emp.getHiredate());
			ps.setDouble(5,emp.getSal());
			ps.setDouble(6, emp.getComm());
			ps.setInt(7, emp.getDeptno());
			ps.setInt(8, emp.getEmpno());
			ps.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException("修改员工失败!",e);
		}finally{
			DBUtil.close(conn);
		}
		
		
	}
	
	public boolean delete(int id){
		Connection conn =null;
		try {
			conn = DBUtil.getConnection();
			String sql = "delete from emp "
					    +"where empno =?";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setInt(1, id);
			int count = ps.executeUpdate();
			
			if(count>0){
				return true;
			}else{
				return false;
			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException("根据ID删除员工失败!",e);
		}finally{
			DBUtil.close(conn);
		}	
	}
}

3.编写EmpDao测试类

public class EmpDaoTest {
	
	public static void main(String[] args) {
//		EmpDao dao = new EmpDao();
//		Emp emp = new Emp();
//		emp.setEmpno(1000);
//		emp.setEname("Jimmy");
//		emp.setJob("经理");
//		emp.setHiredate(new Date(System.currentTimeMillis()));
//		emp.setSal(10000.00);
//		emp.setComm(2000.00);
//		emp.setDeptno(20);
//		emp.setMgr(45);
//		
//		boolean  b = dao.save(emp);
//		System.out.println(b);
		
//		EmpDao dao = new EmpDao();
//		Emp emp = new Emp();
//		emp.setEmpno(1000);
//		emp.setEname("Jimmy");
//		emp.setJob("高级经理");
//		emp.setHiredate(new Date(System.currentTimeMillis()));
//		emp.setSal(10000.00);
//		emp.setComm(2000.00);
//		emp.setDeptno(20);
//		emp.setMgr(45);
//		
//		dao.update(emp);
		
//		EmpDao dao = new EmpDao();
//		Emp emp = new Emp();
//		
//		emp =dao.findById(1000);
//		System.out.println(emp.getEname());
		
//		EmpDao dao = new EmpDao();
//		Emp emp = new Emp();
//		
//		boolean b =dao.delete(1000);
//		System.out.println(b);
		
		EmpDao dao = new EmpDao();
		List<Emp> empList =dao.findAll();
        for(Emp e :empList){
        	System.out.println(e.getEname());
        }
		
	}

}

总结: DAO常用于MVC开发模式中
DAO层一般有接口和该接口的实现类! 接口用于规范实现类! 实现类一般用于用于操作数据库! 一般操作修改,添加,删除数据库操作的步骤很相似,就写了一个公共类DAO类 ,修改,添加,删除数据库操作时 直接调用公共类DAO类
Doris Streamloader安装教程 Doris Streamloader 是一款用于将数据导入 Doris 数据库的专用客户端工具。本文介绍其在centos7环境下的安装过程 阅读详情

相关推荐

cadence Virtuoso ADE原理图库中的VCVS(压控电压源)使用

Symbol: vcvs (Voltage Controlled Voltage Source) Vop−Von=egain⋅(Vip−Vin)V_{op}-V_{on}=egain\cdot(V_{ip}-V_{in})Vop​−Von​=egain⋅(Vip​−Vin​) 所以可以得出 ⟹Vop=egain⋅(Vip−Vin)+Von\Longrightarrow V_{op}=egain\cdot(V_{ip}-V_{in})+V_{on}⟹Vop​=egain⋅(Vip​−Vin​)+Von​ 使

大学生视野 2万+

JSP学习笔记(2)

一.JSP的运行原理 1.JSP处理请求的过程 2.JSP翻译的详细过程 package dao; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import entity.Emp; public class EmpDao implements Ser...

Jak的博客 376

Android应用隐私合规自动化检测:Frida与Camille实战指南

在移动应用安全与隐私合规领域,动态代码插桩技术已成为核心检测手段。其原理是通过运行时注入,实时监控和修改应用行为,从而绕过传统静态分析的局限。这项技术的核心价值在于能够精准捕获应用在运行时的敏感数据调用与网络传输行为,为隐私合规审计、安全测试提供直接证据。在实际应用场景中,它尤其适用于自动化检测违规收集个人信息、追踪数据流向等任务。本文聚焦于利用Frida这一动态插桩框架,结合Camille隐私合规检测工具集,构建自动化监控环境。通过注入JavaScript代码,实现对Android敏感API(如获取设备标

weixin_34254464的博客 389

数据结构与算法学习笔记——数据结构(七):哈希表

1 介绍 散列表(Hash table,也叫哈希表),根据关键码值(Key value)而直接进行访问的数据结构。 它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。 这个映射函数叫做散列函数,存放记录的数组叫做散列表。 2 分析 哈希冲突:哈希表关键码值key是通过哈希函数计算得到一个值,这个key反映的是在数组上的位置,当key值相同的时候就是哈希冲突。 处理哈希冲突的方式: 开放寻址法:如果位置被占了,那就另外再找个位置。最基本的方法就是查看该位置的后一个位置是否可用,如果没有

最初的模样 310

深入解析LCD DRM驱动框架中的KMS与GEM机制

本文深入解析了Linux内核中DRM(Direct Rendering Manager)驱动框架的核心机制,重点剖析了KMS(内核模式设置)与GEM(图形执行管理器)的工作原理。KMS作为显示系统的总指挥,负责原子化地控制CRTC、Encoder、Plane等硬件资源,确保画面同步更新,避免撕裂;GEM则作为显存大管家,通过DUMB和PRIME机制高效管理图形缓冲区的分配、共享与同步。文章结合RK3568平台实战,阐述了如何利用这些机制优化显示性能,并提供了调试技巧与常见问题解决方案。

weixin_29188997的博客 388

电子设计实战:用MOS管手把手搭建D触发器电路(含时序分析避坑指南)

本文详细介绍了如何使用MOS管从零开始搭建D触发器电路,重点解析了建立时间和保持时间等关键时序参数对电路稳定性的影响。通过实测波形分析和避坑指南,帮助电子工程师掌握D触发器的实际搭建技巧与优化方法,提升数字电路设计的可靠性。

x1y2z的博客 1164

Jdbc_修改删除

// 添加emp 修改emp 单条删除delById 批量删除(id1,id2,) //添加 @Test public void insert() throws ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/yunjiaen?characterEncoding=UTF-8&useUnicode=t

weixin_45019989的博客 284

VS Code+ESP-IDF开发避坑指南:头文件标红报错的5种解决方法(附CMakeLists.txt配置)

本文详细解析了在VS Code中使用ESP-IDF开发ESP32时头文件标红报错的5种解决方法,包括环境配置检查、CMakeLists.txt规范配置、路径解析策略、缓存清理技巧和高级调试手段。特别提供了CMakeLists.txt的实战配置示例,帮助开发者彻底解决头文件路径问题,提升开发效率。

weixin_33670786的博客 560

2021-04-04-数据库学习之5-JDBC

一、JDBC 1. 概念 JDBC:Java DataBase Connectivity Java 数据库连接,Java语言操作数据库。 JDBC本质:期望使用同一的一套Java代码可以操作所有的关系型数据,JDBC定义了一套操作所有关系型数据库的规则(规则),每种数据库定义自己的JDBC实现类。其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据驱动jar包。我们呢可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包种的实现类。 (2)

weixin_42656213的博客 236

NE555构成多谐振荡器及三角波、正弦波的生成(附工程文件)

NE555构成多谐振荡器及三角波、正弦波的生成 续上一篇:NE555基本原理及相关公式的推导

qq_49979053的博客 5万+

统信UOS/麒麟Kylin OS下利用pyenv实现Python多版本开发环境搭建指南

本文详细介绍了在统信UOS和麒麟Kylin OS国产操作系统下使用pyenv搭建Python多版本开发环境的完整指南。从系统环境准备、pyenv定制安装到Python版本编译实战,提供了针对国产CPU架构的特殊优化方案和常见问题解决方法,帮助开发者高效管理不同Python版本需求。

sea99的博客 1053

Java开发基础-JDBC-对其技术的支持—02,java线程面试题目

throw new RuntimeException(“根据ID查询员工失败!”,e);)”;}else{throw new RuntimeException(“保存员工失败!”,e);,”+“job =?,”+“mgr =?,”+“comm =

2201_75604341的博客 1049

uniapp - [全端兼容] 高性能 tabbar 底部菜单凸起效果,原生系统自定义底部菜单不卡顿、切换页面不闪烁、自动缓存页面(底部菜单中间自定义一个图片并悬浮起来)

uniapp如何实现底部凸起按钮,uniapptabbar底部菜单怎么自定义,uniapp怎么让底部菜单中间突出来,uniapp自定义底部tabbar,uniapp高性能好用的底部菜单,uniapp自定义底部导航栏并解决闪烁问题,uniapp怎么设置凸起的底部tabbar,uniapp怎么用系统的底部菜单还想让中间的按钮凸起来,uniapp自定义tabbar性能不好怎么办,uni-app自定义导航栏实现中间凸起效果,uniapp底部导航栏中间圆形按钮凸起效果详细代码,uni-app自定义中间图标突起的

🏆 前端领域优质创作者 1万+

最新Java开发基础-JDBC-对其技术的支持—02,Java进阶

可能有人会问我为什么愿意去花时间帮助大家实现求职梦想,因为我一直坚信时间是可以复制的。我牺牲了自己的大概十个小时写了这片文章,换来的是成千上万的求职者节约几天甚至几周时间浪费在无用的资源上。上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取。

2401_84006757的博客 850

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java开发基础-JDBC-对其技术的支持—02,Java架构师教你如何突破瓶颈

包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~

jiameih的博客 898

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

02-JDBC事务支持

1. 数据库事务 1.1 是什么 什么是事务,可以阅读我写的有关数据库 事务 这篇文章。从事务的四大特性来说,事务机制是为了保证数据的一致性,事务是最小的执行单元,要么全部成功要么全部不成功。 1.2 为什么 众所周知,SQL语言是一种操作数据库的非过程化语言,无疑它的功能是很强大的。比如一个小小的select语法结构就可以查询到我们想要的任何数据,多么简洁方便。 然而业务是复杂的,一条SQL并不能满足我们的需求,往往一个业务的执行需要多条SQL语句的配合使用来完成。一个写操作会改变数据库的数据,多个写操

天天向上 2099

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

数据库开发基础案例——JDBC技术应用

在数据库中,数据是以表(Table)为单位进行组织的。数据表由列(column)组成,通过列名和数据类型等来指定列的属性,数据表的每一列存储了表中某一类特定的信息,如学号或者姓名等。列(column)也可以叫做数据表的一个字段,列(column)的名字也叫做字段名;表中的数据是按行(row)进行存储的,每一行代表一条数据记录。

weixin_51970555的博客 4015

Java Web开发基础——数据库基础与JDBC

关系型数据库(RDBMS)是基于关系模型的数据管理系统,它使用表格(或称为关系)来存储数据,表格中的数据以行和列的形式组织,每一行表示一条记录,每一列表示一个属性。:PreparedStatement是Statement的子接口,用于执行预编译的SQL语句,它提供了更高的效率和更好的防止SQL注入的安全性。:JDBC驱动程序用于在Java应用程序和数据库之间建立连接,不同的数据库有不同的JDBC驱动(如MySQL、Oracle等)。:ResultSet用于保存查询的结果,返回的是一个数据库结果集。

好看资源网的博客 944

【Java】JDBC基础使用教程

JDBC一、JDBC简介 一、JDBC简介 JDBC 通过Java代码来操作数据库 实际工作中大部分的数据库操作,都是通过代码来完成的.格子编程语言都可以操作数据库,主要是数据库提供了各种版本的API(一组函数 / 一组类),调用这些API就可以操作数据库 ...

意愿三七 3万+
上一篇: Java开发基础-JDBC-对其技术的支持—01
下一篇: Java开发基础-JDBC-对其技术的支持—03
Coder_Boy_
博客等级 码龄10年 2804粉丝 819原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder_Boy_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值