0

0

java自学之路-----jdbc_基础

php中文网

php中文网

发布时间:2016-06-07 16:09:48

|

1269人浏览过

|

来源于php中文网

原创

JDBC(Java Data Base Connectivity):便于应用程序通过jdbc来操作数据库的数据 操作数据库基本步骤:(先导入该数据库的驱动程序){ 1.先与数据库进行连接,获取该数据库的对象(1.先加载数据库的驱动 2.通过数据库的基本信息来获取连接 3.通过连接获取操

JDBC(Java Data Base Connectivity):便于应用程序通过jdbc来操作数据库的数据

操作数据库基本步骤:(先导入该数据库的驱动程序){

1.先与数据库进行连接,获取该数据库的对象(1.先加载数据库的驱动 2.通过数据库的基本信息来获取连接 3.通过连接获取操作数据库的statement对象)

2.然后使用该对象执行sql语句{

数据库url:用于标识数据库的位置,程序需要通过url告诉jdbc程序连接那个数据库,写法:

jdbc : mysql : // localhost:3306 / mydb ?参数名:参数值 协议 子协议 主机:端口 数据库名
		String url = "jdbc://localhost:3306/mydb";//数据库的地址
		String user = "root";//数据库用户名
		String password = "root";//数据库密码
//第一种方式:
//		1.先加载驱动
		DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//		2.通过驱动获取连接
		Connection conn1 = DriverManager.getConnection(url, user, password);
//		3.通过连接获取statement对象
		Statement st1 = conn1.createStatement();
//	缺点:1.驱动程序注册两次:通过查看驱动类driver.class可以知道,该类有一个构造函数,在加载该类的时候自动在驱动里注册一次,所以在内存中就会出现两个driver对象
//		  2.程序import了mysql驱动,导致程序依赖mysql驱动api,离开了该jar包,程序编译就通不过
//第二种方式:
//		1.先加载驱动
		Class.forName("com.mysql.jdbc.Driver");
//		2.通过驱动获取连接
		Connection conn2 = DriverManager.getConnection(url, user, password);
//		3.通过连接获取statement对象
		Statement st2 = conn2.createStatement();
//	优点:该方式不会导致驱动对象在内存中重复出现,并且该方式下,程序只用一个字符串,不需要依赖具体驱动。	

Connection:代表数据库的连接,用于客户端与数据库的交互

1.createStatement();创建向数据库发送sql的statement对象

立即学习Java免费学习笔记(深入)”;

2.prepareStatement(sql);创建向数据库发送预编译sql的preparestatement对象

3.prepareCall(sql);创建执行存储过程的callableStatement对象

4.setAutoCommit(boolean b);设置事务是否自动提交

5.commit();在连接上提交事务

6.rollback();在此链接上回滚事务

Statement:用于向数据库发送sql语句

1.executeQuery(sql);用于向数据库发送查询语句。返回resultset对象

2.executeUpdate(sql);用于向数据库发送更新,插入,删除语句。返回影响数据的行数,大于0说明执行成功

3.execute(sql);用于向数据库发送任意语句。返回是否执行成功

4.addBatch(sql);将多条sql语句放在一个批处理中

5.executeBatch();向数据库发送一批sql语句

}

3.如果是select的sql就会返回结果集:ResultSet

4.通过该结果集可以获取select的所有数据{

//	如果sql为select
//		4.通过对象执行sql语句
//		5.获取ResultSet对象
//		6.遍历结果集,获取数据
		ResultSet rs = st.executeQuery("select * from users");//select的sql
//		int num = st.executeUpdate("update users set name='a'");
		while(rs.next()){
			Object value1 = rs.getObject(1);
			String value2 = rs.getString(2);
			Int value3 = rs.getInt(3);
//			...通过列的名字或者该列所的索引作为参数来获取该列的值
		}

ResultSet:用于代表sql语句的执行结果,该对象采用类似表格的方式来封装执行结果。它维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用next()方法,游标就指向了具体的数据行,再通过get方法获取该行数据。

获取任意类型的数据

getObject(int index);

getObject(String columnName);

获取相对应该列的属性的方法

}

5.释放资源{

android中音频视频开发教程 中文WORD版
android中音频视频开发教程 中文WORD版

媒体包提供了可管理各种媒体类型的类。这些类可提供用于执行音频和视频操作。除了基本操作之外,还可提供铃声管理、脸部识别以及音频路由控制。本文说明了音频和视频操作。 本文旨在针对希望简单了解Android编程的初学者而设计。本文将指导你逐步开发使用媒体(音频和视频)的应用程序。本文假定你已安装了可开发应用程序的Android和必要的工具,同时还假定你已熟悉Java或掌握面向对象的编程概念。感兴趣的朋友可以过来看看

下载

 

		} finally{
			if(rs!=null){
				try {
					rs.close();
				} catch (Exception e) {
					rs = null;
				}
			}
			if(st!=null){
				try {
					st.close();
				} catch (Exception e) {
					st = null;
				}
			}if(conn!=null){
				try {
					conn.close();
				} catch (Exception e) {
					conn = null;
				}
			}
		}

1.jdbc程序运行结束之后,需要释放程序在运行过程中创建的那些与数据库进行交互的对象,通常 是ResultSet,Statement,和Connection对象

2.Connection对象,这是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。所以需要尽量晚创建,尽量早的关闭

3.为保证释放程序的代码执行,就必须放在finally语句中

}

}

创建工具类,简化操作{

public class JdbcUtils {
//	存储配置信息
	private static Properties config = new Properties();
//	提供一个静态代码块,确保第一次加载该类的时候将相关信息,加载到内存中
	static{
		try {
//		从配置文件中获取数据库相关信息,加载到config中,该文件要放在类路径下
			InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
			config.load(in);
			Class.forName(config.getProperty("driver"));
		} catch (Exception e) {
//			直接报错,因为配置文件有问题,连接不了数据库
			throw new ExceptionInInitializerError(e);
		}
	}
	
//	提供一个静态方法,为程序提供连接,异常直接抛给调用程序处理
	public static Connection getConnection() throws SQLException{
		return DriverManager.getConnection(config.getProperty("url"), config.getProperty("user"), config.getProperty("password"));
	}
//	提供一个释放资源的方法
	public static void release(Connection conn, Statement st, ResultSet rs){
		if(rs!=null){
			try {
				rs.close();
			} catch (Exception e) {
//				记录下异常信息
				e.printStackTrace();
				rs = null;
			}
		}
		if(st!=null){
			try {
				st.close();
			} catch (Exception e) {
				e.printStackTrace();
				st = null;
			}
		}
		if(conn!=null){
			try {
				conn.close();
			} catch (Exception e) {
				e.printStackTrace();
				conn = null;
			}
		}
	}
}

db.properties文件{

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/mydb

user=root

password=root

}

工厂类:将程序与dao层的操作进行解耦,{

//在web程序中,该工厂实现了service和dao层解耦。在修改底层代码的时候,不需要修改上层的代码,只需要修改配置文件即可
public class DaoFactory {
//	读取配置文件来创建接口对应的dao实例,也可以将该代码放在构造函数中
	private static Properties prop = new Properties();
	static{
		try {
//			dao.properties文件内 包含: UserDao = cn.halm.dao.UserDaoImpl
			prop.load(DaoFactory.class.getClassLoader().getResourceAsStream("dao.properties"));
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
//需要设计为单例模式
//	1.构造函数私有化
	private DaoFactory() {}
//	2.创建该类的一个私有的实例化对象
	private static DaoFactory instance = new DaoFactory();
//	3.将该对象提供给程序
	public static DaoFactory getInstance(){
		return instance;
	}
//	提供一个方法,从配置文件中读取信息后根据接口创建相应的实现类实例
	public  T createDao(Class interfaceClazz){
		try {
//		通过接口字节码文件获取接口名
			String interfaceName = interfaceClazz.getSimpleName();
//		通过接口名获取配置文件中对应的该接口的实现类的名称
			String implName = prop.getProperty(interfaceName);
//		返回该实现类的实例
			return (T) Class.forName(implName).newInstance();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}

}

PreparedStatement对象{

1.是Statement的子类

2.可以有效的防止SQL注入:

 

sql = "select * from users where username = '"+username+"' and password = '"+password+"'";如果两个变量password,username="'or 1=1 or username='",那么该语句就为:select * from users where username='' or true or username=''——>select * from users where true;该语句就一定能从数据库中找到数据。这就是SQL注入!如果使用PreparedStatement会对传入的变量进行转义,就能预防该问题

3.该对象会对sql语句进行预编译,以减轻数据库服务器的压力,提高效率。statement对象会使数据库频繁编译sql,可能造成数据库缓冲区溢出

4.允许使用占位符替换参数,简化sql语句的编写

用法:

 

//			定义sql语句,包含占位符“?”
			String sql = "select * from users where username=? and id=?";
//			预编译sql语句获取对象
			PreparedStatement st = conn1.prepareStatement(sql);
//			从1开始,不同类型的数据使用不同的方法
			st.setString(1, user.getUsername());
			st.setInt(2, user.getId());
			st.executeQuery();
//			st.executeUpdate();insert,update,delete语句使用

获取插入数据的主键值:getGeneratedKeys()获取新插入数据的在数据库中自动增长的值,一般为主键{

如果没有这个方法,如果该主键值在数据库中被设置为自动增长,插入数据就不需要传入主键值,所以就无法直接获取该主键值,必须通过查表

注意:在mysql数据库中只能有一个字段修饰为auto_increment

//			获取执行执行sql语句的对象,指定一个常量值Statement.RETURN_GENERATED_KEYS,说明该自动增长的主键值被返回,如果不是insert的sql可以忽略该参数值,没有该参数,就不返回主键值
			PreparedStatement st = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
//			使用该方法获取新生成的包含在数据库中自动增长的值的ResultSet对象
//			该对象中只有一列,存放新生成的主键值,不是insert的sql语句,该方法无用
			ResultSet rs = st.getGeneratedKeys();
//			遍历,获取值
			rs.next();
			rs.getInt(1);
}

}

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

公务员递补名单公布时间 公务员递补要求
公务员递补名单公布时间 公务员递补要求

公务员递补名单公布时间不固定,通常在面试前,由招录单位(如国家知识产权局、海关等)发布,依据是原入围考生放弃资格,会按笔试成绩从高到低递补,递补考生需按公告要求限时确认并提交材料,及时参加面试/体检等后续环节。要求核心是按招录单位公告及时响应、提交材料(确认书、资格复审材料)并准时参加面试。

44

2026.01.15

公务员调剂条件 2026调剂公告时间
公务员调剂条件 2026调剂公告时间

(一)符合拟调剂职位所要求的资格条件。 (二)公共科目笔试成绩同时达到拟调剂职位和原报考职位的合格分数线,且考试类别相同。 拟调剂职位设置了专业科目笔试条件的,专业科目笔试成绩还须同时达到合格分数线,且考试类别相同。 (三)未进入原报考职位面试人员名单。

58

2026.01.15

国考成绩查询入口 国考分数公布时间2026
国考成绩查询入口 国考分数公布时间2026

笔试成绩查询入口已开通,考生可登录国家公务员局中央机关及其直属机构2026年度考试录用公务员专题网站http://bm.scs.gov.cn/pp/gkweb/core/web/ui/business/examResult/written_result.html,查询笔试成绩和合格分数线,点击“笔试成绩查询”按钮,凭借身份证及准考证进行查询。

11

2026.01.15

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

65

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

36

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

75

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

21

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

35

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.5万人学习

C# 教程
C# 教程

共94课时 | 6.8万人学习

Java 教程
Java 教程

共578课时 | 46.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号