JDBC简介及编码步骤

时间:2023-03-10 02:03:58
JDBC简介及编码步骤

一、什么是JDBC

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

二、JDBC编码步骤

0、前提:拷贝数据库的驱动到构建路径中(classpath)

1、注册驱动

2、获取与数据库的链接

3、创建代表SQL语句的对象

4、执行SQL语句

5、如果是查询语句,需要遍历结果集

6、释放占用的资源

三、代码实现

1、在终端或者navicat中创建一个表:users, 如下图:JDBC简介及编码步骤

2、创建一个名为JdbcDemo1的类,并导入包:mysql-connector-java-5.0.8-bin.jar, JdbcDemo1代码如下:

 package com.bigshow1949.jdbc;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; /*
create table users(
id int primary key auto_increment,
name varchar(40),
password varchar(40),
email varchar(60),
birthday date
)character set utf8 collate utf8_general_ci; insert into users(name,password,email,birthday) values('zs','123456','zs@sina.com','1980-12-04');
insert into users(name,password,email,birthday) values('lisi','123456','lisi@sina.com','1981-12-04');
insert into users(name,password,email,birthday) values('wangwu','123456','wangwu@sina.com','1979-12-04');
*/ //JDBC的编码步骤:
//查询users表中的所有数据,打印到控制台上
public class JdbcDemo1 { public static void main(String[] args) throws SQLException {
// 1、注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
// 2、获取与数据库的链接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "sorry");
//System.out.println(conn.getClass().getName()); 要想知道具体类型,就这么办
// 3、创建代表SQL语句的对象
Statement stmt = conn.createStatement();
// 4、执行SQL语句
ResultSet rs = stmt.executeQuery("select id,name,password,email,birthday from users");
// 5、如果是查询语句,需要遍历结果集
while(rs.next()){
System.out.println("---------------------");
System.out.println(rs.getObject("id"));
System.out.println(rs.getObject("name"));
System.out.println(rs.getObject("password"));
System.out.println(rs.getObject("email"));
System.out.println(rs.getObject("birthday"));
}
// 6、释放占用的资源
rs.close();
stmt.close();
conn.close();
} }

3、运行代码,打印结果:

JDBC简介及编码步骤

成功连接, 并读取了数据库中的数据!!!

四、DriverManager详解

DriverManager作用:

a、注册驱动:

方式一:(不建议使用)

DriverManager.registerDriver(new com.mysql.jdbc.Driver());

原因:1、依赖具体驱动。2、导致驱动注册2遍

方式二:(建议)

Class.forName("com.mysql.jdbc.Driver");

b、获取与数据库的链接

url:SUN和数据库厂商间的协议。具体查阅数据库的文档。

public static Connection getConnection(String url,String user,String password) throws SQLException

public static Connection getConnection(String url,Properties info) throws SQLException

public static Connection getConnection(String url) throws SQLException

Connection作用:

所有的数据库操作都是基于链接之上的。

Statement createStatement():创建向数据库发送sql的statement对象。

所以代码修改为:

 package com.bigshow1949.jdbc;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; //DriverManager详解
public class JdbcDemo2 { public static void main(String[] args) throws Exception {
//方式一:不建议使用
// DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//方式二:
Class.forName("com.mysql.jdbc.Driver"); //---------------------------------------------------------------------------------------
// 2、获取与数据库的链接
//方式一:
// Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "sorry"); //方式二:
// Properties props = new Properties();
// props.setProperty("user", "root");// 参数名:参考数据库的文档
// props.setProperty("password", "sorry");
// props.setProperty("useUnicode", "true");//编码有关的参数
// props.setProperty("characterEncoding", "utf8");
// Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15",props); //方式三
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15?user=root&password=sorry"); //System.out.println(conn.getClass().getName()); 要想知道具体类型,就这么办
// 3、创建代表SQL语句的对象
Statement stmt = conn.createStatement();
// 4、执行SQL语句
ResultSet rs = stmt.executeQuery("select id,name,password,email,birthday from users");
// 5、如果是查询语句,需要遍历结果集
while(rs.next()){
System.out.println("---------------------");
System.out.println(rs.getObject("id"));
System.out.println(rs.getObject("name"));
System.out.println(rs.getObject("password"));
System.out.println(rs.getObject("email"));
System.out.println(rs.getObject("birthday"));
}
// 6、释放占用的资源
rs.close();
stmt.close();
conn.close();
} }

五、Statement详解

作用:代表SQL语句对象。可以向数据库发送任何的SQL语句

ResultSet executeQuery(String sql):sql一般都是查询语句

int executeUpdate(String sql):sql一般是DML语句。insert update delete。返回值,操作几条记录。

boolean execute(String sql):sql可以是任意的语句。返回值不是代表成功与否。如果是查询语句,就有结果集,返回true。没有返回结果集的,返回false。

代码展示:

 package com.itheima.jdbc;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; //Statement详解
public class JdbcDemo3 { public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "sorry");
// 3、创建代表SQL语句的对象
Statement stmt = conn.createStatement(); // int num = stmt.executeUpdate("update users set password=123");
// System.out.println(num); // boolean b = stmt.execute("update users set password=111");
// System.out.println(b); // boolean b = stmt.execute("select * from users");
// System.out.println(b);
// if(b){
// ResultSet rs = stmt.getResultSet();
// } stmt.close();
conn.close();
} }

六、ResultSet详解

作用:封装了查询的结果集

JDBC简介及编码步骤

boolean next():游标下移。返回值是有无记录

boolean previous():游标上移。

boolean absolute(int count):定位到指定的行。第一行是1。

void beforeFirst():移动游标到第一行的前面。

void afterLast():移动游标到最后一行的后面。

先创建一个User类,代码:

 package com.bigshow1949.user;

 import java.io.Serializable;
import java.util.Date;
//实体Bean:Enity JavaBean
//Java类型和数据库类型:对应关系。相对固定的
public class User implements Serializable {
private int id;
private String name;
private String password;
private String email;
private Date birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password
+ ", email=" + email + ", birthday=" + birthday + "]";
} }

ResultSet代码展示:

 package com.bigshow1949.jdbc;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List; import com.bigshow1949.user.User; //ResultSet详解
public class JdbcDemo4 { public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "sorry");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select id,name,password,email,birthday from users");
// rs.afterLast();
// boolean b = rs.previous();
// if(b){
// User user = new User();
// user.setId(rs.getInt("id"));
// user.setName(rs.getString("name"));
// user.setPassword(rs.getString("password"));
// user.setEmail(rs.getString("email"));
// user.setBirthday(rs.getDate("birthday"));
// System.out.println(user);
// }else{
// System.out.println("没有结果");
// } // 5、如果是查询语句,需要遍历结果集
List<User> users = new ArrayList<User>();
while(rs.next()){
System.out.println("---------------------");
// System.out.println(rs.getObject("id"));//不考虑字段的类型
// System.out.println(rs.getObject("name"));
// System.out.println(rs.getObject("password"));
// System.out.println(rs.getObject("email"));
// System.out.println(rs.getObject("birthday")); // System.out.println(rs.getObject(1));//第一列。所用从1开始。 一般很少用,做JDBC有关的框架时用
// System.out.println(rs.getObject(2));
// System.out.println(rs.getObject(3));
// System.out.println(rs.getObject(4));
// System.out.println(rs.getObject(5));
User user = new User();
// user.setId((Integer)rs.getObject("id"));
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString("email"));
user.setBirthday(rs.getDate("birthday")); users.add(user); }
rs.close();
stmt.close();
conn.close(); for(User u:users)
System.out.println(u);
} }

七、释放资源&JDBC编码的代码模板

如果当程序运行到users.add(user);就抛出异常了,那么rs.close();stmt.close();conn.close();就不会运行了,资源就不会释放了,所以要加上finally,不论程序是否异常都会执行,在这里释放资源。如果程序运行到stmt = conn.createStatement();就抛出异常,那么rs的值仍然是null,所以在finally里要判断下是否为null。

 package com.bigshow1949.jdbc;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List; import com.bigshow1949.user.User; //释放资源
//JDBC编码的代码模板
public class JdbcDemo5 { public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "sorry");
stmt = conn.createStatement();
rs = stmt.executeQuery("select id,name,password,email,birthday from users");
List<User> users = new ArrayList<User>();
while(rs.next()){
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString("email"));
user.setBirthday(rs.getDate("birthday"));
users.add(user);
} } catch (Exception e) {
e.printStackTrace();
}finally{
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
} } }

八、Jdbc工具类

我们发现每次增删改查,finally里跟注册里的代码都一样,所以这部分代码单独抽取出来,写一个工具类,所以就有了JdbcUtil工具类。

首先,新建配置文件:dbcfg.properties,把一些字符串变量写在配置文件里,然后程序直接读取配置文件

代码:

 driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day15
user=root
password=sorry
JdbcUtil工具类代码:
 package com.bigshow1949.util;

 import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; //工具类
public class JdbcUtil { private static String driverClass;
private static String url;
private static String user;
private static String password; static{
try {
ClassLoader cl = JdbcUtil.class.getClassLoader();
InputStream in = cl.getResourceAsStream("dbcfg.properties");
Properties props = new Properties();
props.load(in);
driverClass = props.getProperty("driverClass");
url = props.getProperty("url");
user = props.getProperty("user");
password = props.getProperty("password"); Class.forName(driverClass);
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
} public static Connection getConnection() throws Exception{
Connection conn = DriverManager.getConnection(url,user, password);
return conn;
}
public static void release(ResultSet rs,Statement stmt,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}

注意:注册驱动 Class.forName(driverClass);不要写在连接里,不然每次连接都要注册一次驱动,没有必要,初始化一次就够了。

测试代码:

 package com.bigshow1949.jdbc;

 import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement; import org.junit.Test; import com.bigshow1949.util.JdbcUtil; public class JdbcDemo6 { @Test
public void testAdd(){
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
conn = JdbcUtil.getConnection();
stmt = conn.createStatement();
stmt.executeUpdate("insert into users (name,password,email,birthday) values ('wangwu','123','wangwu@itcast.cn','2000-10-01')");
}catch(Exception e){
throw new RuntimeException(e);
}finally{
JdbcUtil.release(rs, stmt, conn);
}
}
@Test
public void testUpdate(){
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
conn = JdbcUtil.getConnection();
stmt = conn.createStatement();
stmt.executeUpdate("update users set password=111 where id=4");
}catch(Exception e){
throw new RuntimeException(e);
}finally{
JdbcUtil.release(rs, stmt, conn);
}
}
@Test
public void testDelete(){
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
conn = JdbcUtil.getConnection();
stmt = conn.createStatement();
stmt.executeUpdate("delete from users where id=1");
}catch(Exception e){
throw new RuntimeException(e);
}finally{
JdbcUtil.release(rs, stmt, conn);
}
}
}

九、项目文件结构

JDBC简介及编码步骤

项目代码下载:

https://github.com/BigShow1949/01-JDBC