JDBC基础

1、JDBC是什么?
Java DataBase Connectivity (Java语言连接数据库)
2、JDBC的本质是什么?
JDBC是SUN公司制定的一套接口(interface)接口都有调用者和实现者。
面向接口调用,面向接口写实现类,这都属于面向接口编程

3.为什么要面向接口编程?
解耦合:降低程序的耦合度,提高程序的扩展力。
多态机制就是非常典型的:面向抽象编程。(不要面向具体编程)
建议:
Animal a = new cat() ;

Animal a = new Dog ();
public void feed (Animal a){  }
不建议:
Dog d = new Dog ();
cat c =new cat ();

4.思考:为什么SUN制定一套JDBC接口呢?
因为每一个数据库的底层实现原理都不一样。oracle数据库有自己的原理。
MysQL数据库也有自己的原理。
Ms sqlserver数据库也有自己的原理。
每一个数据库产品都有自己独特的实现原理。

/*

Java程序员角色。不需要关心具体是哪个品牌的数据库,只需要面向JDBC接口写代码。面向接口编程,面向抽象编程,不要面向具体编程。

import java.util.* ;
public class JavaProgrammer
public static void main (string[] args) throws Exception{

JDBC jdbc = new MysQL ();

JDBC jdbc = new sqlserver () ;

//创建对象可以通过反射机制。

ResourceBundle bundle = ResourceBundle. getBundle("jdbc") ;

string className = bundle.getstring ( "className") ;

class c = class.forName (className) ;

JDBC jdbc = (JDBC)c.newInstance () ;
以下代码都是面向接口调用方法,不需要修改

jdbc.getConnection () ;
        }
}

*/

5、DEc开发前的准备工作,先从官网下载对应的驱动jar包,然后将其配置到环境变量classpath当中。
classpath= .;D: \course\06-JDBC\resources\MAysql Connector Java 5.1.23\mysql-connector-java-5.1.23-bin.jar

以上的配置是针对于文本编辑器的方式开发,使用IDEA工具的时候,不需要配置以上的环境变量。
IDEA有自己的配置方式。


6.JDBC编程六步(需要背会)
第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)


第二步:获取连接(表示Java的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完之后一定要关闭)


第三步:获取数据库操作对象((专门执行sql语句的对象)


第四步:执行SQL语句(DQL DML....)


第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步处理查询结果集。)


第六步:释放资源(使用完资源之后一定要关闭资源。Java和数据库属于进程间的通信,开启之后一定要关闭。)
 


public static void main (string [] args) {
try{
//1、注册驱动
Driver driver = new com.mysq1. jdbc.Driver();//多态,父类型引用指向子类型对象。DriverManager .registerDriver (driver) ;
//2、获取连接

/*
ur1:统一资源定位符(网络中某个资源的绝对路径)
https : // www.baidu . com/这就是URL。
URL包括哪几部分?
协议
IP
PORT
资源名
http:/ /182.61.200.7:80/index.html
http://通信协议
182.61.200.7服务器IP地址
80服务器上软件的端口
index.html是服务器上某个资源名


jdbc:mysq1://127.0.0.1:3306/bjpowernode
jdbc :mysql://协议
127.0.0.i IP地址
3306 mysql数据库端口号
bjpowernode具体的数[据库实例名。

说明: 1oca1host和127.0.0.1都是本机IP地址。

jdbc:mysq1://192.168.151.27:3306/bjpowernode
什么是通信协议,有什么用?
通信协议是通信之前就提前定好的数据传送格式。数据包具体怎么传数据,格式提前定好的。
*/
string url = "jdbc:mysql://192.168.151.27:3306/bjpowernstring 
user = "root" ;
string password = "333";
Connection conn = DriverManager.getConnection (ur1, user,password) ;

//com.mysql .jdbc.JDBC4Connection@41cf53f9

system.out.println("数据库连接对象=" +conn) ;


//3、获取数据库操作对象(statement专门执行sql语句的)

statement stmt = conn . createstatement () ;



//4、执行sql
string sql = "insert into dept (deptno , dname , loc)values (50,'人事部,'北京')";
//专门执行DM语句的(insert delete update)
//返回值是"影响数据库中的记录条数”

int count = stmt.executeUpdate(sql);

system.out.println (count == 1 ?"保存成功" :"保存失败");



}catch(sQLException e){
e.printstackrrace () ;
    }
finally{
//6、释放资源
//为了保证资源一定释放,在finally语句块中关闭资源1/并且要遵循从小到大依次关闭
//分别对其try ..catch
try {
    if ( stmt !=null){
        stmt.close () ;
    }
}catch (sQLException e){
    e.printstackTrace() ;
    }
try{
if (conn !=nu11) {
    conn . close () ;
    }
}catch (sQLException e){
    e.printstackTrace ();

}

JDBC删除!更新!


public class JDBCTesto2{
public static void main (string [] args) {

Connection conn = null;
statement stmt = null;
try{

//1、注册驱动
DriverManager.registerDriver(new com.mysqi.jdbc.Driver() );

//2、获取连接
conn = DriverManager.getconnection ("jdbc:mysq1://localhost:3306/bjpowernode " , "root" ,333 );

//3、获取数据库操作对象
stmt = conn. createstatement() ;

//4、执行sQL语句
llstring sql = "delete from dept where deptno = 40" ;

//JDBC中的sq1语句不需要提供分号结尾。
string sql ="update dept set dname = '销售部',loc = '天津' where deptno = 20" ;

int count = stmt.executeUpdate(sql) ;
system. out.println (count == 1 ?"删除成功"︰"删除失败");

}catch (sQLException e) {

e.printstackTrace() ;

}finally{
    //6、释放资源
if (stmt != nu1l) {
    try{
        stmt.close() ;
}catch (sQLException e) {
        e.printstackTrace () ;
    }
}
if (conn !=nul1){
    try {
        conn . close () ;
}catch (sQLException e) {
            e.printstackTrace () ;
        }
       }
    }
}

JDBC注册驱动的另一种方式(常用)

import java.sql.*;

public class JDBCTest03{

    public static viod main (String[] args[]){
    try{

        //1.注册驱动
        //这是注册驱动的第一种写法。
        //DriverManager.registerDriver(new com.mysql.jdbc.Driver());
        //注册驱动的第二种方式;常用
        //为什么这种方式常用?因为参数是一个字符串,字符串可以写到xxx.properties文件中。
        //以下方法不需要接收返回值,因为我们只想用它的类加载动作。
        Class.forName("com.mysql.jdbc.Driver");

        //2.获取连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306//bjpowernode","root","333");
        //com.mysql.jdbc.JDBC

        System.out.println(coon);
        }catch(SQLException e){

            e.printStackTrace();
        
    }cath(ClassNotFoundException e){
        e.printStackTrace();
            }




    }

}

JDBC事务处理:

/*
*create table t_act(
*actno int,
*balance double(7,2)//注意:7表示有效数字的个数,2表示小数位的个数。
*) ;
*insert into t act (actno,balance) values(111,20000);
*insert into t act(actno, balance) values(222,0);
*comrnit ;
*select *from t _act;
*重点三行代码?
*conn.setAutoComit (false);
*conn. commit();
*conn. rollback();

*/

public class JDBCTest11 {
    public static void main (string [ ] args){
    Connection conn = null;
    Preparedstatement ps = null;
try {
    //1、注册驱动
    class.forName ( " com.mysql.jdbc.Driver");

    //2、获取连接
    conn=DriverNanager.getConnection(url"jdbc:mysql://localhost:3306/bjpowernode",user."root" ,password."333");

//将自动提交机制修改为手动提交
conn . setAutoCommit (false) ;    //开启事务

//3、获取预编译的数据库操作对象
string sql = "“update t_act set balance = ? where actno = ?" ;
ps= conn.preparestatement (sgl) ;


//给?传值
ps.setDouble (parameterlndex: 1,x:10000);
ps.setint ( parameterlndex:2,x:111);
int count =ps.executeUpdate () ;

// string s = null;
//s.toString();

//给?传值
ps.setDouble ( parameterIndex: 1,x:10000) ;
ps.setInt ( parameterIndex:2,×:222);
count += ps.executeupdate ();

system.out.println(count== 2 ?"转账成功":“转账失败");

//程序能够走到这里说明以上程序没有异常,事务结束,手动提交数据

conn.commit);//提交事务
}catch(Exception e){
    //回滚事务
    if(conn != null){
    try {
        conn. rollback();
        }catch (SQLException e1){  
      e1.printstackTrace ();
            }
        }
e.printstackTrace(o) ;

}finally {
        //6、释放资源
        if(ps!=null) {

        try{
        ps.close();

        }cath(SQLException e){
            e.pxintstackTxace();
        }
    }
    
     if(conn!=null) {

        try{
        conn.close();

        }cath(SQLException e){
            e.pxintstackTxace();
        }
    }

}

JDBC的封装类

悲观锁:事务必须排队执行。数据锁住了,不允许并发。
乐观锁:支持并发,事务也不需要排队,只不过需要一个版本号。

行级锁:(悲观锁)在select语句后边加上 for update

select ename , job , sal from emp where job= 'MANAGER"for update;.
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值