黑马训练营学习笔记(二)

来源:互联网 发布:sentinel 1 数据下载 编辑:程序博客网 时间:2024/05/22 13:51

day13

1、加载数据库驱动,使用 Class.forName(com.mysql.jdbc.Driver) 而不使用DriverManager.registerDriver(new Driver()) 的原因

1) Mysql的Driver.java源码中,有一个静态代码块,已经包含了DriverManager.registerDriver(new Driver())这句代码,所以,如果使用后者的话,会导致加载两次驱动。所以,使用Class.forName()加载的时候,就执行了里面的静态代码块中的加载程序了。

2) 使用后者,new Driver()需要导入具体的数据库包。而使用前者则不需要。


2、mysql的url如果是 jdbc:mysql://localhost:3306/day13 则可以简写成 jdbc:mysql:///day13

连接参数问题 jdbc:mysql:///day13?useUnicode=true&characterEncoding=UTF-8 这个拼接在URL后面的参数,指的是指定客户端与服务器连接使用的字符集,是偏客户端的。在客户端与服务器端编码不一致的时候使用。如果一致,则没有必要使用。例如,客户端使用gbk编码,则useUnicode=true&characterEncoding=gbk 即告诉服务器,客户端使用的是gbk编码,收到后要将该gbk转码。

有一种情况是,服务器默认情况使用的ISO编码,而客户端使用别的编码,假设GBK,那么这个时候,存进数据库是乱码,数据库读出的也是乱码,但是到浏览器上可以正常。


3、Connection接口 ---- JDBC连接表示接口

Connection接口一个对象代表 一个数据库连接,作用有两点:

1)获得操作数据库的Statement对象

createStatement()  --- Statement 获得普通操作状态对象

prepareStatement(sql) --- PreparedStatement 获得预编译状态对象,是Statement子接口

prepareCall(sql) ---  CallableStatement ( PreparedStatement子接口) 操作数据库内部存储过程的

* statement对象可以向数据库发送sql语句,获得ResultSet结果集。

2)进行事务控制

setAutoCommit(boolean)开启一个事务

commit(); 提交一个事务 rollback() 回滚一个事务


4、Statement接口 --- 代表一个操作状态

作用:操作数据库sql语句、调用存储过程

executeQuery(sql) 发送 select 查询语句,返回ResultSet

executeUpdate(sql) 发送 增删改 语句 ,返回int 为操作的行数

execute(sql) 发送任何sql语句,返回boolean,注意 true表示返回ResultSet ,否则为false.


5、ResultSet 结果集初始时候,游标是在第一行之上的。至于getXXX与具体数据类型,是有对应的。

resultSetType --- 结果集类型 :ResultSet.TYPE_FORWARD_ONLY     ResultSet.TYPE_SCROLL_INSENSITIVE     ResultSet.TYPE_SCROLL_SENSITIVE(可滚动)

resultSetConcurrency --- 并发类型 :ResultSet.CONCUR_READ_ONLY   ResultSet.CONCUR_UPDATABLE(可修改)


设置ResultSet可滚动可修改

Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,  ResultSet.CONCUR_UPDATABLE);

rs.absolute( n ) 直接跳到某一个行

rs.updateString(4,"abc@email.com") 更新第四列内容

rs.updateRow()确认修改 更新行数据

直接conn.createStatement()是无法完成上面操作的。


另外,常用的操作

previous() 跳到前一行

beforeFirst() 跳到resultSet最前面

afterLast() 跳到resultSet最后面


若知道ResultSet只有一条数据,取出的时候可以不用while循环,用 if(rs.next()){     // do something  } 即可。


6、资源释放及工具类提取

关闭 conn stmt 等资源的时候,放到finally里面关闭。

一个数据库配置文件的处理方法:

建立文件 dbconfig.properties

DRIVERCLASS = "com.mysql.jdbc.Driver"

URL = "jdbc:mysql:///day13"

USER = "root"

PWD = “123”

然后,在java文件中这样处理:

private static final String DRIVERCLASS;

private static final String URL;

private static final String USER;

private static final String PWD;


// 读取资源文件的方法

static {

ResourceBundle bundle = ResourceBundle.getBundle("dbconfig");

DRIVERCLASS = bundle.getString("DRIVERCLASS");

URL = bundle.getString("URL"); 

USER = bundle.getString("USER"); 

PWD = bundle.getString("PWD"); 

}


7、大数据Text 和 blob 的处理

基本概念,大数据成为LOB(Large Objects), LOB又分为 :clob (存储大文本 )和 blob (存储二进制文件)

对mysql而言,只有blob ,大文本是采用Text,Text和Blob又分为:

TINYTEXT(255)    TEXT(64k)   MEDIUMTEXT(16M)      LONGTEXT(4G)

TINYBLOG   BLOG   MEDIUMBLOB    LONGBLOB


对于mysql 的text类型,设置方法如下:

PreparedStatement.setCharacterStream(index,reader,length);

注意,这个length必须设置为int类型,如果不设置,则是long 类型,只适用于java 1.6以上的版本。

当传输的文件过大时,还需修改mysql的配置文件  【mysqld】下面加一行 max_allowed_packet=64M (也可以设置的更大)


对于mysql 的text类型,读取方法如下:

reader = resultSet.getCharacterStream(i);

等效于 reader = resultSet.getClob(i).getCharacterStream();


0 0