JDBC是Java Database Connectivity(Java数据库连接)的缩写,它有一组用Java语言编写的类和接口组成。通过JDBC,开发人员可以使用Java语言编写各种复杂的数据库应用程序。JDBC已经成为Java语言访问数据库使用的标准API。如合通过JDBC访问数据库呢?主要有以下几步:
1、加载数据库驱动。(JDBC本身并不能直接访问数据库,它需要依赖于JDBC驱动程序。)
2、与数据库建立连接。(格式:DriverManager.getConnection("jdbc:mysql://localhost<或写127.0.0.1>:端口号/数据库名","用户名", "进入数据库的密码");)
3、发送查询或更新语句到数据库。
4、执行查询并返回查询结果。
看一下下面的小例子。
/**
* DriverManager 驱动程序管理器 在数据库和相应驱动程序之间建立连接
* Connection 对象代表与数据库的连接,也就是在已经加载的Driver和数据库之间建立连接
* Statement 提供在基层连接上运行SQL语句,并且访问结果
* ResultSet 在Statement执行SQL语句时,有时会返回ResultSet结果集,包含的是查询的结果集
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Tester {
public static void main(String[] args) {
query();
}
public static void query(){
Connection conn = null;
try {
//1.加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//DriverManager 驱动程序管理器 在数据库和相应驱动程序之间建立连接
//2.获得数据库连接
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc_db", "root", "1234");
//3.创建语句
String sql = "select * from UserTbl";
//返回一个执行SQL的句柄
Statement stmt = conn.createStatement();
//返回查询的
//4.执行语句
ResultSet rs = stmt.executeQuery(sql);
//5.遍历结果集
while(rs.next()){
int id = rs.getInt(1);
String username = rs.getString(2);
String password = rs.getString(3);
int age = rs.getInt(4);
System.out.println(id+":"+username+":"+password+":"+age);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(conn!=null){
try { //关闭数据库连接
conn.close();
} catch (SQLException e) {
conn = null;
e.printStackTrace();
}
}
}
}
}
运行结果:
要注意的是在获得数据库连接时根据你所用的数据库种类选择加载的connector。加载方法先将连接数据库的jar包放进你的Project的一个Folder内,然后右击选择build path-----add to build path就可以了。第三步创建的SQL应根据你具体的需要编写。
获得数据库连接还可以通过下面两种方法:
// 第一种方法
public Connection getConnection(String driver, String url, String user,
String password) {
Connection conn = null;
try {
// Class.forName加载驱动
Class.forName(driver);
// DriverManager获得连接
conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// 第二种方法
public Connection openConnection() {
String driver = "";
String url = "";
String user = "";
String password = "";
Properties prop = new Properties();
Connection conn = null;
try {
// 加载属性文件
prop.load(this.getClass().getClassLoader().getResourceAsStream(
"DBConfig.properties"));
driver = prop.getProperty("driver");
url = prop.getProperty("url");
user = prop.getProperty("user");
password = prop.getProperty("password");
// Class.forName加载驱动
Class.forName(driver);
// DriverManager获得连接
conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
第二种方法比较常用,因为做修改的时候不需要对程序进行大的修改,只要在配置文件中进行增、删、改就可以了。
写一下关于数据库表的操作SQL,内容不重要,重要的是理解结构和含义哈。
//有自增的语句
CREATE TABLE person(
id INT PRIMARY KEY NOT NULL AUTO_INCREMENT ,
name VARCHAR(20) NOT NULL ,
age INT
) ;
/*创建学生表*/
create table Student(
Sno char(9) primary key,/*列级玩整性约束条件,Sno是主码*/
Sname char(20) unique, /*Sname 取唯一值*/
Ssex char(2),
Sage smallint,
Sdept char (20),
);
/*创建课程表*/
create table Course(
Cno char(4) primary key, /*列表完整性约束条件,Cno是主码*/
Cname char(40),
Cpno char(4), /*Cpno的含义是先修课*/
Ccredit smallint,
foreign key (Cpno) references Course(Cno)
/*表级完整性的约束条件,Cpno是外码,被参照表是Course,被参照列式Cno*/
);
/*创建学生课程表*/
create table SC(
Sno char (9),
Cno char(4),
Grade smallint,
primary key(Sno,Cno),/*主码由两个属性构成,必须作为表级完整性进行定义*/
foreign key (Sno) references Student(Sno),/*表级完整性约束条件,Sno是外码,被参照表是Student*/
foreign key (Cno) references course(Cno),/*表级完整性约束条件,Sno是外码,被参照表是Student*/
);
/*向Student表增加“入学时间”列 */
alter table Student add S_entrance date;
/*修改Student中Sage的属性*/
alter table Student alter column Sage int;
/*修改Course表中Cname为唯一值*/
alter table Course add unique (Cname);
/*删除表Student*/
Drop Table Student Cascade;(cascade 删除表是该表没有限制条件,在删除基本表的同时,相关的依赖对象,例如 视图等,都被删除
restrict删除的表不能被其他约束所引用,不能有视图,触发器。存储过程或函数等 )
/*** 表的索引 ***/
/*在Student表的Sname列上建立一个聚族索引*/
create cluster intdex Stusname on Student(Sname);
/*在三个表中建立唯一索引*/
create unique index Stuno on Student(Sno);
create unique index Coucno on Course(Cno);
create unique index SCno on SC(Sno ASC, Cno DESC);
/*删除Student表中stusname索引*/
drop index Student;
/*** 数据查询 ***/
一、普通查询
//查询全体学生的详细记录
select *
from Student;
//查询经过计算的值
select Sname ,2004-Sage
from Student;
//查询全体学生的姓名、出生年份和所在的院系,要求用小写的字母表示所有系名
1、select Sname,'year of birth:' birth, 2004-Sage birthday,LOWER(Sdept) departement
from Student;
2、select Sname,'year of birth:', 2004-Sage ,LOWER(Sdept)
from Student;
//查询选修课程的学生学号
select (all)Sno
from SC;
//查询选修课程的学生学号(消除取值重复的行)
select distinct Sno
from SC;
二、条件查询
//查询全体计算机系的所有学生
select Sname
from Student
where Sdept='CS';
//查询所有年龄在20岁以下的学生姓名和年龄
select Sname Sage
from Student
where Sage<20;
//成绩有不及格学生的学号
select distinct Sno
from SC
where Grade<60;
//年里不在20到30岁之间的学生姓名、系别、和年龄
select Sname,Sdept,Sage
from Student
where Sage not between 20 and 23;
//查询在CS、MA、IS学生的姓名和性别
select Sname,Ssex
from Student
where Sdept in('CS','MA','IS');
//查询不在CS、MA、IS学生的姓名和性别
select Sname,Ssex
from Student
where Sdept not in('CS','MA','IS');
//查询学号200215121的学生详细情况
select *
from Student
where Sno like '200215121'; (like 可用=替换)
//查询所有姓刘的学生姓名和性别
select *
from Student
where Sname like '刘%'; (% 等符号的含义)
//删除年龄大于25岁的
delete from Student where age>25;