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 listStudent(){
        List students = new ArrayList();
        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);

你可能感兴趣的:(JDBC快速上手)