Java数据库操作

1、什么是SQL

SQL是结构化查询语句(Structured Query Language),是一种专门用于和数据库通信的计算机语言。具有以下几种特点:

  1. 可以跨各种数据库使用;
  2. 简单易学;
  3. 功能强大。

2、SQL增删改查语句

  1. SQL提供了SELECT语句来检索数据,基本语法如下:
SELECT <列名>
FROM <表名/视图>
WHERE <筛选条件>
ORDER BY <列名><ASC/DESC>

SELECT后面跟的是需要选出的列名;FROM后面指明了查找的对象,一般为表格;WHERE后面罗列了筛选条件;ORDER BY 则表示排序规则。

  1. SQL主要提供了INSERT、UPDATE和DELETE3种语句来更改数据库表格的数据,语法格式为
INSERT INTO<表名>(列名)VALUES(值列表)
UPDATE<表名>SET(键值对)WHERE(条件)
DELETE FROM <表名>WHERE(条件)

3、JDBC的工作原理是什么

JDBC(Java Data Base Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,是数据库开发人员能够用纯Java的API编写数据库应用程序。
JDBC由两部分注册组成,第一部分是供程序员调用的API,另一部分是需要数据库厂商实现的SPI(Service Provider Interface,数据库厂商需要实现的接口),也就是驱动程序。JDBC的架构方式:
在这里插入图片描述

4、请简述JDBC操作数据库的编程步骤

//第一步,注册驱动程序
Class.forName("数据库驱动的完整类名");
//第二步,获取一个数据库连接
Connection conn = DriverManager.getConnection("连接URL","用户名","密码");
//第三步,创建一个会话
Statement stmt = conn.creatStatement();
//第四步,执行SQL语句
stmt.executeUpdate("增删改SQL语句");
//SQL查询语句
ResultSet rs = stmt.executeQuery("SQL查询语句");
//第五步,对查询结果进行处理
while(rs.next()){
	//对查询记录的操作
}
//第六步,关闭连接
rs.close();
stmt.close();
conn.close();

在这里插入图片描述

5、如何使用JDBC事务

事务,指的是作为单个逻辑工作单元执行的一系列操作。正常的情况下,操作应该顺利执行,与操作相关的所有数据库信息也成功地更新。但是,如果在这一系列过程中任何一个环节出了差错,导致操作失败了,数据库中的所有信息都必须保持操作前的状态不变。否则,数据库的信息将会混乱。
一个逻辑工作单元成为事务必须满足ACID(原子性,一致性、隔离性、持久性)4大属性。

  1. 原子性:事务必须是原子工作单元;对于数据的x修改,要么全部执行,要么全都不执行;
  2. 一致性:事务在完成时,必须使所有的数据都保持一致的状态。例如:不能出现A银行转账扣款100元,但是B银行的账号只增加了10元;
  3. 隔离性:由并发事务所做的修改必须与任何其他并发事务所作的修改隔离。例如,用户A和C同时为B转账,一定不能同事对用户B的账户余额进行修改。
  4. 持久性:事务完成后,它对于系统的影响是持久性的。该修改即使出现致命的系统故障也将一直保持。

事务的结束只能有两种形式:提交和回滚。操作完全成功后则提交,产生永久性的修改;操作不完全成功则回滚,恢复到事务开始前的状态。它们都将结束一个事务。
JDBC提供了专门的使用事务的API。默认情况下,JDBC使用自动提交事务的方式,一旦执行SQL语句完成,就提交事务。但是,在多数情况下,需要开发者控制事务的过程,如果发生了某个异常或者参数出现问题以后,能够回滚事务。以下是一个JDBC事务的过程。

  1. 关闭自动提交事务。通过设置连接的自动提交事务属性为false,代码如下
Connection conn DriverManager.getConnection("连接URL","用户名","密码");
conn.setAutoCommit(false);//关闭自动提交事务
  1. 捕获(try catch)执行代码。如果执行过程顺利,提交事务;一旦发生异常,回滚(rollback)事务,代码如下
try{
	conn.setAutoCommit(false);//关闭自动提交事务
	stmt = conn.createStatement();//创建会话
	stmt.executeUpdate("sql");//执行增删改查的SQL命令
	conn.commit();//提交事务
}catch(Exception e){
	e.printStackTrace();
	conn.rollback();//回滚事务
}
  1. 关闭连接。该步骤最好是还在finally代码块中,这样可以确保关闭连接的操作执行了。
finally{
	if(stmt != null)//判断会话是否为空 
		stmt.close();//结束会话
	if(conn != null)//判断连接是否为空 
		conn.close();//关闭连接
}

总结
JDBC的事务主要是在代码中控制的,关键点在于:关闭自动提交事务、调用commit()方法提交事务和调用rollback()方法回滚事务。一般来说,JDBC中使用事务服务大致有以下步骤:

  1. 关闭自动提交事务,设置连接的自动提交事务属性为false;
  2. 捕获(try catch)执行代码。如果发生异常,回滚(rollback)事务;
  3. 关闭连接。

6、如何使用JDBC实现数据访问对象层(DAO)

分层开发应用程序,是目前比较提倡的一种开发方式。DAO层(数据访问层)是设计数据访问的一层,它往往处于业务层之下,数据库之上,为业务层的对象提供访问数据的接口。
Java是面向对象的语言,开发者在操作数据的时候,通常更习惯面对一个特定类型的对象,如一个用户就是一个User类对象。DAO层需要做的,就是为上层提供充分的对象支持,让上层再也看不到具体的数据,而是一个个活生生的对象
增删改查是操作DAO需要做的最基本的4项操作,查询一般需要提供遍历查询和id查询,对于遍历查询,DAO需要提供User泛型的List对象,对于id查询,则提供已经装配好数据的User对象。至于增加和修改操作,上层一般会提供一个User对象,DAO把User对象中的数据使用INSERT语句插入到表格中。删除操作则只需要提供一个id即可。

7、如何使用连接池技术

数据库连接池就像一个池子,这个池子里装的是数据库的连接(Connection)。程序员需要连接数据库的时候,只需要从池子里取出一个即可。当程序员调用Connection.close()方法的时候,这个连接就返回到池子中,而没有真正的与数据库断开连接。当连接不够用的时候,它会创建一个新的连接;同理,连接太多以后,它会自动关闭一些不必要的连接,如下图:
在这里插入图片描述
数据库连接池往往是作为一个单独的程序模块进行运行,由它来维护这些连接,程序员可以通过配置来控制它的一些属性,例如,最大获得连接数、对大空闲连接数、连接超时等。它与传统的JDBC通过连接的方式不太一样,程序员必须使用数据源(Data Source)的形式获取连接,数据源对象往往是以JNDI(Java Naming and Directory Interface,Java命名与目录接口)的形式通过给程序员。
数据库连接池必须javax.sql.DataSource接口,开发者只需要面向这些接口编程就好。使用连接池和传统的JDBC的主要差异在于获取连接的方式不同。传统的JDBC是通过驱动管理器(DriverManager)来获取连接,而连接池则需要用数据源(DataSource)来获取,示例代码啊如下:

//创建JNDI初始化上下文对象
InitialContext cxt = new InitialContext();
//通过JNDI上下文获取到数据源
DataSource ds = (DataSource)cxt.lookup("数据源在JNDI上的路径");
//通过数据源获取到对象
Connection conn = ds.getConnection();

8、如何使用可滚动的结果集

一般来说,ResultSet类的next()方法可以迭代遍历结果集中的所有行。有时候会希望在结果集上上前后移动,在JDBC2.0以后,ResultSet就可以滚动了,可以在结果集上前后移动并且可以跳转到结果集中的任何位置。大致与法如下:

Statement stmt = conn.createStatement(sql,type,concurrency);
PrepareStatement pstmt = conn.preparedStatement(sql,type,concurrency);

concurrency变量用于指定是否为可更新的结果集,包含以下两种值:

  1. CONCUR_READ_ONLY:结果集不能用于更新数据库;
  2. CONCUR_UPDATABLE:结果集可以用于更新数据库。

用变量type来设置是否是可滚动的结果集,可以在一下几个ResultSet类的静态变量中选择

  1. TYPE_FORWARD_ONLY:结果集不能滚动
  2. TYPE_SCROLL_INSENSITIVE:结果集可以滚动,但是对数据库变化不敏管,数据库查询生成结果集后发生了变化,结果集不发生变化。
  3. TYPE_SCROLL_SENSITIVE:结果集可以滚动,但是对数据库变化敏感。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值