注意:还是和sql基础一样是我以前的笔记。
JDBC基础
JDBC API是java访问数据库的接口规范,各家厂商根据接口规范,提供具体的实现类。这些实现类被封装为jar包,以jdbc驱动程序供开发者使用。
Jdbc可以完成3个基本工作:(1)建立与数据库的连接。(2)执行sql语句。(3)获得sql语句的执行结果。
应用JDBC
jdbc编程步骤
加载驱动
Class.forName(“com.mysql.jdbc.Driver”); Class.forName(“oracle.jdbc.driver.OracleDriver”);
通过DriverManager获得数据库连接。
DriverManager.getConnection(String URL,String user,String pass)
Mysql数据库的URL写法:
jdbc:mysql://hostname:port/databasename;
Oracle的URL写法:
jdbc:oracle:thin:@hostname:port:databasename
通过数据库连接创建statement对象。Connection创建Statement的方法有如下三种:
createStatement():创建基本的statement对象。
prepareStatement(String sql):根据传入的sql语句创建预编译的Statement对象。
prepareCall(String sql):根据传入的sql语句创建CallableStatement对象。
使用Statement执行sql语句,有三种方法执行sql语句:
execute()可以执行热播和类型的sql,结果处理麻烦
executeUpdate()主要用来执行,dml和ddl语句,返回受sql语句影响的条数
executeQuery()只能执行查询语句,返回结果集resultset对象
操作结果集。操作resultset对象
两类方法
A、移动resultset的记录指针:next()previous()first()last(),beforefirst()afterlast()等
B、getxxx()
执行sql语句方式
(1)执行ddl和dml语句
(2)使用execute执行任何sql语句
使用PreparedStaatement执行sql查询语句
在插入数据时可以使用?占位符代替sql中的值
jdbc提供了PreparedStaatement执行预编译的sql语句。PreparedStaatement是statement接口的子接口然后使用该对象多次高效执行该语句
在sql前,使用setxxx(int index,xxx value)方法设置参数值
PreparedStaatement对象的execute()executeUpdate()executeQuery()
优势:
(1)、使用预编译方式,不用拼接sql。降低了编写sql的复杂性。
(2)、预防sql注入。
SELECT * from student_table WHERE student_id = 20 and student_password='' or TRUE or '';
处理Blob类型的数据
Blob(Binary Long Object)是二进制长对象的意思,Blob可以存储大文件,可以存储图片、声音、视频文件。将Blob数据插入数据库需要使用PreparedStatement,调用setBinaryStream(int index,InputStream x),该方法可以为执行参数传入二进制输入流。
取出时从ResultSet中取出Blob数据,调用getBlob(int index),返回Blob对象,调用该对象的getBinaryStream()方法获取该Blob数据的输入流。
事物处理
事物有4个特征:原子性:事物是应用中执行的最小单位,事物中的任务要么都执行成功,否则都不执行;一致性:事务的执行结果,必须使数据库从一个一致性状态变为另外一个一致性状态;隔离性:各个事务的执行互不干扰;持续性:持久性,指事务一旦提交,对数据所做的任何改变都记录到永久存储中。
这4个特性简称ACID性。
数据库的事物由以下语句组成:
(1)一组dml语句(2)一条ddl语句(3)一条dcl语句
当事务所包含的全部数据库操作执行成功后,应该提交事务。使这些修改永久的生效。提交事物2种方式:显示提交:commit;自动提交:当执行一条ddl或dcl自动提交
当事务中所包含的任意一个数据库操作执行失败后,应该回滚事务。使该事务中所做的修改全部失效。回滚方式:显示回滚rollback;自动回滚:系统错误和强制退出。mysql默认是关闭事务的。set autocommit=0|1设置事务是否打开。0关自动提交,开启事务
jdbc提供了事务支持JDBC连接的事务支持是Connection提供。默认打开自动提交,即关闭事务。
Con.setAutoCommit(false);
Con.commit();
Com.rollback();
6、使用连接池管理连接
数据库连接的建立及关闭是很耗费系统资源的操作。
数据库连接池的解决方案是:当应用程序启动时,系统主动建立足够的数据库连接,并将这些连接组成一个连接池。每次应用程序请求数据库时,不需要重新打开连接,从连接池中取已经存在的连接。使用完毕后,不关闭连接,而是将连接归还给连接池。
数据库连接池是Connection对象的工厂。数据库连接池的常用参数如下:
(1)、连接池的初试连接。
(2)、连接池的最大连接。
(3)、连接池的最小连接。
(4)、连接池每次增加的容量。
JDBC的数据库连接池使用javax.sql.DataSource。DataSource是一个接口,该接口通常由厂商提供具体实现。
6、DBCP数据源
DBCP是Apache软件下的开源连接池实现。如果需要使用该连接池,需要使用两个jar包:
commons-pool.jar:连接池实现的依赖库。
commons-dbcp.jar:连接池的实现。
Tomcat的连接池是采用该连接池实现的。
使用DBCP获得数据库连接的方式:
//创建数据源对象
BasicDataSource ds = new BasicDataSource();
//设置连接池所需要的驱动
ds.setDriverClassName(“com.mysql.jdbc.Driver”);
//设置连接数据库的URL
ds.setUrl(“jdbc:mysql://IP:port/数据库名”);
//设置用户名
ds.setUsername(“root”);
//设置密码
ds.setPassword(“root”);
//设置初试连接数
ds.setInitialSize(5);
//设置最大连接数
ds.setMaxActive(20);
//设置最小连接数
ds.setMinIdle(2);
//获得数据库连接
Connection con = ds.getConnection();
//释放数据库连接
con.close();
6.2C3P0数据源
C3P0性能更好一些,Hibernate就推荐使用该连接池。可以自动清理不再使用的Connection,Statement,ResultSet。C3p0.jar