第十八章、JDBC操作

第十八章、JDBC操作

一、JDBC概述

1. 概述

JDBC:java database connection 使用java语言连接数据库
是java内部提供的一套操作数据库的接口(标准),实现对象数据库的统一访问

2. 功能

一个java应用程序和数据库交互的桥梁
one write,run anywhere的思想

3. 组成

# 1.DriverManage类:驱动管理器,用户注册驱动,获取连接对象
# 2.Connection接口:数据库的连接对象
# 3.Statement接口:执行SQL语句,操作数据库
# 4.PrepareStatement接口:执行SQL语句,操作数据库
# 5.ResultSet接口:结果集(一张虚拟表)

4. 图示

image-20210105134105276

image-20210105133941263

二、通过JDBC实现CURD操作

1. 操作准备

# <1>创建表
    create table student(
        sid int primary key auto_increment,
        sname varchar(32) not null,
        age int,
        hobby varchar(32),
        shows varchar(32)
    );

# <2>创建实体类
    class Student{

    }

# <3> 引入数据库厂商提供的驱动 (.jar文件的方式)
        将文件引入到 WebContent 下 WEB-INF 下 lib 中
    	这是通过创建一个动态Javaweb项目

# <4>编码
        使用JDBC访问数据库的步骤:
            1. 加载数据库的驱动
            2. 获取数据库的连接对象
            3. 编写SQL语句
            4. 获取Statement对象,执行sql语句
            5. 处理结果集
            6. 释放资源

2. 步骤介绍

①、DriverManager介绍

# 作用
	注册数据库驱动,获取数据库链接对象
# 注册数据库驱动方式 (推荐使用)
	1.DriverManager.registerDriver(new com.mysql.jdbc.Driver());
    2.Class.forName("驱动类全程:包名+类名");

②、Connection介绍

# 作用
	数据库的连接对象,控制事务的实施
# 具体方法
	void setAutoCommit(boolean autoCommit);  设置事务的事务的提交方式 ,默认是true,自动提交
    void commit();  提交事务
    void rollback(); 回滚事务
# 获取数据库连接对象

Connection getConnection(url, user, password);
    参数一:URL,统一资源定位符,标识网络上的一个具体的资源(网页,一张照片,一个视频等等)

            协议+ip地址+端口+资源名称
            jdbc:mysql://   127.0.0.1 : 3306 /tlxy

    第二个参数: 用户名
    第三个参数: 密码   


Connection getConnection(String path);
    url+username+password
    例如: jdbc:mysql://127.0.0.1:3306/tlxy?user=root&password=root
    注意:用户名和密码传输的key是固定的


Connection getConnection(url, properties)
    参数二:属性对象
        Properties p = new Properties();
        p.setProperty("user","root");
        p.setProperty("password","root");

③、Statement & PrepareStatement介绍

# 作用
	获取执行SQL语句的对象
# Statement
	是静态的,会出现SQL注入问题
# PrepareStatement
	是动态的,避免了SQL注入问题,性能更高,更灵活
	具有预处理操作的Statement接口对象
	使用占位符?来实现对数据库的各种操作
# 方法
	statement.executeQuery(sql)   执行查询SQL语句	返回ResultSet结果集
	statement.executeUpdate(sql)  执行增删改SQL语句   	int类型

④、ResultSet介绍

# 作用:封装乐查询的结果数据,内部含有一个游标,默认执行数据前。
# 方法:
    boolean next() ,将指向数据的游标下移,返回有没有数据的标记

    Object getObject(int ColIndex)
    Object getObject(String ColName);//推荐使用

3. 代码示例

  • 学生实体
package com.tlxy.entity;

public class Student {
	private int sid;
	private String sname;
	private int age;
	private String hobby;
	private String shows;
	
	// 无参构造
	public Student() {
		super();
	}

	// 有参构造
	public Student(int sid, String sname, int age, String hobby, String shows) {
		super();
		this.sid = sid;
		this.sname = sname;
		this.age = age;
		this.hobby = hobby;
		this.shows = shows;
	}
	
	// 设置获取实体类中的值
	public int getSid() {
		return sid;
	}
	public void setSid(int sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getHobby() {
		return hobby;
	}
	public void setHobby(String hobby) {
		this.hobby = hobby;
	}
	public String getShows() {
		return shows;
	}
	public void setShows(String shows) {
		this.shows = shows;
	}
	
	// 重写toString方法
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + ", age=" + age + ", hobby=" + hobby + ", shows=" + shows
				+ "]";
	}
}
  • 实现数据查询
package com.tlxy.test;


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.tlxy.entity.Student;

/*
 * 通过JDBC实现数据交互
 * 		
 * 		使用JDBC访问数据
 * 			1.加载数据库的驱动
 * 			2.获取数据库的连接对象
 * 			3.编写SQL语句
 * 			4.获取Statement对象,执行sql语句
 * 			5.处理结果集
 * 			6.释放资源	
 */
public class JDBCSelect {
	public static void main(String[] args){
		Connection conn = null;
		Statement statement = null;
		ResultSet resultSet = null;
		
		// 创建一个用于存储学生信息的集合
		List<Student> list = new ArrayList<Student>();
		
		try {
			// 1.加载驱动
			Class.forName("com.mysql.jdbc.Driver");

			// 2.获取连接
			conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tlxy", "root", "123456");
			
			// 3.获取执行SQL语句对象
			statement = conn.createStatement();
			/*
			 * 两个方法:
			 * 		statement.executeQuery(sql)   执行查询SQL语句	返回ResultSet结果集
			 * 		statement.exevuteUpdate(sql)  执行增删改SQL语句   	int类型
			 */
			
			String sql = "select * from Student";
			
			// 4.执行SQL语句,如果是查询,返回的是ResultSet结果集
			resultSet = statement.executeQuery(sql);
			
			// 5.遍历结果集
			while(resultSet.next()){
				// 第一种方式获取数据 	基本不用
				/*Object sid = resultSet.getObject(1);
				Object sname = resultSet.getObject(2);
				Object age = resultSet.getObject(3);
				Object hobby = resultSet.getObject(4);
				Object shows = resultSet.getObject(5);*/
			
				// 第二种方式获取数据       推荐使用 	方法中参数名称要与数据表中字段名一致
				// 注意:如果表中字段类型是Date类型的,建议用你String类型去接收
				int sid = resultSet.getInt("sid");
				String sname = resultSet.getString("sname");
				int age = resultSet.getInt("age");
				String hobby = resultSet.getString("hobby");
				String shows = resultSet.getString("shows");
				
				// 通过对象的方式存储从数据库中获取到的数据
				Student student = new Student(sid, sname, age, hobby, shows);
				list.add(student);
				
				//System.out.println(sid+"  "+sname+"  "+age+"  "+hobby+"  "+shows+"  ");
			}
			for (Student student : list) {
				System.out.println(student);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			// 6.释放资源
			if(conn != null){
				try {
					conn.close();
				} catch (SQLException e) {
					
					e.printStackTrace();
				}
			}
			if(statement != null){
				try {
					statement.close();
				} catch (SQLException e) {
					
					e.printStackTrace();
				}
			}
			if(resultSet != null){
				try {
					resultSet.close();
				} catch (SQLException e) {
					
					e.printStackTrace();
				}
			}
		}
	}
}
  • 实现数据添加
package com.tlxy.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

import com.tlxy.entity.Student;

/*
 * 通过JDBC实现数据添加
 */
public class JDBCInsert {
	public static void main(String[] args) {
		Student stu = new Student(0, "李四", 25, "吃生蚝", "一个不一样的美男子");
		Connection conn = null;
		Statement st = null;
		try {
			// 1. 加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			
			// 2.建立连接
			conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tlxy","root","123456");
			
			// 3.获取执行SQL语句对象
			st = conn.createStatement();
			
			// 4.执行SQL语句
			String sql = "insert into Student (sname,age,hobby,shows) values('"+stu.getSname()+"','"+stu.getAge()+"','"+stu.getHobby()+"','"+stu.getShows()+"')";
			System.out.println(sql);
			// 5.如果是结果集,遍历
			int insert = st.executeUpdate(sql);
			
			if(insert > 0){
				System.out.println("插入成功!");
			}
			// 6.关闭资源
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			// 6.释放资源
			if(conn != null){
				try {
					conn.close();
				} catch (SQLException e) {
					
					e.printStackTrace();
				}
			}
			if(st != null){
				try {
					st.close();
				} catch (SQLException e) {
					
					e.printStackTrace();
				}
			}
		}
	}
}
  • 实现数据修改
package com.tlxy.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

import com.tlxy.entity.Student;

/*
 * 通过JDBC实现数据更新
 */
public class JDBCUpdate {
	public static void main(String[] args) {
		
		// 通过Student对象来操作数据库
		Student stu = new Student(3, "jason", 25, "喝营养快线", "虹桥第一炮王");
		Connection conn = null;
		Statement st = null;
		
		try {
			// 1.加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			
			// 2.获取连接
			conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tlxy?user=root&password=123456");
			
			// 3.获取执行SQL语句的对象
			st = conn.createStatement();
			
			// 4.执行SQL语句获取结果集
			String sql = "update student set sname = '"+stu.getSname()+"',age = "+stu.getAge()+",hobby = '"+stu.getHobby()+"',shows = '"+stu.getShows()+"' where sid = "+stu.getSid()+";";
			int update = st.executeUpdate(sql);
			
			// 5.遍历结果集
			if(update > 0){
				System.out.println("修改成功!");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			// 6.释放资源
			if(conn != null){
				try {
					conn.close();
				} catch (SQLException e) {
					
					e.printStackTrace();
				}
			}
			if(st != null){
				try {
					st.close();
				} catch (SQLException e) {
					
					e.printStackTrace();
				}
			}
		}		
	}
}
  • 实现数据删除
package com.tlxy.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/*
 * 通过JDBC实现数据删除
 */
public class JDBCDelete {
	public static void main(String[] args) {
		Connection conn = null;
		Statement st = null;
		
		try {
			// 1.加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			
			// 2. 获取连接
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/tlxy","root","123456");
			
			// 3.获取执行SQL语句的对象
			st = conn.createStatement();
			
			// 4.执行SQL语句获取结果集
			String sql = "delete from student where sid = " + "3";
			int delete = st.executeUpdate(sql);
			
			// 5.遍历结果集
			if(delete > 0){
				System.out.println("删除成功!");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			// 6.释放资源
			if(conn != null){
				try {
					conn.close();
				} catch (SQLException e) {
					
					e.printStackTrace();
				}
			}
			if(st != null){
				try {
					st.close();
				} catch (SQLException e) {
					
					e.printStackTrace();
				}
			}
		}		
	}
}

三、封装JDBC工具类

1. 简单的封装

package com.tlxy.utils;

import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;


/*
 * JDBCg工具类
 * 
 * 		1.封装加载驱动
 * 		2.建立连接
 * 		3.释放资源
 */
public class JDBCUtil {

	// 静态块
	static{		
		try {			
			// 1.加载驱动
			Class.forName("com.mysql.jdbc.Driver");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	// 2.获取连接对象
	public static Connection getCOnnection(){
		Connection conn = null;
		try {
			conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tlxy","root","123456");
		} catch (SQLException e) {				
			e.printStackTrace();
		}
		return conn;
	}
	// 3.释放连接资源
	public static void close(Connection conn,Statement st,ResultSet rs){
		if(conn != null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(st != null){
			try {
				st.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(rs != null){
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

2. 高级封装

// 使用Properties进行动态配置相关资源信息
package com.tlxy.utils;

import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;


/*
 * JDBCg工具类
 * 
 * 		1.封装加载驱动
 * 		2.建立连接
 * 		3.释放资源
 */
public class JDBCUtil {
	
	public static String DRIVER;
	public static String URL;
	public static String USERNAME;
	public static String PASSWORD;
	

	// 静态块
	static{		
		try {
			
			Properties p = new Properties();
			p.load(new FileReader("db.properties"));
			DRIVER = p.getProperty("mysql.datasource.driver");
			URL = p.getProperty("mysql.datasource.url");
			USERNAME = p.getProperty("mysql.datasource.username");
			PASSWORD = p.getProperty("mysql.datasource.password");

			// 1.加载驱动
			Class.forName(DRIVER);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	// 2.获取连接对象
	public static Connection getCOnnection(){
		Connection conn = null;
		try {
			conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
		} catch (SQLException e) {				
			e.printStackTrace();
		}
		return conn;
	}
	
	// 3.释放连接资源
	public static void close(Connection conn,Statement st,ResultSet rs){
		if(conn != null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(st != null){
			try {
				st.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(rs != null){
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

3. 补充:单元测试

单元测试是白那些测试代码
Junit是Java单元测试框架,已经在Eclipse中默认安装。

Junit4通过注解的方式来识别测试方法
@Before  在测试方法运行之前运行
@Test   测试方法
@After  在测试方法运行之后运行
package javatest;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class SequenceTest {
    @Before
    public  void TestBefore(){
        System.out.println("Before");
    }
    
	@Test
    public void TestTest(){
        System.out.println("Test");
    }
 
    @After
    public void TestAfterClass(){
        System.out.println("After");
    }
}
原文地址:https://www.cnblogs.com/borntodie/p/14236674.html