1.什么是JDBC?
java数据库连接,是java语言链接关系型数据库的一种技术;
只要在java语言中需要访问数据库必须使用JDBC
2.JDBC有哪些核心接口和类;
类:
DriverManager:驱动管理,管理各个数据库厂家提供的数据库驱动程序,根据url usermame,password
完成 数据库 连 接
SQLException:数据库异常
接口:
- Connection :表示JAVA程序与数据库库的链接,又称会话(SEssion);
- Statement:表示执行的对象,仅仅能执行静态语句(传输)
String sql="insert into emp(empno,ename) values(7799,'zhangsan')";
- PreparedStatement:负责执行预编译的sql语句 ?占位符
String name="zhangsan";
String sql="insert into emp(empno,ename) values(7799,?)";
- CallableStatement:专门在java中为执行过程和函数提供接口;
String sql="{call pro_name(?,?)}";
ResultSet:封装 数据库查询得到的结果集
select 执行后的内容
其中包含两部分内容
一部分是 查询的列标题,不管有没有数据列标题都存在;
ResultSetMetaData 存放的是查询获取的数据;
另一部分 是查询获取的数据(记录),可能有 也可能没有;
3.JDBC的驱动分类;
a)jdbc-odbc:在顶层 把jdbc api 转换为odbc api 操作
需要在本机 中创建一个连接数据库的源才可以
可以用来连接那些没有驱动程序的数据库,access\excel.txt;
b)本地api :需要在本集中安装对应的数据库的驱动程序才可以
列如:QQ
c)网络连接:通过网络连接第三方服务 完成数据库的操作
web qq
使用第三方 工具 发送手机短信
d):本地协议 api:使用Java 语言 编写,直接操作数据库协议
必须数据库厂家提供协议驱动才可以
添加数据库连接驱动包
4.操作JDBC的步骤
a)复制驱动包到项目中并添加到构建路径 11G ojdbc6.jar
b) 加载驱动类
Class.forName(“oracle.jdbc.drever.OracleDriver”);
c)编写连接数据的使用的参数
String url="jdbc:oracle:thin:@localhost:1521:数据库的sid";//连接数据库的位置
String user=“”;//登录数据库的用户名
String pwd=“";//登录数据库的密码
Connection conn =DriverManager.getConnection(url,user,pwd);
//常见问题
1、java.lang.ClassNotFoundException:oracle.jdbc.OracleDriver
解决方案:1)核心驱动类 全限定名称 有错:
2)是否导入ojdbc6.jar
2、java.sql.SQLRecoverableException: IO 错误: The Network Adapter could not establish the connection
解决方案:检查URL中的ip地址或端口号
3、java.sql.SQLRecoverableException: IO 错误: Invalid number format for port number
解决方案:检查URL中的端口号
4、java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
解决方案:检查URL中的SID(数据库的唯一标识)
5、java.sql.SQLException: No suitable driver found for jdbc:eoracle:thin:@localhost:1521:oraclejdbc
解决方案:检查URL中的协议部分
6、java.sql.SQLException: ORA-01017: 用户名/口令无效; 登录被拒绝
解决方案:检查用户名和密码
7、java.sql.SQLSyntaxErrorException: ORA-00904: “AUUOUNTTNO”: 标识符无效 表或视图不存在 缺少符号 值太多…
并且使用异常堆栈信息,定位到错误代码行为 executeUpdate executeQuery时,解决方案:检查SQL语句。
解决方案:检查
d)编写sql语句:执行修改操作(Insert,update,delete)
String sql=“insert into dept(deptno,dname,loc) values(99,'测试',‘青岛’) ”;
e)创建一个执行sql语句的对象
Statement stmt=conn.createStatement();
f)执行sql语句,获取结果;
int row=stmt.executeUpdate(sql);
h)处理结果
根据影响的行数判断成功还是失败
j)关闭数据库
注意:JDBC 自动提交事物
public class Main { /*1.加载驱动类,使用哪个类的在底层连接数据库 * 2.设置连接数据库的参数 * 3.编写sql语句 * 4.创建执行sql语句对象 * 5.执行sql语句,DML返回影响的行数 * 6.处理结果 * 7.关闭资源; * */ public static void main(String[] args)throws ClassNotFoundException,SQLException { Class.forName("oracle.jdbc.driver.OracleDriver"); //使用 jdbc 协议连接oracle类型的数据库, // 在localhost 的主机中的1521位置 中找orcl的数据库 String url="jdbc:oracle:thin:@localhost:1521:orcl";//数据库位置 String user="scott";//不能是 dba ,该用户一定是操作表的拥有者; String pwd="tiger"; Connection sonn=DriverManager.getConnection(url,user,pwd); sonn.setAutoCommit(false);//不会自动提交; if(sonn!=null){ System.out.println("连接成功"); } String sql="insert into dept(deptno,dname,loc)"+ " values(90,'测试','青岛')"; Statement stmt=sonn.createStatement(); int row=stmt.executeUpdate(sql); if(row>0){ System.out.println("操作成功"); }else { System.out.println("操作失败"); } if(stmt!=null){ stmt.close(); } if(sonn!=null){ sonn.close(); } } }
------------------------------------
预编译方法;
PreparedStatement stmt=null; try { conn=DriverManager.getConnection(url,user,pwd); String sql="insert into dept(deptno,dname,loc)"+ // "values("+no+",'"+name+"','"+loc+"')"; "values(?,?,?)"; stmt=conn.prepareStatement(sql); //在执行sql语句之前,必须把?占位符 赋值 stmt.setObject(1,no); stmt.setObject(2,name); stmt.setObject(3,loc);
int row=stmt.executeUpdate();//必须是空参,因为构建PreparedStement时已经指明了sql语句
-------------------------------------------
删除
6。资源文件
以键值对格式进行存放的文件
可以根据Key获取对应的value部分的数据
以properties 为后缀的
--------------------------------------------
1.数据的加密与解密
加密:是对一个字节数据进行各种操作,获取一个新的字符串
2.JDBc完成查询操作
通过select查到的结果 我们称为结果集 ResultSet;
查询的结果,在java中称为 ResultSet;
数据库中称为游标Cursor,就是处理查询结果的工具
查询结果包含两部分内容
列标题,可以显示列名或者列的别名
表中的数据
不管查询的条件是否成立,结果中都包含列标题
b)在JAVA中如何处理结果集
-=-=-=-
package demo_03;
import java.sql.*;
import java.util.*;
public class Main_03 {
public static void main(String[] args) {
//永真循环:我们为了实现某个功能,人为设置条件永远成立
while (true) {
System.out.println("1.添加数据");
System.out.println("2.删除数据");
System.out.println("3.修改数据");
System.out.println("4.查询数据");
Scanner in = new Scanner(System.in);
System.out.print("请选择功能:");
int i = in.nextInt();
switch (i) {
case 1:
add();
break;
case 2:
delete();
break;
case 3:
update();
break;
case 4:
findAllEmp();
System.out.println("============");
findBySal();
break;
default:
System.out.println("请输入1-4之间的数据!");
break;
}
}
}
static {
//在类加载的时候执行,只执行一次
try {
Class.forName(ResUtil.getDriver());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
static String url=ResUtil.getUrl();
static String user=ResUtil.getUser();
static String pwd=ResUtil.getPassword();
static Connection conn=null;
static PreparedStatement stmt=null;
static ResultSet rst=null;
public static void findAllEmp(){
String sql="select * from emp";
List<Map<String,Object>> list= executeQuery(sql,null);
System.out.println(list);
}
public static void findBySal(){
String sql="select ename,job,sal from emp where sal>?";
Object[] objs={2000};
List<Map<String,Object>> list=executeQuery(sql,objs);
System.out.println(list);
}
//每一行数据对应一个Map集合,Map中的key 就是 查询的列名,Map中的value 就是该列对应的数据
//使用 List 存放 每一行构建的map对象
public static List<Map<String,Object>> executeQuery(String sql, Object[] objs){
List<Map<String,Object>> list=new ArrayList<>();
try {
conn=DriverManager.getConnection(url,user,pwd);
stmt=conn.prepareStatement(sql);
if(objs!=null){
for (int i = 0; i < objs.length; i++) {
stmt.setObject(i+1,objs[i]);
}
}
rst=stmt.executeQuery();
//如果能够获取 sql语句中查询的列名
ResultSetMetaData meta=rst.getMetaData();
//获取sql语句中查询的列数
int c=meta.getColumnCount();
//获取每一列的列名(在结果集中显示的名称)
String[] names=new String[c];
for (int i = 0; i < c; i++) {
names[i]=meta.getColumnLabel(i+1).toLowerCase();
}
//构建一个Map对象,用于存放每一行中的数据
Map<String,Object> item;
//获取每一行
while(rst.next()){
item=new HashMap<>();
//获取每一行中每一列
for (int i = 0; i < c; i++) {
Object obj=rst.getObject(i+1);
item.put(names[i],obj);
}
//把该行数据添加到list集合中
list.add(item);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
}
return list;
}
public static int executeUpdate(String sql,Object[] objs){
int row=0;
try {
conn=DriverManager.getConnection(url,user,pwd);
stmt=conn.prepareStatement(sql);
if(objs!=null){
// 说明数组中 包含数据了
// sql语句中 使用 ? 占位符
for (int i = 0; i < objs.length; i++) {
stmt.setObject(i+1,objs[i]);
}
}
//在if的外面执行
row=stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
stmt=null;
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return row;
}
public static void update() {
Scanner in = new Scanner(System.in);
System.out.print("编号:");
int no = in.nextInt();
System.out.print("名称:");
String name = in.next();
System.out.print("地址:");
String loc = in.next();
String sql = "update dept set dname='aaa',loc='bb'" +
" where deptno=12";
Object[] objs={name,loc,no};
//把需要执行的sql语句和该语句 ? 中对应的值 传递个 executeUpdate方法
int r=executeUpdate(sql,null);
}
public static void delete() {
Scanner in = new Scanner(System.in);
System.out.print("请输入要删除数据的编号:");
int no = in.nextInt();
String sql = "delete from dept where deptno=?";
Object[] objs={no};
int r=executeUpdate(sql,objs);
}
public static void add() {
Scanner in = new Scanner(System.in);
System.out.print("编号:");
int no = in.nextInt();
System.out.print("名称:");
String name = in.next();
System.out.print("地址:");
String loc = in.next();
String sql = "insert into dept(deptno,dname,loc)" +
" values(?,?,?)";//占位符
Object[] objs={no,name,loc};
int r=executeUpdate(sql,objs);//executeUpdate(sql,no,name,loc);
}
}
……连载中……