Java JDBC基础知识

来源:互联网 发布:数龙网络 编辑:程序博客网 时间:2024/05/21 12:47

JDBC学习笔记

01 开发JDBC的一般步骤:

    导入厂商提供的数据库驱动

    注册驱动

连接数据库

操作数据库

关闭资源

 

02MyEclipse导入JDBC jar

访问相关网站下载MySqljar

 

 

03注册驱动

DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 注册方式一

Class.forName("com.mysql.jdbc.Driver"); 注册方式二

注意:两种均可,选一种即可,但推荐使用方式二进行注册,因为驱动实现类中的静态代码已经调用过

 

04连接数据库

Connection conn =  DriverManager.getConnection("jdbc:mysql://localhost:3306/day05","root","123");

day05t :数据库名称,这里根据实际情况而定

root   :数据库账户名,这里根据实际情况而定

123   :数据库密码,这里根据实际情况而定

URL写法格式:大协议:子协议://IP地址:端口号/库名?参数键=参数值

 

05操作数据库

Statement st = conn.createStatement();

String sql = "insert into t_user values (NULL,'tom','18')";

st.executeUpdate(sql);

 

06关闭资源

st.close();

conn.close();

 

07 注意事项

        7.1、在写入相关语句的时候相应的要引入一些包类

7.2、Statement 是 Java 执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据

    库发送要执行的SQL语句。Statement对象,用于执行不带参数的简单SQL语句。

 

08  JDBC中的对象

DriverManager:注册驱动,获得连接

Connection:代表访问数据库的连接,可以根据该对象创建运送sql语句的Statement对象

Statement:用于装载要执行的sql语句

createStatement():创建Statement对象

prepareStatement():创建preparedStatement对象

execute:原始,增删改查均可,返回值:true|有结果集,false|无结果集

executeBatch:批量执行sql

executeUpdate:执行增删改操作,返回结果是受影响的行数

executeQuery:执行查询,返回一个结果集ResultSet

ResultSet:用于装载返回数据库查询的结果

如何遍历结果:

while(rs.next())

{

rs.getInt(查询表中对应的字段名);

rs.getString(查询表中对应的字段序列); 

}

next():用于将指针向下移动一行,并判断是否有数据

rs.getXXX:XXX为数据库中的数据类型对应的java中的数据类型

查询表中的对应的数据库表中字段的序列从1开始而非从0开始

数据库中的类型对应的Java当中的数据类型:

int int

double double

decimal double

char String

varchar String

datetime Date

timestamp Timestamp/Date

ResultSet结果集的滚动:

移动指针就是结果集的滚动,主要有以下几种滚动方法:

next():将光标从当前位置向前移动一行

previous:将光标移动到此ResultSet对象的上一行

absolute():将光标移动到ResultSet指定的行号

frist:将光标移动到ResultSet对象的第一行

last:将光标移动到ResultSet对象的最后一行

结果集反向修改数据库:

默认情况下ResultSet是不能反向修改数据库中的记录的,需要在创建Statement对象时,

通过Statement createStatement(参数一,参数二);

参数一:结果集类型

参数二:结果集是否支持修改类型

[具体请参见网络资源]

 

09 SQL中的注入问题

注入方法:OR 1=1 -- 

注入原理:将与条件变成or条件并屏蔽后边的验证或者继续使用or关键字构造特殊sql语句

解决方法:可以借助java中的prepareStatement不让用户参与sql语句的构造拼装

      prepareStatement语句在执行的时候先编译sql语句再往里传参,这样就避免了让参

 数直接参与sql语句的构造

 但顺序需要改变:

 之前的顺序:1、创建Statement对象 2、书写sql语句 3、对象.执行方式(sql);

 使用prepareStatement的顺序:

  书写Sql语句

创建prepareStatement对象:conn.prepareStatement(sql);

注意:这里的sql语句中的参数全用?填充代替

prepareStatement.setXXX(参数1,参数2);

参数1、?对应的序列

参数2、?对应的值

prepareStatement对象.执行方式();

 

10  MySql存取大文本

存取大文本必须使用prepareStatement对象

insert into 表名 values (null,?);

ps.setCharacterStream(参数1,参数2,参数3);

参数1:参数对应的?的索引,从1开始

参数2:需要保存的文本的流

             File f = new File(src/text.txt);

FileReader reader = new FileReader(f);

ps.setCharacterStream(1,reader,(int)f.length());

参数3:文件长度

 

11  MySql如何存取二进制文本

基本内容要求同上

File f = new File(scr/tp.PNG);

InputStream is = new FileInputStream(f);

ps.setBinaryStream(参数1,参数2,参数3);

参数1:?对应的索引序列

参数2:二进制流

参数3:文件的长度,注意这里要强制转换成int

 

12批量执行

Statement st = conn.createStatement();

st.addBatch(create table...);

st.addBatch(...);

...

st.addBatch(...);

int [] results = st.executeBatch();

批量执行一般不执行查询操作

批量执行中prepareStatement的效率要高一些:因为prepareStatement只编译一次执行运送参数多次

 

0 0