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();