注册数据库驱动。java
创建数据库链接。mysql
建立一个Statement。sql
执行SQL语句。数据库
处理结果集。缓存
关闭数据库链接tomcat
代码以下安全
区别:服务器
PreparedStatement是预编译的SQL语句,效率高于Statement。oracle
PreparedStatement支持?操做符,相对于Statement更加灵活。大数据
PreparedStatement能够防止SQL注入,安全性高于Statement。
CallableStatement适用于执行存储过程。
最好的办法是利用sql语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容。
工做原理:
JAVA EE服务器启动时会创建必定数量的池链接,并一直维持很多于此数目的池链接。客户端程序须要链接时,池驱动程序会返回一个未使用的池链接并将其表记为忙。若是当前没有空闲链接,池驱动程序就新建必定数量的链接,新建链接的数量有配置参数决定。当使用的池链接调用完成后,池驱动程序将此链接表记为空闲,其余调用就可使用这个链接。
实现方案:链接池使用集合来进行装载,返回的Connection是原始Connection的代理,代理Connection的close方法,当调用close方法时,不是真正关链接,而是把它代理的Connection对象放回到链接池中,等待下一次重复利用。
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);
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的Driver类被加载进来时,它会本身注册到DriverManager类里面
而后咱们会把数据库配置信息传成DriverManager.getConnection()方法,DriverManager会使用注册到它里面的驱动来获取数据库链接,并返回给调用的程序。
在查询数据库后会返回一个ResultSet,它就像是查询结果集的一张数据表。
ResultSet对象维护了一个游标,指向当前的数据行。开始的时候这个游标指向的是第一行。若是调用了ResultSet的next()方法游标会下移一行,若是没有更多的数据了,next()方法会返回false。能够在for循环中用它来遍历数据集。
默认的ResultSet是不能更新的,游标也只能往下移。也就是说你只能从第一行到最后一行遍历一遍。不过也能够建立能够回滚或者可更新的ResultSet
当生成ResultSet的Statement对象要关闭或者从新执行或是获取下一个ResultSet的时候,ResultSet对象也会自动关闭。
能够经过ResultSet的getter方法,传入列名或者从1开始的序号来获取列数据。
DataSource即数据源,它是定义在javax.sql中的一个接口,跟DriverManager相比,它的功能要更强大。咱们能够用它来建立数据库链接,固然驱动的实现类会实际去完成这个工做。除了能建立链接外,它还提供了以下的特性:
缓存PreparedStatement以便更快的执行
能够设置链接超时时间
提供日志记录的功能
ResultSet大小的最大阈值设置
经过JNDI的支持,能够为servlet容器提供链接池的功能
Tomcat服务器也给咱们提供了链接池,内部其实就是DBCP
步骤:
在META-INF目录下配置context.xml文件【文件内容能够在tomcat默认页面的 JNDI Resources下Configure Tomcat's Resource Factory找到】
导入Mysql或oracle开发包到tomcat的lib目录下
初始化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); }
若是用DataSource来获取链接的话,一般获取链接的代码和驱动特定的DataSource是紧耦合的。另外,除了选择DataSource的实现类,剩下的代码基本都是同样的。
Apache的DBCP就是用来解决这些问题的,它提供的DataSource实现成为了应用程序和不一样JDBC驱动间的一个抽象层。Apache的DBCP库依赖commons-pool库,因此要确保它们都在部署路径下。
使用DBCP数据源的步骤:
导入两个jar包【Commons-dbcp.jar和Commons-pool.jar】
读取配置文件
获取BasicDataSourceFactory对象
建立DataSource对象
JDBC中存在哪些不一样类型的锁?
从广义上讲,有两种锁机制来防止多个用户同时操做引发的数据损坏。
乐观锁——只有当更新数据的时候才会锁定记录。
悲观锁——从查询到更新和提交整个过程都会对数据记录进行加锁。
java.util.Date和java.sql.Date有什么区别?
java.util.Date包含日期和时间,而java.sql.Date只包含日期信息,而没有具体的时间信息。若是你想把时间信息存储在数据库里,能够考虑使用Timestamp或者DateTime字段
clob和blob
clob用于存储大文本
blob用于存储二进制数据
MySQL存储大文本是用Test【代替clob】,Test又分为4类
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
同理blob也有这4类