1、什么是SQL
SQL是结构化查询语句(Structured Query Language),是一种专门用于和数据库通信的计算机语言。具有以下几种特点:
- 可以跨各种数据库使用;
- 简单易学;
- 功能强大。
2、SQL增删改查语句
- SQL提供了SELECT语句来检索数据,基本语法如下:
SELECT <列名>
FROM <表名/视图>
WHERE <筛选条件>
ORDER BY <列名><ASC/DESC>
SELECT后面跟的是需要选出的列名;FROM后面指明了查找的对象,一般为表格;WHERE后面罗列了筛选条件;ORDER BY 则表示排序规则。
- 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大属性。
- 原子性:事务必须是原子工作单元;对于数据的x修改,要么全部执行,要么全都不执行;
- 一致性:事务在完成时,必须使所有的数据都保持一致的状态。例如:不能出现A银行转账扣款100元,但是B银行的账号只增加了10元;
- 隔离性:由并发事务所做的修改必须与任何其他并发事务所作的修改隔离。例如,用户A和C同时为B转账,一定不能同事对用户B的账户余额进行修改。
- 持久性:事务完成后,它对于系统的影响是持久性的。该修改即使出现致命的系统故障也将一直保持。
事务的结束只能有两种形式:提交和回滚。操作完全成功后则提交,产生永久性的修改;操作不完全成功则回滚,恢复到事务开始前的状态。它们都将结束一个事务。
JDBC提供了专门的使用事务的API。默认情况下,JDBC使用自动提交事务的方式,一旦执行SQL语句完成,就提交事务。但是,在多数情况下,需要开发者控制事务的过程,如果发生了某个异常或者参数出现问题以后,能够回滚事务。以下是一个JDBC事务的过程。
- 关闭自动提交事务。通过设置连接的自动提交事务属性为false,代码如下
Connection conn DriverManager.getConnection("连接URL","用户名","密码");
conn.setAutoCommit(false);//关闭自动提交事务
- 捕获(try catch)执行代码。如果执行过程顺利,提交事务;一旦发生异常,回滚(rollback)事务,代码如下
try{
conn.setAutoCommit(false);//关闭自动提交事务
stmt = conn.createStatement();//创建会话
stmt.executeUpdate("sql");//执行增删改查的SQL命令
conn.commit();//提交事务
}catch(Exception e){
e.printStackTrace();
conn.rollback();//回滚事务
}
- 关闭连接。该步骤最好是还在finally代码块中,这样可以确保关闭连接的操作执行了。
finally{
if(stmt != null)//判断会话是否为空
stmt.close();//结束会话
if(conn != null)//判断连接是否为空
conn.close();//关闭连接
}
总结
JDBC的事务主要是在代码中控制的,关键点在于:关闭自动提交事务、调用commit()方法提交事务和调用rollback()方法回滚事务。一般来说,JDBC中使用事务服务大致有以下步骤:
- 关闭自动提交事务,设置连接的自动提交事务属性为false;
- 捕获(try catch)执行代码。如果发生异常,回滚(rollback)事务;
- 关闭连接。
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变量用于指定是否为可更新的结果集,包含以下两种值:
- CONCUR_READ_ONLY:结果集不能用于更新数据库;
- CONCUR_UPDATABLE:结果集可以用于更新数据库。
用变量type来设置是否是可滚动的结果集,可以在一下几个ResultSet类的静态变量中选择
- TYPE_FORWARD_ONLY:结果集不能滚动
- TYPE_SCROLL_INSENSITIVE:结果集可以滚动,但是对数据库变化不敏管,数据库查询生成结果集后发生了变化,结果集不发生变化。
- TYPE_SCROLL_SENSITIVE:结果集可以滚动,但是对数据库变化敏感。