初识JABC(一)

一.什么是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.执行

 

转载于:https://www.cnblogs.com/MrTanJunCai/p/9907490.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值