JDBC快速上手

//魂淡简书没法加TOC 哼~

----- Author:Ouyang Lerong

简而言之,JDBC是一种在java里怎么和数据库交换的方式的library

当然有其他的我认为比它好用的方式,比如JPA,自行百度吧

I. 准备

你要有一个数据库,可以是localhost也可以是远程的

此处代码以local的mysql举例,如果你是在某云上购买的mysql数据库,要保证供应商支持外网连接数据库,不是单纯内网用用(这种就需要用php来交互了,然而php是一种濒临灭绝的语言),之后的import全忽略,ide会自动帮你import的

指定需要access的数据库的服务器地址

//看看版本,如果你是Mysql 5版本

URL = "jdbc:mysql://服务器地址链接:指定端口/数据库名字";
//例子:jdbc:mysql://localhost:3306/test 这个是localhost的3306端口,去找test数据库
//例子:jdbc:mysql://cdb-XXXXXXX.gz.tencentcdb.com:10029/test"
//上面这个是我买的腾讯云的,新用户一个月一块钱(腾讯爸爸快打广告钱
//看看版本,如果你是Mysql 6版本,url里还需要设置时区

URL = "jdbc:mysql://服务器地址链接:指定端口/数据库名字?serverTimezone=所在时区";
//例子:jdbc:mysql://localhost:3306/test?serverTimezone=UTC 
//这个时区是UTC,比中国早8个小时,要想设到中国,serverTimezone=Shanghai(香港也可以)

指定用户名和密码:

USER = "root";//服务商会给你一个账户和密码,一般是root
PASSWORD = "123456";//根据自己的情况修改这几行

II. JDBC连接数据库:

因为我很懒,这里exception处理就懒得写了,后面整合会写,从驱动开始都要写try...catch

0.准备:

首先要另外搞个jar包(文件去谷歌or百度),导入jar包不同ide有不同方式(此处不写)

  1. 连接SQLserver数据库时使用sqljdbc4.jar包
  2. 连接MYSQL数据库时使用mysqlconnector.jar包
  3. 连接Oracle数据库时使用ojdbc6.jar包

1.加载驱动程序,获得数据库连接

加载的驱动有区别:

//看你的mysql版本 这里是mysql 5,不需要指定时区
Connection conn = null;

Class.forName("com.mysql.jdbc.Driver");//加载驱动,这里是mysql5版本
conn = DriverManager.getConnection(URL;USER,PASSWORD);//获得连接
//看你的mysql版本 这里是mysql 6,需要指定时区
Connection conn = null;

Class.forName("com.mysql.cj.jdbc.Driver");//加载驱动,这里是mysql6版本
conn = DriverManager.getConnection(URL;USER,PASSWORD);//获得连接

使用上述方法连接成功后,可能会有一堆关于红色的警告(此处忽略):

如果你不需要使用SSL连接,你需要通过设置useSSL=false来显式禁用SSL连接。
如果你需要用SSL连接,就要为服务器证书验证提供信任库,并设置useSSL=true

加一个问号然后加在url之后,例子:

URL = "jdbc:mysql://localhost:3306/test?useSSL=false";

同理你也可以加编码方式是啥,这里不写了

如果要关闭连接:

conn.close();

2.JDBC基本语句:

a.前提:

你要有一个Connection(上面写了,默认下面都已经连接上了),和一个Statement(下面每个都会重复写,实际只要一个重复利用就可以),如果是查询,还要一个ResultSet

b.创建数据表(executeUpdate)

保证 a.前提 实现了

有机会还是自己去可视化界面创表吧,sql麻烦死了,容易出问题

Statement stmt = conn.createStatement();
String sql = "CREATE TABLE student " +
             "(id INTEGER not NULL, " +
             " name VARCHAR(255), " + 
             " major VARCHAR(255), " + 
             " age INTEGER, " + 
             " PRIMARY KEY ( id ))";
//sql语句就是创立一个叫做student的数据表,根据自己情况改
stmt.executeUpdate(sql);

之后爱close stmt和conn就close吧,后面也是

c.插入(executeUpdate)

保证 a.前提 实现了

Statement stmt = conn.createStatement();
String sql = "INSERT INTO student VALUES (1, 'cc', 'math', 20)"; //根据自己情况改
stmt.executeUpdate(sql);

注意:

!!!如果你的语句是用变量拼凑起来的,String边上要特意去加引号的!

不加的话SQL是错的,但是如果是拼起来总是容易忘记,后面sql同理。

d.删除(executeUpdate)

保证 a.前提 实现了

Statement stmt = conn.createStatement();
String sql = "DELETE FROM student WHERE id = 1";//根据自己情况改
stmt.executeUpdate(sql);

e.更新(executeUpdate)

保证 a.前提 实现了

Statement stmt = conn.createStatement();
String sql = "UPDATE student SET major = 'CS' WHERE id = 1";//根据自己情况改
stmt.executeUpdate(sql);

f.查找(executeQuery)

保证 a.前提 实现了

很明显,这个和上面的不太一样,上面所有的都是一个就是改改sql而已,因为这个是要返回东西的上面没有,返回的是ResultSet:

Statement stmt = conn.createStatement();
String sql = "SELECT * FROM student";//根据自己情况改,这里是把表里所有项目都拿出来
ResultSet rs = stmt.executeQuery(sql);

于是你得到了RS,但是你也要处理它,下面是一个处理的例子(全部都列出来),举一反三吧:

while(rs.next()){//一个rs是一行结果,用next()到下一行结果
         //得到这一行每一列的信息,可以根据返回的项目自取
         int id  = rs.getInt("id");
         String major = rs.getString("major");

         //得到了就用呗
         System.out.println("Student" + id + " hates studying " + major);
      }
rs.close();//用掉就关了吧,不想就算了

III. 实现OOP:

咱们是把JDBC当成工具用的,如果不写成单独的Utils类,会很丑很恶心,还会导致代码不停重复,而且你开了一个connection不可能再开同一个吧,也不知道啥时候关了没,而且...(此处省略很多字)

下面分三个必要的class(实际上一般是三个加一个interface):

​ 连接,具体实例,DAO层,(DAO层接口--这里没写)

1.连接

package db;
import java.sql.*

public class DbUtil {
    public static final String URL = "你自己的url,不会写看上面";
    public static final String USER = "你自己的用户名";
    public static final String PASSWORD = "你自己的密码";
    private static Connection conn = null;
    static{
        try {
            //1.加载驱动程序
            Class.forName("com.mysql.jdbc.Driver");//mysql5版本,不理ssl
            //2. 获得数据库连接
            conn = DriverManager.getConnection(URL, USER, PASSWORD);
        } catch (ClassNotFoundException e) {
          //如果是这里异常,可能你忘记加jar包或者搞错版本了
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }    public static Connection getConnection(){
        return conn;
    }
}

2.数据模型

package model;


public class student {

  private int id;
  private String name;
  private String major;
  private int age;
    
  //getter setter方法。。。自己生成吧
  
}

3.DAO层

DAO(data access object是夹在运用和数据库之间的一层),在OOP里很必要,基本上每一个table需要一个DAO接口,这里为了简介就不写interface了直接写一个实现,在例子里引用实现

package dao;

import db.DbUtil;
import model.student;

import java.sql.*
import java.util.ArrayList;
import java.util.List;

public class studentDAO{

        //增
        public Boolean addStudent(Student s){
            try{
                Connection conn = DbUtil.getConnection();
                String sql = "INSERT INTO student(id,name,major,age)"
                +"VALUES (?,?,?,?)"; //后面加数据
                
        PreparedStatement ptmt = conn.prepareStatement(sql); 
        //预编译SQL,减少sql执行
        
        ptmt.setInt(1,s.getId());
        ptmt.setString(2,s.getName());
        ptmt.setString(3,s.getMajor());
        ptmt.setInt(4,s.getAge());//上面均为传参
        
        ptmt.execute();//执行
        
      }catch(SQLException se){//JDBC查询有问题
        se.printStackTrace();
        return false;
      }catch(Exception e){// 其他问题
            e.printStackTrace();
        return false;
        }finally{//关了
            conn.close();
            ptmt.close();
        return true;
        }
        }
        
        
        //删
    public Boolean deleteStudent(int id){
        try{
        Connection conn = DbUtil.getConnection();
        String sql = "DELETE FROM student WHERE id=?";
        
        PreparedStatement ptmt = conn.prepareStatement(sql);
        ptmt.setInt(1, id);
        ptmt.execute();
        
      }catch(SQLException se){
        se.printStackTrace();
        return false;
      }catch(Exception e){
            e.printStackTrace();
        return false;
        }finally{//关了
            conn.close();
            ptmt.close();
        return true;
        }
    }
    
    
  //改
  public Boolean updateStudent(Student ns){
        try{
        Connection conn = DbUtil.getConnection();
        String sql = "UPDATE student SET name=?, age=? WHERE id=?";
        
        PreparedStatement ptmt = conn.prepareStatement(sql);
        
        ptmt.setString(1, ns.getName);
        ptmt.setInt(2, ns.getAge);
        ptmt.setInt(3, ns.getId);
        
        ptmt.execute();
        
      }catch(SQLException se){
        se.printStackTrace();
        return false;
      }catch(Exception e){
            e.printStackTrace();
        return false;
        }finally{//关了
            conn.close();
            ptmt.close();
        return true;
        }
    }
    
    
  //查 -- 自己根据要求可以写很多种 这里就单纯列出所有的学生的名字和年龄
  public List<Student> listStudent(){
        List<student> students = new ArrayList<student>();
        try{
        Connection conn = DbUtil.getConnection();
        Statement stmt = conn.createStatement();
        String sql = "SELECT name, age FROM student"
        ResultSet rs = stmt.executeQuery(sql);
        Student s = null;
        while(rs.next()){
            s = new Student();
            s.setName(rs.getString("name"));
            s.setAge(rs.getInt("age"));

            students.add(s);
        }
        conn.close();
        stmt.close();
        
        return students;
        
      }catch(SQLException se){
        se.printStackTrace();
      }catch(Exception e){
            e.printStackTrace();
        }
 
}

上面这种赋值方法(在ptmt里赋值)也是一种可以防止写sql出错的好办法

4.使用举例(片段,非全部)

Student a = new Student();
a.setId(22);
a.setname("Jack");
a.setMajor("play")
a.setAge(16);
Boolean result = studentDAO.addStudent(a);
System.out.println(result);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335