JDBC概述和CRUD

第一节:单元测试
1.1 什么是软件测试

软件测试是程序的一种执行过程,目的是尽可能发现并改正被测试软件中的错误,提高软件的可靠性。

1.2 测试分类

按照是否知道源代码

​ 黑盒测试:不关心具体的逻辑代码,只测功能

​ 白盒测试:测试逻辑代码

​ 灰盒测试:介于黑盒和白盒之间

从软件开发的过程

​ 单元测试:Unit Testing

​ 集成测试:Integrated Testing

​ 系统测试:System Testing

根据测试的次数

​ 冒烟测试

​ 压力测试

1.3 Junit单元测试

Junit是一个基于Java语言的单元测试框架。是白盒测试的一种技术。

演示测试1

public class Operation {
	public int add(int x,int y) {
		return x^y;
	}
	
	public int sub(int x,int y) {
		return x-y;
	}
}

public class OperationTest {

	@Test
	public void testAdd() {
		Operation operation=new Operation();
		int result=operation.add(20, 30);
		System.out.println(result);
		Assert.assertEquals(50, result);
	}
	@Test
	public void testSub() {
		Operation operation=new Operation();
		int result=operation.sub(10,5);
		System.out.println(result);
	}
}

演示测试2

有一个学生类StudentDao,添加测试类


public class StudentDao {
	public void add() {
		System.out.println("添加学生");
	}
	public void update() {
		System.out.println("更新学生");
	}

}	

public class StudentDaoTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		System.out.println("测试类执行之前。。。。。。。。。");
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
		System.out.println("测试类执行之后。。。。。。。。。");
	}

	@Before
	public void setUp() throws Exception {
		System.out.println("方法之前执行........");
	}

	@After
	public void tearDown() throws Exception {
		System.out.println("方法之后执行........");
	}

	@Test
	public void test() {
		System.out.println("测试方法");
	}
	@Test
	public void test2() {
		System.out.println("测试方法2");
	}
  
  	@Test
	public void testAdd() {
		StudentDao studentDao=new StudentDao();
		studentDao.add();
	}
	@Test
	public void testUpdate() {
		StudentDao studentDao=new StudentDao();
		studentDao.update();
	}

}

注意:

​ ①测试方法上必须使用@Test进行修饰

​ ②测试方法必须使用public void 进行修饰,不能带任何的参数

​ ③新建一个源代码目录来存放我们的测试代码,即将测试代码和项目业务代码分开

​ ④测试类所在的包名应该和被测试类所在的包名保持一致

​ ⑤测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖

​ ⑥测试类使用Test作为类名的后缀(不是必须)

​ ⑦测试方法使用test作为方法名的前缀(不是必须)

第二节 JDBC的简介
2.1 简介

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

JDBC可以在各种平台上使用Java,如Windows,Mac OS和各种版本的UNIX。

JDBC库包括与数据库使用相关的API。

  • 连接数据库。
  • 创建SQL或MySQL语句。
  • 在数据库中执行SQL或MySQL查询。
  • 查看和修改生成的记录。
2.2 JDBC体系结构

JDBC API支持用于数据库访问的两层和三层处理模型,但通常,JDBC体系结构由两层组成:

  • **JDBC:**提供了应用程序到数据库连接规范。
  • JDBC驱动程序: 连接数据库的驱动程序的实现。

JDBC API使用驱动程序管理器和特定于数据库的驱动程序来提供与异构数据库的透明连接。在这里插入图片描述

DriverManager: 此类管理数据库驱动程序列表。使用通信协议将来自java应用程序的连接请求与适当的数据库驱动程序匹配。

Driver:此接口处理与数据库服务器的通信,我们很少会直接与Driver对象进行交互。而是使用DriverManager对象来管理这种类型的对象。

​ **Connection:**该接口具有用于连接数据库的所有方法。连接对象表示通信上下文,数据库的所有通信仅通过连接对象。

Statement:使用从此接口创建的对象将SQL语句提交到数据库。除了执行存储过程之外,一些派生接口还接受参数。

​ **ResultSet:**在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。它作为一个迭代器,允许我们移动其数据。

​ **SQLException:**此类处理数据库应用程序中发生的任何异常。

第三节 JDBC相关的SQL语法
3.1 CRUD语法介绍

​ SQL 是一种标准化的语言,它允许你在数据库上执行操作,如创建项目,查询内容,更新内容,并删除条目等操作。

​ Create, Read, Update, and Delete 通常称为CRUD操作。

CREATE DATABASE语句用于创建新的数据库:

	SQL> CREATE DATABASE DATABASE_NAME;

DROP DATABASE语句用于删除现有数据库:

SQL> DROP DATABASE DATABASE_NAME;

CREATE TABLE语句用于创建新表。语法是 -

SQL> CREATE TABLE Employees
(
   id INT NOT NULL,
   age INT NOT NULL,
   first VARCHAR(255),
   last VARCHAR(255),
   PRIMARY KEY ( id )
);

DROP TABLE语句用于删除现有表。

SQL> DROP TABLE table_name;

INSERT的语法类似于以下内容,其中column1,column2等表示要显示在相应列中的新数据

SQL> INSERT INTO table_name VALUES (column1, column2, ...);

SELECT语句用于从数据库中检索数据。SELECT的语法是 -

SQL> SELECT column_name, column_name, ...
     FROM table_name
     WHERE conditions;

WHERE子句可以使用比较运算符,例如=,!=,<,>,<=和> =,以及BETWEEN和LIKE运算符。

UPDATE语句用于更新数据。

SQL> UPDATE table_name
     SET column_name = value, column_name = value, ...
     WHERE conditions;

WHERE子句可以使用比较运算符,例如=,!=,<,>,<=和> =,以及BETWEEN和LIKE运算符。

DELETE语句用于从表中删除数据。

SQL> DELETE FROM table_name WHERE conditions;

WHERE子句可以使用比较运算符,例如=,!=,<,>,<=和> =,以及BETWEEN和LIKE运算符。

第四节 JDBC初始
4.1 使用步骤

构建JDBC应用程序涉及以下六个步骤:

  • **导入JDBC驱动包:**需要下载包含数据库编程所需的JDBC的jar包。
  • **注册JDBC驱动程序:**要求您初始化驱动程序,以便您可以打开与数据库的通信通道。
  • **创建连接:**需要使用*DriverManager.getConnection()*方法创建一个Connection对象,该对象表示与数据库的物理连接。
  • **执行查询:**需要使用类型为Statement的对象来构建和提交SQL语句到数据库。
  • **从结果集中提取数据:**需要使用相应的*ResultSet.getXXX()*方法从结果集中检索数据。
  • **释放资源:**需要明确地关闭所有数据库资源,而不依赖于JVM的垃圾收集。

(1)导入jar包,在项目下创建lib目录,把mysql的jdbc包放入此目录,并添加到build path中(idea不同)。

(2)注册驱动

第一种方式(推荐写法):Class.forName()

注册驱动程序最常见的方法是使用Java的**Class.forName()**方法,将驱动程序的类文件动态加载到内存中,并将其自动注册

	try {
	   Class.forName("com.mysql.jdbc.Driver");
	}
	catch(ClassNotFoundException ex) {
	   System.out.println("Error: unable to load driver class!");
	   System.exit(1);
	}

第二种方式:是使用静态**DriverManager.registerDriver()**方法。

try {
   Driver myDriver = new com.mysql.jdbc.Driver();
   DriverManager.registerDriver( myDriver );
}
catch(ClassNotFoundException ex) {
   System.out.println("Error: unable to load driver class!");
   System.exit(1);
}

 * 1>驱动程序注册两次
 * 2>java程序依赖mysql驱动包

(3)获取连接

​ 3.1数据库URL配置

加载驱动程序后,可以使用**DriverManager.getConnection()**方法建立连接。为了方便参考,让我列出三个重载的DriverManager.getConnection()方法 -

  • getConnection(String url)
  • getConnection(String url,Properties prop)
  • getConnection(String url,String user,String password)
RDBMSJDBC驱动程序名称连接字符串格式
MySQL的com.mysql.jdbc.Driver**jdbc:mysql://**hostname:3306 / databaseName
ORACLEoracle.jdbc.driver.OracleDriverjdbc:oracle:thin:@ hostname:port Number:databaseName
DB2COM.ibm.db2.jdbc.net.DB2Driver**jdbc:db2:**hostname:port Number / databaseName
SYBASEcom.sybase.jdbc.SybDriverjdbc:sybase:Tds: hostname:port Number / databaseName

​ 3.2 创建数据库连接对象

String URL = "jdbc:mysql://localhost:3306/emp";
String USER = "root";
String PASS = "root"
Connection conn = DriverManager.getConnection(URL, USER, PASS);

(4)执行查询(暂不执行,下一章内容)

(5)处理结果(暂不处理,下一章内容)

(6)关闭数据库连接

为确保连接关闭,您可以在代码中提供一个“finally”块。finally块总是执行,不管是否发生异常。

要关闭上面打开的连接,你应该调用close()方法如下 -

conn.close();
第五节 JDBC执行SQL语句

一旦获得了连接,我们可以与数据库进行交互。JDBC Statement和PreparedStatement接口定义了使您能够发送SQL命令并从数据库接收数据的方法和属性。

接口使用
Statement用于对数据库进行通用访问。在运行时使用静态SQL语句时很有用。Statement接口不能接受参数。
PreparedStatement(推荐使用)当您计划多次使用SQL语句时使用。PreparedStatement接口在运行时接受输入参数。
5.1 Statement

创建语句对象

在使用Statement对象执行SQL语句之前,需要使用Connection对象的createStatement()方法创建一个,如下例所示:

Statement stmt = null;
try {
   stmt = conn.createStatement( );
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

创建Statement对象后,您可以使用它来执行一个SQL语句,其中有三个执行方法之一。

  • boolean execute(String SQL):如果可以检索到ResultSet对象,则返回一个布尔值true; 否则返回false。使用此方法执行SQL DDL语句或需要使用真正的动态SQL时。
  • int executeUpdate(String SQL):返回受SQL语句执行影响的行数。使用此方法执行预期会影响多个行的SQL语句,例如INSERT,UPDATE或DELETE语句。
  • ResultSet executeQuery(String SQL):返回一个ResultSet对象。当您希望获得结果集时,请使用此方法,就像使用SELECT语句一样。

关闭Statement对象

就像我们关闭一个Connection对象以保存数据库资源一样,由于同样的原因,还应该关闭Statement对象。

一个简单的调用close()方法将执行该作业。如果先关闭Connection对象,它也会关闭Statement对象。但是,应始终显式关闭Statement对象,以确保正确清理。

Statement stmt = null;
try {
   stmt = conn.createStatement( );
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   stmt.close();
}
5.2 ResultSet

SELECT语句是从数据库中选择行并在结果集中查看行的标准方法。该java.sql.ResultSet中的接口表示结果集数据库查询。

ResultSet对象维护指向结果集中当前行的游标。术语“结果集”是指包含在ResultSet对象中的行和列数据。

如果没有指定任何ResultSet类型,您将自动获得一个TYPE_FORWARD_ONLY。

类型描述
ResultSet.TYPE_FORWARD_ONLY光标只能在结果集中向前移动。
ResultSet.TYPE_SCROLL_INSENSITIVE光标可以向前和向后滚动,结果集对创建结果集后发生的数据库的其他更改不敏感。
ResultSet.TYPE_SCROLL_SENSITIVE。光标可以向前和向后滚动,结果集对创建结果集之后发生的其他数据库所做的更改敏感。

演示案例1:查询数据

public class JdbcDemo2 {
	public static void main(String[] args) {
		Connection connection=null;
		Statement stat=null;
		ResultSet rs=null;
		//2注册驱动
		try {
			Class.forName("com.mysql.jdbc.Driver");
			//3获取连接
			connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/school", "root", "root");
			//4创建命令(语句)对象
			stat=connection.createStatement();
			//执行命令查询
			rs=stat.executeQuery("select ename,empno from emp");  //返回一个结												//果集 ResultSet 接收一下
			//5处理结果
			while(rs.next()){
//				 int empno=rs.getInt(1);
//				 String empname=rs.getString(2);
				 int empno=rs.getInt("empno");
				 String empname=rs.getString("ename");
				 System.out.println(empno+"...."+empname);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(rs!=null){
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(stat!=null){
				try {
					stat.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(connection!=null){
				try {
					connection.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

演示案例2:添加数据

public class JdbcDemo3 {
	public static void main(String[] args) {
		Connection connection=null;
		Statement stat=null;
		//2 注册驱动
		try {
			Class.forName("com.mysql.jdbc.Driver");
			//3打开连接
			。connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/school", "root", "root");
			//4创建命令并执行
			stat=connection.createStatement();
			int result=stat.executeUpdate("insert into dept(deptno,dname,loc) values(80,'市场部','天津')");
			if(result>0){
				System.out.println("添加成功");
			}else{
				System.out.println("添加失败");
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(stat!=null){
				try {
					stat.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(connection!=null){
				try {
					connection.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

演示案例3:更新数据

public class JdbcDemo4 {
	public static void main(String[] args) {
		Connection connection=null;
		Statement stat=null;
		//2 注册驱动
		try {
			Class.forName("com.mysql.jdbc.Driver");
			//3打开连接
			connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/school", "root", "root");
			//4创建命令并执行
			stat=connection.createStatement();
			int result=stat.executeUpdate("update dept set loc='内蒙' where deptno=80");
			if(result>0){
				System.out.println("更新成功");
			}else{
				System.out.println("更新失败");
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(stat!=null){
				try {
					stat.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(connection!=null){
				try {
					connection.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

演示案例4:删除

public class JdbcDemo5 {
	public static void main(String[] args) {
		Connection connection=null;
		Statement stat=null;
		//2 注册驱动
		try {
			Class.forName("com.mysql.jdbc.Driver");
			//3打开连接
			connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/school", "root", "root");
			//4创建命令并执行
			stat=connection.createStatement();
			int result=stat.executeUpdate("delete from dept where deptno=80");
			if(result>0){
				System.out.println("删除成功");
			}else{
				System.out.println("删除失败");
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(stat!=null){
				try {
					stat.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(connection!=null){
				try {
					connection.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

演示案例5:实现用户登录

数据库myschool

表 :user

create table user(		

​	id int primary key auto_increment,

​	username varchar(18) not null,

​	password varchar(16) not null,  # 密文 123456

​	phone varchar(11)

);

insert into usert(username,password,phone)values(‘zhangsan’,‘123456’,‘13898765678’);

insert into user (username,password,phone) values(‘lisi’,‘6666’,‘17898879988’);

package com.qf.day03;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

import javax.management.remote.rmi.RMIJRMPServerImpl;

/*
 * 实现用户登录
 */
public class JdbcDemo1 {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		System.out.println("请输入用户名");
		String username=input.nextLine();
		System.out.println("请输入密码");
		String pass=input.nextLine();
		
		//连接对象
		Connection connection=null;
		//命令对象
		Statement stat=null;
		//结果集
		ResultSet rs=null;
		//1 注册驱动
		try {
			Class.forName("com.mysql.jdbc.Driver");
			//2获取连接
			connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/school", "root", "root");
			//3创建命令
			stat=connection.createStatement();
			//4执行命命令  select * from user where username='zhangsan' and password='123456';
			 rs=stat.executeQuery("select * from user where username='"+username+"' and password='"+pass+"'");
			if(rs.next()){ //有数据
				System.out.println("登录成功");
			}else{
				System.out.println("账号或密码错误");
			}
		
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(rs!=null){
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(stat!=null){
				try {
					stat.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(connection!=null){
				try {
					connection.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
		
	}
}
5.3 SQL注入

​ 就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。

例如:

上面的用户登录中 :

在输入密码时 ,可以给其拼接一个注释:(#) 这样后边的密码验证就会失效

原理(百度百科)

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:①不当的类型处理;②不安全的数据库配置;③不合理的查询集处理;④不当的错误处理;⑤转义字符处理不合适;⑥多个提交处理不当。
攻击
当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。相关的SQL注入可以通过测试工具pangolin进行。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。
防护
归纳一下,主要有以下几点:
1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和
双"-"进行转换等。
2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

5.4 PreparedStatement

PreparedStatement的接口扩展了Statement接口,它为您提供了一个通用的Statement对象有两个优点附加功能。

作用:1预编译,效率高 2 安全,避免SQL注入

此语句使您可以动态地提供参数。

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

JDBC中的所有参数都由**?**符号,这被称为参数标记。在执行SQL语句之前,必须为每个参数提供值。

所述的setXXX()方法将值绑定到所述参数,其中XXX代表要绑定到输入参数的值的Java数据类型。如果忘记提供值,将收到一个SQLException。

每个参数标记由其顺序位置引用。第一个标记表示位置1,下一个位置2等等。该方法与Java数组索引不同,从0开始。

关闭PreparedStatement对象

就像关闭Statement对象一样,由于同样的原因,还应该关闭PreparedStatement对象。

一个简单的调用close()方法将执行该作业。如果先关闭Connection对象,它也会关闭PreparedStatement对象。但是,应始终显式关闭PreparedStatement对象,以确保正确清理。

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   pstmt.close();
}

上机练习:使用PreparedStatement实现emp表的数据添加

package com.qf.day03;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

/**
 * 使用PreparedStatement实现emp表的数据添加
 * @author wgy
 *
 */
public class Demo6 {
	public static void main(String[] args) throws Exception{
		Scanner input=new Scanner(System.in);
		System.out.println("请输入员工编号");
		int empno=input.nextInt();
		System.out.println("请输入员工姓名");
		String ename=input.next();
		System.out.println("请输入工作");
		String job=input.next();
		System.out.println("请输入经理的编号");
		int mgr=input.nextInt();
		System.out.println("请输入入职日期");
		
		String date=input.next();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		Date hiredate=sdf.parse(date);
		System.out.println("请输入工资");
		double salary=input.nextDouble();
		System.out.println("请输入奖金");
		double comm=input.nextDouble();
		System.out.println("请输入部门");
		int deptno=input.nextInt();
		
		//1注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		//2获取连接
		String url="jdbc:mysql:///school";
		Connection conn=DriverManager.getConnection(url, "root", "root");
		//3创建命令
		PreparedStatement pstat=conn.prepareStatement("insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(?,?,?,?,?,?,?,?);");
		//4参数赋值
		pstat.setObject(1, empno);
		pstat.setObject(2, ename);
		pstat.setObject(3, job);
		pstat.setObject(4, mgr);
		pstat.setObject(5, hiredate);
		pstat.setObject(6, salary);
		pstat.setObject(7, comm);
		pstat.setObject(8, deptno);
		//5执行
		int count=pstat.executeUpdate();
		if(count>0) {
			System.out.println("添加成功");
		}else {
			System.out.println("添加失败");
		}
		//6释放资源
		pstat.close();
		conn.close();
		
	}
}
5.5抽取数据库工具类

DbUtils类功能:1 注册驱动 2 获取连接 3释放资源 4执行命令

package com.qf.utils;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

/*
 *  2019/8/26 14:28
 
 */
/*四个功能
* (1)注册驱动(一次)
* (2)获取连接
* (3)释放资源
* (4)执行SQL (增删改)
*
* */
public class DbUtils {
    private static String driver;
    private static String url;
    private static String user;
    private static String password;
    static{
/*        driver="com.mysql.jdbc.Driver";
          url="jdbc:mysql://localhost:3306/myschool?useSSL=true&characterEncoding=utf8";
          user="root";
          password="root";
*/
        //注册驱动
        try {
            //读取文件方式1
/*            Properties properties=new Properties();
              FileInputStream fis=new FileInputStream("src\\db.properties");
              properties.load(fis);
              fis.close();
*/
            //读取文件方式2 使用类加载器 加载配置文件
            Properties properties=new Properties();
            InputStream is=DbUtils.class.getClassLoader().getResourceAsStream("db.properties");
            properties.load(is);
            is.close();


            driver=properties.getProperty("driver");
            url=properties.getProperty("url");
            user=properties.getProperty("user");
            password=properties.getProperty("password");


            Class.forName(driver);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("注册驱动失败");
        }

    }
		//获取连接
    public static Connection getConnection(){
        try {
            return DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

//关闭连接 释放资源
    public static void closeAll(Connection conn, Statement stat, ResultSet rs){
        try {
            if(rs!=null){
                rs.close();
            }
            if(stat!=null){
                stat.close();
            }
            if(conn!=null){
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

//执行SQL语句
    public static int executeUpdate(String sql,Object...params){ //insert update delete  ?????

        Connection conn = getConnection();
        PreparedStatement pstat=null;
        try {
            pstat = conn.prepareStatement(sql);
            //设置参数
            if(params!=null){
                for (int i = 0; i < params.length; i++) {
                    pstat.setObject(i+1, params[i]);
                }
            }
            return pstat.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeAll(conn, pstat, null);
        }
        return -1;

    }

}
总结

1 单元测试

2 jdbc介绍 :

​ Java Database Connectity java数据库连接技术

​ 定义一套连接数据的规范和标准。

3 jdbc包含两个部分

​ JDBC API

​ JDBC 驱动程序

4 JDBC的使用步骤

​ 1 导入jar包

2 注册驱动

​ 3 获取连接

​ 4 创建命令

​ 5 执行命令,处理结果

​ 6 释放资源

5 JDBC的api

​ Driver 驱动

​ DriverManager 驱动管理类

​ Connection 负责连接数据库

​ Statement 负责执行命令

​ ResultSet 封装结果集

​ PreparedStatment 预编译命令

5 数据库工具类

​ DbUtils.java

​ 1 注册驱动

​ 2 获取连接

​ 3 释放资源

​ 4 执行命令 (增删改 DDL)

​ 5 执行查询(反射)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值