JDBC(一)
JDBC(Java DataBase Conectivity)Java数据库连接,是J2SE的一部分,由java.sql和javax.sql组成。
package dbTest; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; public class JDBCTest {
public static void main(String[] args) {
String driver = "com.mysql.jdbc.Driver";
String dbName = "nnm5";
String passwrod = "OSSDB123";
String userName = "root";
String url = "jdbc:mysql://localhost:13306/" + dbName;
String sql = "select ircnetnodeid, purpose_id,ircnetypeid from rcnetnode limit 1";
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null; try {
//注册驱动,只需要一次,可以注册多个driver
Class.forName(driver); //把类装载到虚拟机中,会去执行com.myql.jdbc.Driver中静态代码块进行注册
//DriverManager.register(new com.mysql.jdbc.Driver());
//System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver:com.oracle.jdbc.Driver"); //JDBC获取连接
Connection conn = DriverManager.getConnection(url, userName,passwrod); ps = conn.prepareStatement(sql); rs = ps.executeQuery();
while (rs.next()) {
System.out.println("ircnetnodeid : " + rs.getObject("ircnetnodeid") + " purpose_id : "
+ rs.getObject("purpose_id") + " ircnetypeid : " + rs.getObject("ircnetypeid"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//需要注意关闭的顺序,链接资源一定要释放
// 关闭记录集
if (rs != null) {
try {
rs.close();
} finally{
if(ps != null){
try{
ps.close();
}finally{
if(conn != null){
conn.close();
}
}
}
}
}
}
}
上面使用的是PreparedStatement而不是Statement,可以防止数据注入,在预编译时就报错,有参数时不应直接拼接字符串,而应该使用占位符(?)的形式。
如果存在很多的查询,则像上面这样获取链接,释放链接会出现很多的重复代码,应该是做一个工具类,提供CRUD方法,只需要传递SQL语句和参数即可。利用Spring的JDBCTemplate可以很大程度上减少重复代码。
public class DBConnectionManager{
static{
Class.forName("com.mysql.jdbc.Driver");
}
//读操作
public static List<Map<String,Object>> selectObject(String sql, String[] params) throws Exception {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
List<Map<String,Object>>> result = new ArrayList<Map<String,Object>>>();
try {
conn = DBConnectionManager.getConnection();
pstmt = conn.prepareStatement(sql);
for (int i = 0; params != null && i < params.length; i++) {
pstmt.setString(i + 1, params[i]);
}
rs = pstmt.executeQuery();
ResultSetMetaData meta = rs.getMetaData();
while (rs.next()) {
Map<String,Object> columnValue = new HashMap<String,Object>
int size = meta.getColumnCount();
for (int i = 1; i <= size; i++) {
String columnName = meta.getColumnLabel(i); //getColumnName返回的是数据库列名,getColumnLabel如有别名将返回列的别名,否则和getColumnName相同
columnValue.add(columnName,rs.getObject(columnName));
}
result.add(columnValue);
}
return result;
} catch (Exception e) {
//logger.info("Execute sql : " + sql + " fail!!!");
throw e;
} finally {
DBConnectionManager.free(conn, pstmt, rs);
}
}
//增删改操作
public static void updateObject(String sql, String[] params) throws Exception {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = DBConnectionManager.getConnection();
pstmt = conn.prepareStatement(sql);
for (int i = 0; params != null && i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
rs = pstmt.executeUpdate();
} catch (Exception e) {
//logger.info("Execute sql : " + sql + " fail!!!");
throw e;
} finally {
DBConnectionManager.free(conn, pstmt, rs);
}
}
//更好的做法是从数据库连接池中取链接
public static Connection getConnection(){
String dbName = "nnm5";
String passwrod = "OSSDB123";
String userName = "root";
String url = "jdbc:mysql://localhost:13306/" + dbName;
Connection conn = DriverManager.getConnection(url, userName,passwrod);
return conn;
}
public static void free(Connection conn,PreparedStatement pstmt,ResultSet rs){
if (rs != null) {
try {
rs.close();
} finally{
if(ps != null){
try{
ps.close();
}finally{
if(conn != null){
conn.close();
}
}
}
}
}
}
Statement的方法是executeQuery(String sql),如果要使用PreparedStatement需要调用的方法是executeQuery(),这点是需要注意的。
JDBCUtil中查询操作可以用executeQuery(),增加,删除,更新操作都可以用executeUpdate()。
java.util.Date和java.sql.Date的关系是sql中的Date继承自util中的Date。ResultSet的getDate方法返回的是sql中的Date,做增加操作时需要传递的是sql包中的Date,不能是util中的Date,如果是就需要转换,这点是需要注意的。
将util中的Date类型date转换为sql中的Date:new java.sql.Date(date.getTime());
util中的Date既有日期又有时间,sql中的Date只有日期。
varchar最多存储255个字符,数量再大时就需要clob类型。二进制对应的是blob类型。
MySQL中的clob类型是text,blob类型就是blob(64个字节)或者mediumblob,longblob,使用时要注意最大的长度。
public void setBlob(){
try{
conn = DriverManager.getConnection(url, userName,passwrod);
String sql = "insert into blob_test(big_blob) values(?)";
ps = conn.prepareStatement(sql);
File f = new File("src/pattern/decorator/a.jpeg")
InputStream is = new BufferedInputStram(new FileInputStram(f));
ps.setBinaryStream(1, is, (int)f.length);
rs = ps.executeUpdate();
is.close();
}finally{
JDBCUtil.free(rs, ps, conn);
}
}
public void getBlob(){
conn = DriverManager.getConnection(url, userName,passwrod);
String sql = "select big_blob from blob_test where id = ?";
ps = conn.prepareStatement(sql);
ps.setInteger(1,new Integer(1));
rs = ps.executeQuery();
while(rs.next()){
int BYTE_SIZE = 1;
int SAVE_SIZE = 1024;
int i = 0;
byte[] buff = new byte[BYTE_SIZE]; // 每次读的缓存
byte[] save = new byte[SAVE_SIZE]; // 保存前缓存
InputStream in = rs.getBinaryStream(1);
FileOutputStream fs = new FileOutputStream(new File("src/pattern/decorator/b.jpeg"));
while (in.read(buff) != -1) { // 一个字节一个字节读
save[i] = buff[0];
if (i == SAVE_SIZE - 1) { // 达到保存长度时开始保存
fs.write(save, 0, SAVE_SIZE);
save = new byte[SAVE_SIZE];
i = 0;
} else {
i++;
}
}
// 最后这段如果没达到保存长度,需要把前面的保存下来
if (i > 0) {
fs.write(save, 0, i);
}
fs.close();
bf.close();
}
JDBCUtil.free(rs, ps, conn);
}
JDBC(一)的更多相关文章
- Java数据库连接技术——JDBC
大家好,今天我们学习了Java如何连接数据库.之前学过.net语言的数据库操作,感觉就是一通百通,大同小异. JDBC是Java数据库连接技术的简称,提供连接各种常用数据库的能力. JDBC API ...
- 玩转spring boot——结合AngularJs和JDBC
参考官方例子:http://spring.io/guides/gs/relational-data-access/ 一.项目准备 在建立mysql数据库后新建表“t_order” ; -- ----- ...
- [原创]java使用JDBC向MySQL数据库批次插入10W条数据测试效率
使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(100000),如何提高效率呢?在JDBC编程接口中Statement 有两个方法特别值得注意:通过使用addBatch( ...
- JDBC MySQL 多表关联查询查询
public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver&q ...
- JDBC增加删除修改
一.配置程序--让我们程序能找到数据库的驱动jar包 1.把.jar文件复制到项目中去,整合的时候方便. 2.在eclipse项目右击"构建路径"--"配置构建路径&qu ...
- JDBC简介
jdbc连接数据库的四个对象 DriverManager 驱动类 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 ...
- JDBC Tutorials: Commit or Rollback transaction in finally block
http://skeletoncoder.blogspot.com/2006/10/jdbc-tutorials-commit-or-rollback.html JDBC Tutorials: Com ...
- FineReport如何用JDBC连接阿里云ADS数据库
在使用FineReport连接阿里云的ADS(AnalyticDB)数据库,很多时候在测试连接时就失败了.此时,该如何连接ADS数据库呢? 我们只需要手动将连接ads数据库需要使用到的jar放置到%F ...
- JDBC基础
今天看了看JDBC(Java DataBase Connectivity)总结一下 关于JDBC 加载JDBC驱动 建立数据库连接 创建一个Statement或者PreparedStatement 获 ...
- Spring学习记录(十四)---JDBC基本操作
先看一些定义: 在Spring JDBC模块中,所有的类可以被分到四个单独的包:1.core即核心包,它包含了JDBC的核心功能.此包内有很多重要的类,包括:JdbcTemplate类.SimpleJ ...
随机推荐
- NYoj_171聪明的kk
聪明的kk 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 聪明的"KK" 非洲某国展馆的设计灵感源于富有传奇色彩的沙漠中陡然起伏的沙丘,体现出本国不 ...
- MySQL的ibdata1文件占用过大
处理MySQL的ibdata1文件过大问题 本人遇到一次在安装zabbix监控的时候,yum安装的MySQL数据库,后面用了一段时间发现data目录下的ibdata1的空间特别大,反而我的zabbix ...
- class 文件反编译器的 java 实现
最近由于公司项目需要,了解了很多关于类加载方面的知识,给项目带来了一些热部署方面的突破. 由于最近手头工作不太忙,同时驱于对更底层知识的好奇与渴求,因此决定学习了一下 class 文件结构,并通过一周 ...
- [学习OpenCV攻略][004][播放AVI视频]
cvCreateFileCapture(文件路径) 创建一个影音文件录像机,返回值为CvCapture类型,用于读取视频文件 cvQuerFrame(视频) 将下一帧视频文件载入内存,当CvCaptu ...
- in运算符(javascript)
in的用法,如x in y: 1.如果第二个运算数为对象,则in运算符用来检测第一个运算数是否是第二个运算数的属性名.是,返回true,否则返回false. 例: var obj = {x:1,y:2 ...
- 启动tomcat时,一直卡在Deploying web application directory这块的解决方案
本来今天正常往服务器上扔一个tomcat 部署一个项目的, 最后再启动tomcat 的时候 发现项目一直都访问不了,看了一下日志: [root@iz8vbdzx7y7owm488t4d89z bin] ...
- Guake!
快捷键及其定制: [全局快捷键] F12:显示/隐藏Guake的程序界面. [局部快捷键] Ctrl+Shift+T:新建标签页: Ctrl+Shift+W:关闭标签页: Ctrl+Shift+C:复 ...
- Schema与数据类型优化
良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询数据来设计schema,这往往需要权衡各种因素. MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要. 更小的通 ...
- JS-输入金额校验
function clearNoNum(obj){ obj.value = obj.value.replace(/[^\d.]/g,""); //清除"数字&qu ...
- vm虚拟机中linux无法连接外网?
问题出现的环境? vm虚拟机中安装了linux系统,vm设置了NAT方式共享主机ip,但还是没法访问外网?在linux系统中查询ip地址,没有ipv4地址,就是配置了自动获取,但是还是没有获取? 问题 ...