文章目录
1. JDBC入门案例一
导入驱动jar包
注册驱动
java.sql.DriverManager.registerDriver(new com.mysql.jdbc.Driver());
得到Connection对象
java.sql.DriverManager.getConnection(url,username,password);
username:数据库的用户名
password:数据库的密码
url:连接数据库的“网址” -hlocalhost
url详细解释
url是用来找到要连接数据库“网址”,就好比你要浏览器中查找百度时,也需要提供一个url。例如:http://www.baidu.com
下面是mysql的url:
jdbc:mysql://localhost:3306/mydb1
JDBC规定url的格式由三部分组成,每个部分中间使用冒号分隔。
- 第一部分是jdbc,这是固定的;
- 第二部分是数据库厂商名称,那么连接mysql数据库,第二部分当然是mysql了;
- 第三部分是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,mysql的第三部分分别由数据库服务器的IP地址(localhost)、端口号(3306),以及DATABASE名称(mydb1)组成。
下面是获取连接的语句:
Connection con =
DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb1”,”root”,”1234”);
url参数
还可以在url中提供参数(了解):
jdbc:mysql://localhost:3306/mydb1?useUnicode=true&characterEncoding=UTF8
- useUnicode参数指定这个连接数据库的过程中,是否使用Unicode字节集;true为使用,false不使用。它通常和characterEncoding参数配合使用
- characherEncoding参数指定连接数据库的过程中,使用的字节集编码为UTF-8编码;
- 注意,mysql中指定UTF-8编码是给出的是UTF8,而不是UTF-8。
案例代码
public class JdbcDemo01 {
public static void main(String[] args) throws SQLException {
//jdbc入门程序
//1、导驱动jar包
//2、注册驱动(java.sql.)
DriverManager.registerDriver(new Driver());
//3、获得连接
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/vip03test01", "root", "123456");
System.out.println(con);//com.mysql.jdbc.JDBC4Connection@446cdf90
}
}
2. JDBC入门案例二
当驱动类加载进内存的时候,就执行static里面的内容
注册驱动的另一种操作方法!
先来看com.mysql.jdbc.Driver类的源码
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
……
}
所以注册驱动只需要把com.mysql.jdbc.Driver.class加载进内存就可以了!!!
那怎么加载呢?
执行下面这句话即可!!!
Class.forName(“com.mysql.jdbc.Driver”) 反射的知识,加载某个类!!!
案例代码
public class JdbcDemo02 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
//有加载驱动类嘛?
Class.forName("com.mysql.jdbc.Driver");//反射的方式加载驱动类
//注册驱动可以不用自己做了,数据库厂商已经帮你做好了
//3、获得连接
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/vip03test01", "root", "123456");
System.out.println(con);//com.mysql.jdbc.JDBC4Connection@446cdf90
}
}
上面的驱动注册已经很简单了,但其实还有更简单的办法!
更简单的办法就是不用手动注册驱动!而是采用自动加载的方法!
在jdbc4.0之后,每个驱动jar包中,在META-INF/services目录下提供了一个名为java.sql.Driver的文件。文件的内容就是该接口的实现类名称!该名称会被自动扫描,扫描的类会被加载!
也就是说,jdbc4.0之后,mysql的驱动已经不需要手动注册了,我们只需要直接从驱动管理类获取就可以了!!!
// (前面的注册驱动或者加载驱动可以省略!!)通过驱动管理得到连接对象
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb1?", "root", "1234");
System.out.println(con);
3. Statement 对象
获取Statement对象
获取Statement
Statement是用来向数据库发送要执行的SQL语句的!–sql语句发送器
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb1?", "root", "1234");
Statement stmt = con.createStatement(); //通过Connection对象来获取Statement对象
发送更新语句(更新:增、删、改)
String sql = “insert into student value(5,’zhangSan’)”;
int m = stmt.executeUpdate(sql);
其中int类型的返回值表示执行这条SQL语句所影响的行数,我们知道,对insert来说,最后只能影响一行,而update和delete可能会影响0~n行。
如果SQL语句执行失败,那么executeUpdate()会抛出一个SQLException。
用Statement查询并解析结果ResultSet
String sql = “select * from student”;
ResultSet rs = stmt.executeQuery(sql);
executeQuery()方法返回的是ResultSet,ResultSet封装了查询结果。
读取结果集中的数据
ResultSet就是一张二维的表格,它内部有一个“行光标”,光标默认的位置在“第一行上方”,我们可以调用rs对象的next()方法把“行光标”向下移动一行,当第一次调用next()方法时,“行光标”就到了第一行记录的位置,这时就可以使用ResultSet提供的getXXX(int col)方法来获取指定列的数据了。
rs.next();//光标移动到第一行
rs.getInt(1);//获取第一行第一列的数据
当使用rs.getInt(1)方法时,你必须可以肯定第1列的数据类型就是int类型,如果你不能肯定,那么最好使用rs.getObject(1)。
在ResultSet类中提供了一系列的getXXX()方法,比较常用的方法有:
- Object getObject(int col)
- String getString(int col)
- int getInt(int col)
- double getDouble(int col)
关闭
与IO流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。
rs.close();//关闭结果集
stmt.close();//关闭Statement对象
con.close();//关闭连接
案例代码
public class JdbcDemo05 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
//获得连接
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/vip03test01", "root", "123456");
System.out.println(con);//com.mysql.jdbc.JDBC4Connection@446cdf90
//执行查询操作
//得到statement
Statement stmt = con.createStatement();
//发送sql语句
ResultSet resultSet = stmt.executeQuery("select * from stu");
//如何遍历结果集
//提供了一套api遍历
while(resultSet.next()){
int sid = resultSet.getInt(1);//索引不是从0开始,是从1开始
// int sid = resultSet.getInt("sid");
String sname = resultSet.getString(2);
int age = resultSet.getInt(3);
String gender = resultSet.getString(4);
System.out.println(sid+"\t"+sname+"\t"+age+"\t"+gender);
}
resultSet.close();
stmt.close();
con.close();
}
}
4. Junit的简单使用(测试框架)
首先来介绍Junit的简单使用!
Junit是一个测试框架,可以快速的测试、运行程序,而不用总是写main方法。
使用Junit测试框架的时候,需要导入Jar包。
(有的IDE开发工具已经集成了,如果集成了就不用导)
在方法上方添加注解@Test
@Test
public void method2(){
System.out.println("method2");
}
5. JDBC的代码规范化
实际上就是加入异常处理
1、把连接获取功能放到一个单独的方法中
2、对数据库的增、删、改、查操作加入异常处理
package com.ruandy.jdbc01;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JdbcDemo07 {
//没有异常处理的代码
@Test
public void method()throws Exception{
//获得连接
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/vip03test01", "root", "123456");
System.out.println(con);//com.mysql.jdbc.JDBC4Connection@446cdf90
//执行查询操作
//得到statement
Statement stmt = con.createStatement();
//发送sql语句
ResultSet resultSet = stmt.executeQuery("select * from stu");
//如何遍历结果集
//提供了一套api遍历
while(resultSet.next()){
int sid = resultSet.getInt(1);//索引不是从0开始,是从1开始
// int sid = resultSet.getInt("sid");
String sname = resultSet.getString(2);
int age = resultSet.getInt(3);
String gender = resultSet.getString(4);
System.out.println(sid+"\t"+sname+"\t"+age+"\t"+gender);
}
resultSet.close();
stmt.close();
con.close();
}
//有异常处理的代码
//规范化的代码
@Test
public void method2(){
Connection connection = null;
Statement stmt = null;
ResultSet rst = null;
try{
//可能出现异常的代码
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/vip03test0a",
"root", "123456");
stmt = connection.createStatement();
rst = stmt.executeQuery("select * from stu");
while(rst.next()){
int sid = rst.getInt(1);//索引不是从0开始,是从1开始
String sname = rst.getString(2);
int age = rst.getInt(3);
String gender = rst.getString(4);
System.out.println(sid+"\t"+sname+"\t"+age+"\t"+gender);
}
}catch (Exception e){
//对异常的捕获和处理
throw new RuntimeException(e);
}finally {
//释放资源
//释放资源的时候也可能出现异常
try{
if(rst!=null) rst.close();
if(stmt!=null) stmt.close();
if(connection!=null) connection.close();
}catch (Exception e){
throw new RuntimeException(e);
}
}
}
}