1.获取数据库连接
(1)使用JDBC的准备环境:
- 1):拷贝MySQL的JDBC驱动,到Java项目中:mysql-connector-java-5.1.26-bin.jar。(注意:是jar包,不是zip包.)
- 2):选择jar,[buil path],把jar添加到classpath路径.
(2)DBC操作第一步:获取JDBC连接对象/Connection对象.
操作步骤(贾琏):
- 1):加载注册驱动.
Class.forName("com.mysql.jdbc.Driver");
为什么说上述代码,在完成加载注册驱动?
上述代码的作用:
1):把com.mysql.jdbc.Driver这一份字节码加载进JVM.
2):当一份字节码被加载进JVM,就会执行其静态代码块。而其底层的静态代码块在完成注册驱动工作.
- 2):获取连接对象.
通过DriverManager的getConnection方法创建Connection对象.
Connection conn = DriverManager.getConnection(url,username,password);
url=jdbc:mysql://localhost:3306/jdbcdemo
//如果连接的是本机的MySQL,并且端口是默认的3306,则可以简写:url=jdbc:mysql:///jdbcdemo
username=root
password=admin
可以通过 show processlist命令来查看有几个MySQL进程.
(3)备注
从Java6开始:JDBC4.0: (了解)JDBC4.0有一个新特性-无需加载注册驱动.
规范要求:从JDBC 4.0所有的驱动都必须包括 META-INF/services/java.sql.Driver 文件。此文件包含 java.sql.Driver 的 JDBC 驱动程序实现的名称。
程序会自动从 META-INF/services/java.sql.Driver去读取当前的驱动类的全限定名,此时程序员不再需要显示的编写 Class.forName("com.mysql.jdbc.Driver")代码.在Web开发中,还是得使用手动加载注册驱动.
PS:有的时候,MySQL的驱动类也也会看到使用org.gjt.mm.mysql.Driver的情况,org.gjt.mm.mysql.Driver是早期的驱动名称,后来就改名为com.mysql.jdbc.Driver,现在一般都推荐使用 com.mysql.jdbc.Driver。
在最新版本的mysql jdbc驱动中,为了保持对老版本的兼容,仍然保留了org.gjt.mm.mysql.Driver,但是实际上 org.gjt.mm.mysql.Driver中调用了com.mysql.jdbc.Driver,因此现在这两个驱动没有什么区别。
2.JDBC常用的API
(1)操作JDBC的步骤口诀:
贾琏欲执事:
1:加载注册驱动.
2:获取连接对象.
3:创建/获取语句对象.
4:执行SQL语句.
5:释放资源.
(2)重要接口
-
Connection接口: 表示JDBC的连接对象.
常用方法:
Statement createStatement() //:创建一个静态的语句对象.
PreparedStatement prepareStatement(String sql) //:创建一个预编译语句对象. 此时参数sql:表示带有占位符(?)的SQL语句的模板.
close()://释放资源
-
Statement接口: 静态SQL语句并返回它所生成结果.
常用方法:
int executeUpdate(String sql)://执行DDL/DML语句.
//若当前SQL是DDL语句,则返回0.
//若当前SQL是DML语句,则返回受影响的行数.
ResultSet executeQuery(String sql)//:执行DQL语句,返回结果集.
close()//:释放资源
- PreparedStatement接口:是Statemen接口的子接口-->享有Statement中的方法.表示预编译的 SQL 语句的对象
常用方法:
void setXxx(int parameterIndex,Xxx value)//:设置第几个占位符的真正参数值.
int executeUpdate()://执行DDL/DML语句. 注意:没有参数
若当前SQL是DDL语句,则返回0.
若当前SQL是DML语句,则返回受影响的行数.
ResultSet executeQuery()//:执行DQL语句,返回结果集.
//close():释放资源
//Xxx表示数据类型,比如String,int,long,Date等.
-
ResultSet接口:通过执行DQL语句查询之后的结果对象.封装了查询之后的所有数据.
ResultSet 对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。next 方法将光标移动到下一行;因为该方法在 ResultSet 对象没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集
常用方法:
boolean next()://判断当前光标是否能向下移动,如果能向下移动返回true,并同时将光标移动到下一行.
Xxx getXxx(int columnIndex)://取出当前光标所在行的第columnIndex列的数据(columnIndex从1开始算).
Xxx getXxx(String columnName)://取出当前光标所在行的列名为columnName列的数据,columnName可以是别名.
//Xxx表示数据类型,比如String,int,long,Date等. 推荐使用列名来取数据.
close()://释放资源
3.SQL语言的分类
SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL*。
- 数据查询语言DQL:数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE 子句组成的查询块: SELECT <字段名表> FROM <表或视图名> WHERE <查询条件>
- 数据操纵语言DML 数据操纵语言DML主要有三种形式: 1) 插入:INSERT 2) 更新:UPDATE 3) 删除:DELETE
-
数据定义语言DDL:数据定义语言DDL用来创建数据库中的各种对象-----表、视图、 索引、同义词、聚簇等如: CREATE TABLE/VIEW/INDEX/SYN/CLUSTER | | | | | 表 视图 索引 同义词 簇
DDL操作是隐性提交的!不能rollback
-
数据定义语言DDL:数据定义语言DDL用来创建数据库中的各种对象-----表、视图、 索引、同义词、聚簇等如: CREATE TABLE/VIEW/INDEX/SYN/CLUSTER | | | | | 表 视图 索引 同义词 簇
- 数据控制语言DCL: 数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制 数据库操纵事务发生的时间及效果,对数据库实行监视等。
如:
- GRANT:授权。
- ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。 回滚---ROLLBACK 回滚命令使数据库状态回到上次最后提交的状态。其格式为: SQL>ROLLBACK;
- COMMIT [WORK]:提交。
4.JDBC的DDL(创建表和异常处理)
需求:
创建一张t_student表:id/name/age:
CREATE TABLE `t_student` (`id` bigint(20) PRIMARY KEY AUTO_INCREMENT,`name` varchar(20),`age` int(11));
- 创建一张表
public void createTable() throws Exception{
String sql="CREATE TABLE `t_student` (`id` BIGINT (20) PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR (20),`age` INT (11))";
//1.加载注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
//3.创建/获取语句对象
Statement st=conn.createStatement();
//4.执行SQL语句
st.executeUpdate(sql);
st.close();
conn.close();
}
- 如何正确的处理JDBC异常
public void createTableException(){
String sql="CREATE TABLE `t_student` (`id1` BIGINT (20) PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR (20),`age` INT (11))";
//声明资源
Connection conn = null;
Statement st = null;
try{
//可能出现异常
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
st=conn.createStatement();
st.executeUpdate(sql);
}catch(Exception e){
e.printStackTrace();
}finally{
//释放资源
try {
if(st!=null){
st.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}finally {
try {
if(conn!=null){
conn.close();
}
} catch (Exception e3) {
e3.printStackTrace();
}
}
}
}
- 使用Java7的自动资源关闭
public void createEXceptionByJava7(){
String sql="CREATE TABLE `t_student` (`id2` BIGINT (20) PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR (20),`age` INT (11))";
try {
//1.获取连接对象
Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
//2.创建/获取语句对象
Statement st=conn.createStatement();
//3.执行SQL语句,可能会出现异常
st.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
}
}
5.JDBC的DML操作(增、删、改)
- 增加
public void insert() throws Exception{
String sql="INSERT INTO t_student(name,age) VALUES('jarry',20)";
//1.加载注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
//3.创建/获取语句对象
Statement st=conn.createStatement();
//4.执行SQL
st.execute(sql);
//5.释放资源
st.close();
conn.close();
}
- 修改
public void update()throws Exception{
String sql="UPDATE t_student SET name='jihang' ,age=18 WHERE name='jarry'";
//1.加载注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
//3.创建/获取语句对象
Statement st=conn.createStatement();
//4.执行SQL
st.execute(sql);
//5.释放资源
st.close();
conn.close();
}
- 删除
public void delete()throws Exception{
String sql="DELETE FROM t_student WHERE name ='jihang'";
//1.加载注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
//3.创建/获取语句对象
Statement st=conn.createStatement();
//4.执行SQL
st.execute(sql);
//5.释放资源
st.close();
conn.close();
}
发现:执行DDL和DML的语句的操作模板是一模一样的,仅仅是SQL语句不一样.
6.JDBC的DQL操作(查询)
- 查询总数
// 查询数量
public void queryCount() throws Exception {
String sql = "SELECT COUNT(id) count FROM t_product";
// 加载注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql:///jarry",
"root", "123456");
// 创建/获取语句对象
Statement st = conn.createStatement();
// 执行
ResultSet rs = st.executeQuery(sql);
if (rs.next()) {
long rows = rs.getLong("count");
//long rows = rs.getLong(1);
System.out.println(rows);
}
rs.close();
st.close();
conn.close();
}
- 查询单个细节
//查询单个细节
public void querySingle() throws Exception {
String sql = "SELECT * FROM t_product WHERE id =1";
// 加载注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql:///jarry",
"root", "123456");
// 创建/获取语句对象
Statement st = conn.createStatement();
// 执行
ResultSet rs = st.executeQuery(sql);
if (rs.next()) {
long rows = rs.getLong("id");
String name = rs.getString("name");
String salePrice = rs.getString("sale_price");
long type = rs.getInt("type");
System.out.println(rows+"--"+name+"--"+salePrice+"--"+type);
}
rs.close();
st.close();
conn.close();
}
- 查询全部细节
//查询全部细节
public void queryAll() throws Exception {
String sql = "SELECT * FROM t_product";
// 加载注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql:///jarry",
"root", "123456");
// 创建/获取语句对象
Statement st = conn.createStatement();
// 执行
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
long rows = rs.getLong("id");
String name = rs.getString("name");
String salePrice = rs.getString("sale_price");
long type = rs.getInt("type");
System.out.println(rows+"--"+name+"--"+salePrice+"--"+type);
}
rs.close();
st.close();
conn.close();
}
7.SQL和Java的对应类型
java.util.Date和java.sql.Date有什么关系:
java.sql.Date是java.util.Date的子类.