JDBC技术
JDBC是java程序操作数据库的API
一 JDBC连接数据库的过程
(1) 注册数据库驱动
Class.forName("com.mysal.jdbc.Dirver") //加载数据库驱动,注册数据库驱动管理器
(2)构建数据库连接URL
String url="jdbc:mysql://localhost:3306/test"
url都符合一个基本的格式,即“JDBC 协议+IP地址或域名+端口+数据库名称"
(3) 获取Connection对象
Connection con=DriverMannager.getConnection(url,username,password); //闯将Connection连接
二 JDBC API
(1) Connection接口
获得数据库的连接对象
(2)DriverManager类
主要作用于用户及驱动程序之间,它是JDBC中的管理层
(3) Statement接口
这个是实现对sql语句的管理
(4)PreparedStatement接口
这个接口是对Statement的扩充,应为对于sql语句中的有些操作是要传参数的,这能用PrePareStatement
有一点个值得注意的是:使用PreparedStatement对象对sql语句的占位符参数赋值,其参数的下标值不是0,而是1
使用这个还可以防止注入攻击
(5) ResultSet接口
执行sql语句的查询语句返回的结果集;
这里也有要强调的是:ResultSet集合中第一行数据之前与最后一行数据之后都存在一个位置,而默认情况下光标位于第一行数据之前
所以在执行循环判断语句就会出项这样一种情况:while( rs,next()) 等于是将光标移到了第一条数据的位置
三 JDBC操作数据库
(1) 实现批处理
我觉得主要是讲sql语句以及它们的参数分别以对象的形式进行处理
当然在调用PreparedStatement的executebatch() 而不是调用execute()方法或executeUpdate()
(2) 调用存储过程
提供了CallableStatement
语法: {call <procedure-name>[(<arg1>,<arg2>,...)]}
四 案例
DBhelper
package com.yc.test1.dao; import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import com.yc.test1.utils.LogUtil; public class DBHelper {
//让静态块保证数据库的驱动只加载一次
static{
try{ //因为只有一条语句需要调用Myproperties ,可以直接.getInstance(). 来直接调用
Class.forName(MyProperties.getInstance().getProperty("driverclassname"));
}catch(ClassNotFoundException e){
LogUtil.log.error(e.toString());
e.printStackTrace();
}catch(IOException e){
LogUtil.log.error(e.toString());
e.printStackTrace();
}
}
//获取与数据库的连接
public Connection getCon() throws SQLException, IOException{
//因为有三句语句需要Myproperties,所以getInstance 它,节省语句
MyProperties mp=MyProperties.getInstance();
Connection con=DriverManager.getConnection(mp.getProperty("url"),mp.getProperty("username"),mp.getProperty("password"));
return con;
} //查询数据
public List<Map<String,String>> findAll(String sql,List<Object>params) throws SQLException, IOException{
Connection con=getCon();
PreparedStatement pstmt=con.prepareStatement(sql);
setParams(pstmt,params);
// 得到结果集
ResultSet rs=pstmt.executeQuery();
//取出所有的列名,存到list中
//从结果集中取出列名
ResultSetMetaData rsmd=rs.getMetaData();
//取出列数
int columnCount=rsmd.getColumnCount();
List<String>cnlist=new ArrayList<String>();
for(int i=1;i<=columnCount;i++){
cnlist.add(rsmd.getColumnName(i));
}
List<Map<String,String>>list=new ArrayList<Map<String,String>>();
//取出表中的数据
while(rs.next()){
Map<String,String>map=new HashMap<String,String>();
//循环cnlist中所有的列名,再根据这个列名从rs 中取数据
for(String cn:cnlist){
map.put(cn, rs.getString(cn));
}
list.add(map);
}
closeAll(pstmt,con,rs);
return list;
} //查询聚合函数的方法: count avg max min
public double findDouble(String sql,List<Object>params) throws SQLException, IOException{
double result=0;
Connection con=getCon();
PreparedStatement pstmt=con.prepareStatement(sql);
setParams(pstmt,params);
//得到结果集
ResultSet rs=pstmt.executeQuery();
if(rs.next()){
result=rs.getDouble(1);
}
closeAll(pstmt,con,rs);
return result;
} //封装增删改
public int doUpdate(String sql,List<Object>params) throws SQLException, IOException{
Connection con=getCon();
PreparedStatement pstmt=con.prepareStatement(sql);
setParams(pstmt,params);
int result=pstmt.executeUpdate();
closeAll(pstmt,con,null);
return result;
} //封装事务的增删改
public void doUpdate(List<String> sqls,List<List<Object>>listparams) throws SQLException, IOException{
Connection con=getCon();
PreparedStatement pstmt=null;
//关闭隐式事务提交(一句sql语句提交一次)
con.setAutoCommit(false);
try{
if(sqls!=null&&sqls.size()>0){
for(int i =0 ; i<sqls.size();i++){
String sql=sqls.get(i);//取出每条sql 语句
pstmt=con.prepareStatement(sql);
setParams(pstmt,listparams.get(i));
pstmt.executeUpdate();
}
}
con.commit();//提交事务
}catch(Exception e){
if(con!=null){
con.rollback();
}
LogUtil.log.error(e.toString());
}finally{
con.setAutoCommit(true);//再次恢复事务为隐式事务
closeAll(pstmt,con,null);
}
} //设置sql语句当中的参数,如果有的话
private void setParams(PreparedStatement pstmt, List<Object> params) throws SQLException {
if(params!=null&& params.size()>0){
for(int i=1;i<=params.size();i++){
pstmt.setObject(i, params.get(i-1));
}
} }
//关闭连接
private void closeAll(PreparedStatement pstmt,Connection con,ResultSet rs) throws SQLException{
if(rs!=null){
rs.close();
}
if(pstmt!=null){
pstmt.close();
}
if(con!=null){
con.close();
}
} public List<Map<String, String>> find(String sql, List<Object> params) throws SQLException, IOException {
List<Map<String,String>> list=new ArrayList<Map<String,String>>();
Connection con=getCon();
PreparedStatement pstmt=con.prepareStatement(sql);
setParams(pstmt,params);
ResultSet rs=pstmt.executeQuery(); List<String> cnames=new ArrayList<String>();
ResultSetMetaData rsmd=rs.getMetaData();
for(int i=0;i<rsmd.getColumnCount();i++){
cnames.add(rsmd.getColumnName(i+1));
} while(rs.next()){
Map<String,String>map =new HashMap<String,String>();
for(String cn:cnames){
String value=rs.getString(cn);
map.put(cn, value);
}
list.add(map);
}
closeAll(pstmt,con,rs);
return list;
}
}
MyProperties
package com.net.dao; import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; public class MyProperties extends Properties {
private static MyProperties myproperties;
//将这个类的构造方法设为私有,这样这个类就不能多次实例化了
private MyProperties() throws IOException {
InputStream iis = MyProperties.class.getClassLoader().getResourceAsStream("db.properties");
super.load(iis);
} //对外提供一个方法来猎取唯一的一个实例
public static MyProperties getInstance() throws IOException {
if ( myproperties == null) {
myproperties = new MyProperties();
}
return myproperties;
}
}
db.properties
username=scott
password=a
driveclass=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
JDBC技术的更多相关文章
- 使用JDBC技术连接数据库(附源码)--JAVA的简单应用
一.创建数据库(以mysql数据库为例) mysql数据库的下载安装与配置 -可参考博主之前的随笔:Windows平台下搭建MySQL数据库 创建wxb数据库-create database wxb; ...
- JAVA数据库编程(JDBC技术)-入门笔记
本菜鸟才介入Java,我现在不急着去看那些基本的语法或者一些Java里面的版本的特征或者是一些晋级的知识,因为有一点.Net的OOP编程思想,所以对于Java的这些语法以及什么的在用到的时候在去发现学 ...
- JDBC技术总结(一)
1. JDBC简介 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC,JDBC不能直接操作数据库,JDBC通过接口加载数据库的驱动,然后操作数据库.JDBC: ...
- Javaweb学习笔记7—JDBC技术
今天来讲javaweb的第7阶段学习. JDBC技术,关于JDBC本篇博客只介绍了它的一部分,后面博客会更加深入探讨. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的 ...
- 预习 jdbc 技术简介
JDBC简介: JDBC全称为java database connectivity,是sun公司指定的java数据库连接技术的简称. 他是sun公司和数据库开发商共同开发出来的独立于DBMS的应用程序 ...
- JDBC技术总结(三)
1. 数据库连接池 JDBC部分的前两个总结主要总结了一下JDBC的基本操作,而且有个共同点,就是应用程序都是直接获取数据库连接的.这会有个弊端:用户每次请求都需要向数据库获得连接,而数据库创建连接通 ...
- java基础复习-自定义注解4(结合JDBC技术,打造类表映射微框架)
写在前面: 1.该框架为自己所写的第一个框架类产品,可能有着许多不足的地方,读者可以到评论区指出.同时,该微框架的源码也会开源至博客中,够后来的学习者借鉴.由于该框架逻辑结构稍些复杂,不可能花大量篇幅 ...
- 关于JDBC技术中,调用MySQL中不建议在没有服务器身份验证的情况下建立SSL连接错误解决
今天学习到了JBDC前沿:对JDBC编写步骤的封装,出现了一大串红色报错(当然,也不能叫报错,毕竟不是所有的红色都是错误eeror,) 错误如下: Establishing SSL connectio ...
- JDBC技术(汇聚页)
JDBC代表Java数据库连接(Java Database Connectivity),它是用于Java编程语言和数据库之间的数据库无关连接的标准Java API, 换句话说:JDBC是用于在Java ...
随机推荐
- 2016年团体程序设计天梯赛-决赛 L1-8. Left-pad(20)
根据新浪微博上的消息,有一位开发者不满NPM(Node Package Manager)的做法,收回了自己的开源代码,其中包括一个叫left-pad的模块,就是这个模块把javascript里面的Re ...
- PHP常用代码大全(新手入门必备)
PHP常用代码大全(新手入门必备),都是一些开发中常用的基础.需要的朋友可以参考下. 1.连接MYSQL数据库代码 <?php $connec=mysql_connect("loc ...
- Save Update saveOrUpdate delete
参考:Hibernate Session的saveOrUpdate()方法 saveOrUpdate与Update的作用 Hibernate Delete query Hibernate Basics ...
- 【Python@Thread】queue模块-生产者消费者问题
python通过queue模块来提供线程间的通信机制,从而可以让线程分项数据. 个人感觉queue就是管程的概念 一个生产者消费者问题 from random import randint from ...
- HDU 1695 GCD#容斥原理
http://acm.hdu.edu.cn/showproblem.php?pid=1695 翻译题目:给五个数a,b,c,d,k,其中恒a=c=1,x∈[a,b],y∈[c,d],求有多少组(x,y ...
- PerformSelector 和 NSInvocation
- C# 语言规范_版本5.0 (第1章 介绍)
1. 介绍 C#(读作“See Sharp”)是一种简洁.现代.面向对象且类型安全的编程语言.C# 起源于 C 语言家族,因此,对于 C.C++ 和 Java 程序员,可以很快熟悉这种新的语言.C# ...
- NOIP2010-普及组复赛模拟试题-第二题-数字积木
题目描述 Description 小明有一款新式积木,每个积木上都有一个数,一天小明突发奇想,要是把所有的积木排成一排,所形成的数目最大是多少呢?你的任务就是读入 n 个数字积木,求出所能形成的最大数 ...
- [Jmeter]jemeter启动报错,返回错误码 5,处理方法
今天在使用jmeter的时候,启动GUI,发现bat文件执行有告警,告警内容如下: java.util.prefs.WindowsPreferences <init>WARNING: Co ...
- android资源文件的选取
Android app项目中,res是用来存放资源文件的,来看看这些文件的创建和选取规则: 系统启动一个apk后,生成UI的过程中,会根据不同的系统配置来匹配.选择相应的资源文件. You shoul ...