//魂淡没法加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有不同方式(此处不写)
- 连接SQLserver数据库时使用sqljdbc4.jar包
- 连接MYSQL数据库时使用mysqlconnector.jar包
- 连接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);