一.什么是JDBC
Java Database Connectivity 直接翻译过来叫 Java数据库连接
Java操作数据库的一门技术
使用JDBC 可以 让java程序连接数据库 实现最基本的CRUD操作
一组规范: 包含接口和类,主要是接口
二.为什么用JDBC?(接口的好处)
如果访问数据库的API不统一,每个数据库厂商各自一套API
连接oracle
Oracle数据库类.test111();
Oracle数据库类.test222();
Oracle数据库类.test333();
连接mysql
MySql数据库类.testAAA();
MySql数据库类.testBBB();
MySql数据库类.testCCC();
缺点1: 学习成本高,每连接一种数据库需要 学习一套API,太麻烦了
缺点2: 需求变了以后 mysql-->oracle 需要改代码 不可维护 不符合OCP
接口统一以后,大家都使用JDBC访问数据库,程序员只需要针对接口编程就可以了
然后由数据库产生提供对接口的实现,这样学习成本降低了、需求变了以后也不需要
修改代码,可维护
三.使用JDBC的五个步骤
1. 加载驱动
2. 创建连接
3. 建立通道
4. 执行并返回结果集
5. 关闭
*************************商品种类管理(分层)***********************************
一.数据库层
1.创建表
create table category(
cid number(10) primary key,
cname varchar2(50),
cdesc varchar2(500)
)
2.创建序列
create sequence seq_category minvalue 0 start with 0 increment by 1
二.VO层(Value Object 值对象) 实体层
3个对应关系
java 数据库
1.类 表
2.属性 字段
3.对象 记录
VO层包含属性、setters和getters()方法、toString(),它是一个最简单的JavaBean对象
演示代码:
package com.vo;
//java 数据库
//1.类 表
//2.属性 字段
public class Category {
private int cid;
private String cname;
private String cdesc;
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getCdesc() {
return cdesc;
}
public void setCdesc(String cdesc) {
this.cdesc = cdesc;
}
@Override
public String toString() {
return "Category [cid=" + cid + ", cname=" + cname + ", cdesc=" + cdesc
+ "]";
}
}
为什么有VO层???
Java程序(面向对象的) + sql(面向关系的)
Java程序员一会编写面向对象的代码 一会编写sql语句 不是纯面向对象的思维
体验非常不好, 有了VO层以后 就可以 把对记录的CRUD转换成对对象的CRUD
public int addCategory(Category category){
String sql = "insert...";
}
********************访问数据库的工具类 ConnOracle.java*****************************
package com.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 公司:蓝桥软件学院
* 作者:zhangzy
* 时间:2017年8月30日 上午9:26:05
* 功能:连接数据库的工具类
*/
public class ConnOracle {
public static Connection getConnection(){
Connection conn = null;
String className = "oracle.jdbc.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String user = "scott";
String password = "tiger";
//1.加载驱动
try {
Class.forName(className);
} catch (ClassNotFoundException e) {
System.out.println("驱动类没有找到");
e.printStackTrace();
}
//2.创建连接
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
System.out.println("连接数据库失败");
e.printStackTrace();
}
return conn;
}
public static void closeConnection(Statement stmt,Connection conn){
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
System.out.println("关闭通道失败");
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
System.out.println("关闭数据库连接失败");
e.printStackTrace();
}
}
}
public static void main(String[] args) {
System.out.println(ConnOracle.getConnection());
}
}
三.DAO(Data Access Object) 数据访问层(数据访问对象)
实现对表中记录的最基本的增删改查操作,为上一层服务的....
public int addCategory(Category category){
//1.加载驱动 2.创建连接
String sql = "insert...";
}
public int deleteCategory(Category category){
//1.加载驱动 2.创建连接
String sql = "delete...";
}
public int updateCategory(Category category){
//1.加载驱动 2.创建连接
String sql = "update...";
}
访问数据库需要加载驱动类,驱动类都在连接数据库的jar包中
驱动类 就是 对JDBC接口的实现类,提供了真正访问数据库的代码...
oracle 11g ojdbc5.jar(jdk5.0用这个) 或ojdbc6.jar
oracle 10g ojdbc14.jar
mysql mysql-connector-java-5.1.7-bin.jar
一.接口
CategoryDao.java
package com.dao.inter;
import java.util.List;
import com.vo.Category;
public interface CategoryDao {
//1.添加
public int addCategory(Category category);
//2.删除
public int deleteCategory(Category category);
//3.修改
public int updateCategory(Category category);
//4.查1
public Category getCategoryById(int id);
//5.按SQL语句查
public List<Category> getPageByQuery(String sql);
}
二.实现类
CategoryDaoImpl.java
package com.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import com.dao.inter.CategoryDao;
import com.util.ConnOracle;
import com.vo.Category;
public class CategoryDaoImpl implements CategoryDao {
//1.组合Connection
private Connection conn;
public CategoryDaoImpl(){
conn = ConnOracle.getConnection();
}
@Override
public int addCategory(Category category) {
int count = 0;
//3.建立通道
String sql = "insert into category values(seq_category.nextval,?,?)";
//获得了一个预编译的通道 相当于IO通道 可以用它来发送sql语句
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, category.getCname());
pstmt.setString(2, category.getCdesc());
//4.执行并返回结果集
count =pstmt.executeUpdate();//可以执行除了DQL以外所有的语句 DML 返回的是受影响的行数 DCL或DDL语句 返回值是0
if(count>=1){
System.out.println("添加商品种类成功!");
}else{
System.out.println("没有添加任何商品种类!");
}
} catch (SQLException e) {
System.out.println("建立通道或添加商品种类失败");
e.printStackTrace();
}finally{
//5.关闭
ConnOracle.closeConnection(pstmt, conn);
}
return count;
}
@Override
public int deleteCategory(Category category) {
int count = 0;
//3.建立通道
String sql = "delete from category where cid=?";
//获得了一个预编译的通道 相当于IO通道 可以用它来发送sql语句
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, category.getCid());
//4.执行并返回结果集
count =pstmt.executeUpdate();//可以执行除了DQL以外所有的语句 DML 返回的是受影响的行数 DCL或DDL语句 返回值是0
if(count>=1){
System.out.println("删除商品种类成功!");
}else{
System.out.println("没有删除任何商品种类!");
}
} catch (SQLException e) {
System.out.println("建立通道或删除商品种类失败");
e.printStackTrace();
}finally{
//5.关闭
ConnOracle.closeConnection(pstmt, conn);
}
return count;
}
@Override
public int updateCategory(Category category) {
int count = 0;
//3.建立通道
String sql = "update category set cname=?,cdesc=? where cid=?";
//获得了一个预编译的通道 相当于IO通道 可以用它来发送sql语句
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, category.getCname());
pstmt.setString(2, category.getCdesc());
pstmt.setInt(3, category.getCid());
//4.执行并返回结果集
count =pstmt.executeUpdate();//可以执行除了DQL以外所有的语句 DML 返回的是受影响的行数 DCL或DDL语句 返回值是0
if(count>=1){
System.out.println("修改商品种类成功!");
}else{
System.out.println("没有修改任何商品种类!");
}
} catch (SQLException e) {
System.out.println("建立通道或修改商品种类失败");
e.printStackTrace();
}finally{
//5.关闭
ConnOracle.closeConnection(pstmt, conn);
}
return count;
}
@Override
public Category getCategoryById(int id) {
return null;
}
@Override
public List<Category> getPageByQuery(String sql) {
return null;
}
public static void main(String[] args) {
CategoryDaoImpl dao = new CategoryDaoImpl();
Category category = new Category();
category.setCid(3);
category.setCname("手机3");
category.setCdesc("通讯工具3");
dao.updateCategory(category);
}
}
***********************************schemas 方案*********************************
方案: 数据库对象的集合..... Scott方案
Scott用户 可以访问 Scott方案
***********************************三种通道*********************************
1. PreparedStatement 预编译的通道
语句固定不变 比如 每次都是 insert into category values(seq_category.nextval,参数,参数);
只是参数发生改变 推荐使用预编译的通道
增加、删除、修改、查1 都是固定不变的 使用这个通道
第一次发sql语句 会先把整条sql语句发过来 编译 运行
第二次如果发同样的sql语句 只会发参数 不会再从新编译了 直接运行 效率高
2. Statement 普通的通道
每次发的语句不一样 使用这个通道
每次都把整条sql发过来 每次都要从新编译 运行 效率低
3. CallableStatement 调用存储过程
sql语句的执行过程:
1.编译
2.执行