JDBC简介

Posted 快猜猜我是谁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC简介相关的知识,希望对你有一定的参考价值。

JDBC操作数据库的步骤 ?

  1. 注册数据库驱动。

  2. 建立数据库连接。

  3. 创建一个Statement。

  4. 执行SQL语句。

  5. 处理结果集。

  6. 关闭数据库连接

代码如下

 

 

 

JDBC中的Statement 和PreparedStatement,CallableStatement的区别?

区别:

  • PreparedStatement是预编译的SQL语句,效率高于Statement。

  • PreparedStatement支持?操作符,相对于Statement更加灵活。

  • PreparedStatement可以防止SQL注入,安全性高于Statement。

  • CallableStatement适用于执行存储过程。

JDBC中大数据量的分页解决方法?

最好的办法是利用sql语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容。

 

说说数据库连接池工作原理和实现方案?

工作原理:

  • JAVA EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。

实现方案:连接池使用集合来进行装载,返回的Connection是原始Connection的代理,代理Connection的close方法,当调用close方法时,不是真正关连接,而是把它代理的Connection对象放回到连接池中,等待下一次重复利用。

Java中如何进行事务的处理?

Connection类中提供了4个事务处理方法:

  • setAutoCommit(Boolean autoCommit):设置是否自动提交事务,默认为自动提交,即为true,通过设置false禁止自动提交事务;

  • commit():提交事务;

  • rollback():回滚事务.

  • savepoint:保存点

    • 注意:savepoint不会结束当前事务,普通提交和回滚都会结束当前事务的

  • Class.forName("com.mysql.jdbc.Driver");
    String url="jdbc:mysql://localhost/test";
    Stirng user=\'root\';
    String password=\'root\';
    Connection conn = DriverManager.getConnection(url,user,password);

    execute,executeQuery,executeUpdate的区别是什么?

  • JDBC的脏读是什么?哪种数据库隔离级别能防止脏读?

    JDBC的脏读是什么?哪种数据库隔离级别能防止脏读?

    脏读:一个事务读取到另外一个事务未提交的数据

    例子:A向B转账,A执行了转账语句,但A还没有提交事务,B读取数据,发现自己账户钱变多了!B跟A说,我已经收到钱了。A回滚事务【rollback】,等B再查看账户的钱时,发现钱并没有多。

    下面的三种个隔离级别都可以防止:

    • Serializable【TRANSACTION_SERIALIZABLE】

    • Repeatable read【TRANSACTION_REPEATABLE_READ】

    • Read committed【TRANSACTION_READ_COMMITTED】

什么是幻读,哪种隔离级别可以防止幻读?

什么是幻读,哪种隔离级别可以防止幻读?

是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

只有TRANSACTION_SERIALIZABLE隔离级别才能防止产生幻读。

JDBC的DriverManager是用来做什么的?

JDBC的DriverManager是用来做什么的?

  • JDBC的DriverManager是一个工厂类,我们通过它来创建数据库连接。

  • 当JDBC的Driver类被加载进来时,它会自己注册到DriverManager类里面

  • 然后我们会把数据库配置信息传成DriverManager.getConnection()方法,DriverManager会使用注册到它里面的驱动来获取数据库连接,并返回给调用的程序

  • JDBC的ResultSet是什么? ##

    • 在查询数据库后会返回一个ResultSet,它就像是查询结果集的一张数据表。

    • ResultSet对象维护了一个游标,指向当前的数据行。开始的时候这个游标指向的是第一行。如果调用了ResultSet的next()方法游标会下移一行,如果没有更多的数据了,next()方法会返回false。可以在for循环中用它来遍历数据集。

    • 默认的ResultSet是不能更新的,游标也只能往下移。也就是说你只能从第一行到最后一行遍历一遍。不过也可以创建可以回滚或者可更新的ResultSet

    • 当生成ResultSet的Statement对象要关闭或者重新执行或是获取下一个ResultSet的时候,ResultSet对象也会自动关闭。

    • 可以通过ResultSet的getter方法,传入列名或者从1开始的序号来获取列数据。

  JDBC的DataSource是什么,有什么好处

  DataSource即数据源,它是定义在javax.sql中的一个接口,跟DriverManager相比,它的功能要更强大。我们可以用它来创建数据库连接,当然驱动的实现类会实际去完成这个工作。除了能创建连接外,它还提供了如下的特性:

  • 缓存PreparedStatement以便更快的执行

  • 可以设置连接超时时间

  • 提供日志记录的功能

  • ResultSet大小的最大阈值设置

  • 通过JNDI的支持,可以为servlet容器提供连接池的功能

如何通过JDBC的DataSource和Apache Tomcat的JNDI来创建连接池?

Tomcat服务器也给我们提供了连接池,内部其实就是DBCP

步骤:

  1. 在META-INF目录下配置context.xml文件【文件内容可以在tomcat默认页面的 JNDI Resources下Configure Tomcat\'s Resource Factory找到】

  2. 导入Mysql或oracle开发包到tomcat的lib目录下

  3. 初始化JNDI->获取JNDI容器->检索以XXX为名字在JNDI容器存放的连接池

context.xml文件的配置:

<Context>

<Resource name="jdbc/EmployeeDB"
auth="Container"
type="javax.sql.DataSource"

username="root"
password="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/zhongfucheng"
maxActive="8"
maxIdle="4"/>
</Context>


    try {

            //初始化JNDI容器
            Context initCtx = new InitialContext();

            //获取到JNDI容器
            Context envCtx = (Context) initCtx.lookup("java:comp/env");

            //扫描以jdbc/EmployeeDB名字绑定在JNDI容器下的连接池
            DataSource ds = (DataSource)
                    envCtx.lookup("jdbc/EmployeeDB");

            Connection conn = ds.getConnection();
            System.out.println(conn);

        } 

Apache的DBCP是什么?

如果用DataSource来获取连接的话,通常获取连接的代码和驱动特定的DataSource是紧耦合的。另外,除了选择DataSource的实现类,剩下的代码基本都是一样的。

Apache的DBCP就是用来解决这些问题的,它提供的DataSource实现成为了应用程序和不同JDBC驱动间的一个抽象层。Apache的DBCP库依赖commons-pool库,所以要确保它们都在部署路径下。

使用DBCP数据源的步骤:

  1. 导入两个jar包【Commons-dbcp.jar和Commons-pool.jar】

  2. 读取配置文件

  3. 获取BasicDataSourceFactory对象

  4. 创建DataSource对象

JDBC中存在哪些不同类型的锁?

JDBC中存在哪些不同类型的锁?

从广义上讲,有两种锁机制来防止多个用户同时操作引起的数据损坏。

  • 乐观锁——只有当更新数据的时候才会锁定记录

  • 悲观锁——从查询到更新和提交整个过程都会对数据记录进行加锁。

java.util.Date和java.sql.Date有什么区别?

java.util.Date和java.sql.Date有什么区别?

java.util.Date包含日期和时间,而java.sql.Date只包含日期信息,而没有具体的时间信息。如果你想把时间信息存储在数据库里,可以考虑使用Timestamp或者DateTime字段

处理大文本和二进制数据

clob和blob

  • clob用于存储大文本

  • blob用于存储二进制数据


MYSQL

MySQL存储大文本是用Test【代替clob】,Test又分为4类

  • TINYTEXT

  • TEXT

  • MEDIUMTEXT

  • LONGTEXT

同理blob也有这4类

 

以上是关于JDBC简介的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )(代码片段

面试常用的代码片段

mysql jdbc源码分析片段 和 Tomcat's JDBC Pool

JDBC简介

Mybatis -- Mybatis简介(原始JDBC的操作和问题分析ORM)

Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段