⑫jdbc

一、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):用于向数据库发送insertupdatedelete语句
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语句

发布了16 篇原创文章 · 获赞 1 · 访问量 946

猜你喜欢

转载自blog.csdn.net/jh_5935/article/details/80733143