3.JDBC

https://www.bilibili.com/video/BV1eJ411c7rf?p=7
JDBC编写步骤

一、介绍
①JDBC(Java Database Connectivity)是一个 独立于特定数据库管理系统、的通用的SQL 数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)使用这个类库可以以一种标准的方法、方便地访问数据库资源
②JDBC为访问不同的数据库提供了一种 统一的途径,为开发者屏蔽了一些细节问题。
③JDBC的目标是使Java程序员使用JDBC可以连接任何 提供了JDBC 驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。

mysql库的jar包记得build path

手动启动mysql 服务 管理员运行黑框 net start mysql

二、建立连接的五种方式

package connection;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

import org.junit.Test;


import org.junit.Test;

public class ConnectionTest {
	@Test//方式一:原理 定义式
	public void connection1() throws SQLException
	{
		//1.获取Driver实现类对象
                Driver driver=new com.mysql.jdbc.Driver();
                //2.提供数据库 用户名 密码  四个基本信息
		String url="jdbc:mysql://localhost:3306/test";//test是数据库
		Properties info=new Properties();
		info.setProperty("user","root");
		info.setProperty("password", "123456");
                //3.获取连接
		Connection conn =driver.connect(url, info);
		System.out.println(conn);// 麻了  忘记手动打开mysql服务 所以Communications link failure
	}

	@Test //方式二:反射 不出现第三方api 提高可移植性
	public void connection2() throws Exception
	{
		Class clazz =Class.forName("com.mysql.jdbc.Driver");
		Driver driver = (Driver) clazz.newInstance();
		String url="jdbc:mysql://localhost:3306/test";
		Properties info=new Properties();
		info.setProperty("user","root");
		info.setProperty("password", "123456");
		Connection conn =driver.connect(url, info);
		System.out.println(conn);
	}
	@Test	//方式三:使用DriverManager类
	public void connection3() throws Exception
	{
		Class clazz =Class.forName("com.mysql.jdbc.Driver");
		Driver driver = (Driver) clazz.newInstance();
		
		String url="jdbc:mysql://localhost:3306/test";
		String user=("root");
		String password=("123456");
		//注册驱动
		DriverManager.registerDriver(driver);
		Connection conn =DriverManager.getConnection(url, user, password);
		System.out.println(conn);
	}
	@Test  //方式四
     public void connection4() throws Exception
	{
		String url="jdbc:mysql://localhost:3306/test";
		String user=("root");
		String password=("123456");
		Class.forName("com.mysql.jdbc.Driver");//mysql的Driver类源码中 静态代码块 就注册了
		Connection conn =DriverManager.getConnection(url, user, password);
		System.out.println(conn);
	}
	@Test//方式五:将基本信息配置在设置文件中 数据与代码分离  好处是如修改配置信息时避免重新打包
	public void connection5() throws Exception
	{
                               //1读取配置文件中的4个基本信息
		               InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
				
				Properties pros = new Properties();
				pros.load(is);
				
				String user = pros.getProperty("user");
				String url = pros.getProperty("url");
				String password=pros.getProperty("password");
				String driverClass=pros.getProperty("driverClass");
				
				//2加载驱动
				Class.forName(driverClass);
				
				//3获取连接
				Connection conn = DriverManager.getConnection(url, user, password);
				System.out.println(conn);
	}
}

statement有 拼串、 sql注入问题

三、preparedstatement增删改

package preparedstatement.CRUD_2;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;

import org.junit.Test;

import connection_1.ConnectionTest;

public class PreparedStatement_UpdateTest {
	@Test//为了保证资源释放所以使用了try catch
	public void insert() 
	{
		//1读取配置文件中的4个基本信息
		//3获取连接
		Connection conn=null;
		PreparedStatement ps=null;
		try {
			InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
			
			Properties pros = new Properties();
			pros.load(is);
			
			String user = pros.getProperty("user");
			String url = pros.getProperty("url");
			String password=pros.getProperty("password");
			String driverClass=pros.getProperty("driverClass");
			
			//2加载驱动
			Class.forName(driverClass);
			
			conn = DriverManager.getConnection(url, user, password);
			System.out.println(conn);
			
			//4预编译sql语句 并返回prepared实例
			String sql="INSERT INTO stuinfo (id,NAME) VALUES(?,?);";
			ps = conn.prepareStatement(sql);
			
			//5填充 占位符
			ps.setString(1, "3");
			ps.setString(2, "Dev1ce");
			//6执行操作
			ps.execute();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			//7资源关闭
		try {
			if(ps!=null)ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	    try {
			if(conn!=null)conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		}		
	}
}

	@Test //这里封装了函数getConnection()和closeResource 具体封装在下面
	public void update() 
	{
		
		Connection conn=null;
		PreparedStatement ps=null;
		try {
			//1获取连接
			conn = jdbc_utils.getConnection();
			//2sql
			String sql="update stuinfo set name=? where id =?";
			ps = conn.prepareStatement(sql);
			//3占位符
			ps.setObject(1, "Jame");
			ps.setObject(2, 10);
			//4执行
			ps.execute();
		} catch (Exception e) {
			e.printStackTrace();
		}
		finally{
			//5关闭
		jdbc_utils.closeResource(conn, ps);
		}
		
	}
	public void CommonUpdate(String sql ,Object ...args){//通用增删改
		
		Connection conn=null;
		PreparedStatement ps=null;
		try {
			//1获取连接
			conn = jdbc_utils.getConnection();
			//2sql
			ps = conn.prepareStatement(sql);
			//3占位符
			for(int i=0;i<args.length;i++){
				ps.setObject(i+1, args[i]);
			}
			//4执行
			ps.execute();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			//5关闭
		jdbc_utils.closeResource(conn, ps);
		}
		
	}
@Test //调用通用增删改
	public void up(){
		String sql="update stuinfo set id=? where name=?;";
		CommonUpdate(sql,13,"d");
		
	}

为了简便 把每次获取连接 新建一个package(我的叫util_3)里面的class(我的叫jdbc_utils)封装了连接和关闭操作

package util_3;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/*
 * 封装连接和关闭
 * 操作数据库的工具类
 * 
 * 
 */
public class jdbc_utils {
	public static Connection getConnection() throws Exception{
		InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
		
		Properties pros = new Properties();
		pros.load(is);
		
		String user = pros.getProperty("user");
		String url = pros.getProperty("url");
		String password=pros.getProperty("password");
		String driverClass=pros.getProperty("driverClass");
		
		//2加载驱动
		Class.forName(driverClass);
		
		Connection conn = DriverManager.getConnection(url, user, password);
		return conn;
	}
	
	public static void closeResource(Connection conn,Statement ps)
	{
		try {
			if(ps!=null)ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	    try {
			if(conn!=null)conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

四ResultSet 查询
针对特定表的特定操作 (有点懒 以后用到在学)

package preparedstatement.CRUD_2;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.junit.Test;

import bean.beauty;
import util_3.jdbc_utils;

public class Queryforbeauty {
	@Test
	public void test1() throws Exception{
		Connection conn=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
			conn = jdbc_utils.getConnection();
			String sql="select id ,name ,phone from beauty where id =?";
			ps = conn.prepareStatement(sql);
			ps.setObject(1, 5);
			
			 rs = ps.executeQuery();//执行并返回结果集
			
			//处理结果集
			if(rs.next()){
				int id=rs.getInt(1);
				String name=rs.getString(2),phone=rs.getString(3);
				
				//封装到数组
				Object data=new Object[]{id,name,phone};
				
				//封装到类对象 新建了一个class
				beauty bt = new beauty(id, name, phone);
				System.out.println(bt);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			jdbc_utils.closeResource(conn, ps, rs);
		}
	}
}

posted @ 2021-04-23 12:01  liv_vil  阅读(58)  评论(0)    收藏  举报