一、JDBC简介
1.1 数据库驱动
数据库厂商为了方便开发人员从程序中操作数据库而提供的一套jar包,通过导入这个jar包就可以调用其中的方法操作数据库,这样的jar包就叫做数据库驱动。由SUN提供一套访问数据库的规范(就是一组接口,JDBC),并提供连接数据库的协议标准,然后各个数据库厂商会遵循SUN的规范提供一套访问自己公司的数据库服务器的API出现。SUN提供的规范命名为JDBC,而各个厂商提供的,遵循了JDBC规范的,可以访问自己数据库的API被称之为驱动!
1.2 JDBC
(Java DataBase Connectivity)sun定义的一套标准,本质上是一大堆的操作数据库的接口,所有数据库厂商为java设计的数据库驱动都实现过这套接口。Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。
JDBC是接口,而JDBC驱动才是接口的实现,没有驱动无法完成数据库连接!每个数据库厂商都有自己的驱动,用来连接自己公司的数据库。
1.3 六个步骤实现JDBC
*在数据库中建立好表
*在程序中导入数据库驱动包(新建一个lib文件夹,把jar包导进去)
(1)注册数据库驱动
DriverManager.registerDriver(new Driver());
上面这个方法有两个缺点:
a.导致了数据库驱动被注册了两次。
b.整个程序域mysql数据库驱动绑定增加了耦合性
推荐使用:
Class.forName(“com.mysql.jdbc.Driver”);
(2)获取数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day10", "root", "root");
url的写法:
Oracle写法:jdbc:oracle:thin:@localhost:1521:sid
SqlServer写法:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
MySql写法:jdbc:mysql://localhost:3306/sid 可以简写为jdbc:mysql:///sid
(3)获取传输器对象
Statement stat = conn.createStatement();
推荐使用:
PrepareStatement ps= conn.prepareStatement(sql语句);
创建向数据库发送预编译sql的PrepareSatement对象。
(4)获取结果集对象
ResultSet rs = stat.executeQuery("select * from user");
注意:
executeQuery(String sql) :用于向数据发送查询语句。
executeUpdate(String sql):用于向数据库发送insert、update或delete语句
execute(String sql):用于向数据库发送任意sql语句
(5)遍历结果集获取查询结果
while(rs.next()){
String name = rs.getString("name");
System.out.println(name);
}
其他方法:
next():移动到下一行
Previous():移动到前一行
absolute(int row):移动到指定行
beforeFirst():移动resultSet的最前面。
afterLast() :移动到resultSet的最后面。
(6)关闭资源
conn是一个有限的资源,用完立即要释放表
stat占用内存,所以使用完后也要释放
rs占用内存,所以使用完后也要释放
释放时后创建的先释放
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
} finally{
rs = null;
}
}
if(stat != null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
} finally{
stat = null;
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} finally{
conn = null;
}
}
1.4 PreparedStatement
sql注入:由于jdbc程序在执行的过程中sql语句在拼装时使用了由页面传入参数,如果用户恶意传入一些sql中的特殊关键字,会导致sql语句意义发生变化,这种攻击方式就叫做sql注入
PreparedStatement是Statement的孩子,不同的是,PreparedStatement使用预编译机制,在创建PreparedStatement对象时就需要将sql语句传入,传入的过程中参数要用?替代,这个过程回导致传入的sql被进行预编译,然后再调用PreparedStatement的setXXX将参数设置上去,由于sql语句已经经过了预编译,再传入特殊值也不会起作用了。
优点:
a.PreparedStatement使用了预编译机制,sql语句在执行的过程中效率比Statement要高。
b. 防止了sql注入
c.Sql语句使用?代替参数然后再用set方法设置,比起拼接字符串,代码更优雅
二、大数据(LOB:large object)
1.mysql数据库也可以直至在数据库中保存大文本和大二进制数据
Text(oracle中叫Clob)
TINYTEXT(255)、TEXT(64k)、MEDIUMTEXT(16M)和LONGTEXT(4G)
Blob
TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB
2.JDBC去操作大文本
ps = conn.prepareStatement("insert into Demo2Text values(null,?,?)");
ps.setString(1, "钢铁是怎样练成");
File file = new File("1.txt");
ps.setCharacterStream(2, new FileReader(file), (int) file.length());
<font size=2><b>3.JDBC操作大二进制</b>
插入:
ps = conn.prepareStatement("insert into Demo3Blob values(null,?,?)");
ps.setString(1, "梦想的力量");
File file = new File("1.mp3");
ps.setBinaryStream(2, new FileInputStream(file), (int) file.length());
查询
InputStream in = rs.getBinaryStream("content");
三、批处理
业务场景:当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率。
实现批处理有两种方式
第一种方式:
Statement.addBatch(sql)
执行批处理SQL语句
executeBatch()方法:执行批处理命令
clearBatch()方法:清除批处理命令
Statement 批量处理:
优点:可以执行多条结构不同的语句
缺点:没有使用预编译机制,效率低下,如果执行多条结构相同仅仅参数不同的语句,仍然需要写多次sql主干语句
PrepareStatement 批量处理:
优点:有预编译机制,效率高;执行多条结构相同参数不同的语句,不需要写多次sql主干语句
缺点:只能执行主干相同参数不同的sql语句,没办法在一个批中加入结构不同的sql语句