百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

java数据库驱动之JDBC(java 数据库驱动)

sinye56 2024-10-04 23:53 4 浏览 0 评论

1、JDBC

1.1、数据库驱动

这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机 上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡,同样道理,我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道,如下所示:



1.2、JDBC介绍

SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范(接口),称之为JDBC。这套接口由数据库厂商去实现,这样,开发人员只需要学习jdbc接口,并通过jdbc加载具体的驱动,就可以操作数据库。
如下图所示:



JDBC全称为:Java Data Base Connectivity(java数据库连接),它主要由接口组成。
组成JDBC的2个包:java.sql、javax.sql
开发JDBC应用需要以上2个包的支持外,还需要导入相应JDBC的数据库实现(即数据库驱动)。

1.3 、面试问题?

  • 打破双亲委派机制的例子
  • 驱动实现接口–数据库的jdbc,需要调用子类的实现类(对应厂商的实现),直接指定使用线程上下文类加载器也就是应用程序类加载器来加载这些类;

1.4、编写JDBC程序

搭建实验环境

CREATE DATABASE jdbcStudy CHARACTER SET utf8 COLLATE utf8_general_ci;

USE jdbcStudy;

CREATE TABLE users(
	id INT PRIMARY KEY,
	NAME VARCHAR(40),
	PASSWORD VARCHAR(40),
	email VARCHAR(60),
	birthday DATE
);
INSERT INTO users(id,NAME,PASSWORD,email,birthday)
VALUES(1,'zhansan','123456','zs@sina.com','1980-12-04'),
(2,'lisi','123456','lisi@sina.com','1981-12-04'),
(3,'wangwu','123456','wangwu@sina.com','1979-12-04');

新建一个Java工程,并导入数据驱动




编写程序从user表中读取数据,并打印在命令行窗口中。

package com.kuang.lesson01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JdbcFirstDemo {
	public static void main(String[] args) throws Exception {
		//要连接的数据库URL
		String url = "jdbc:mysql://localhost:3306/jdbcStudy?
		useUnicode=true&characterEncoding=utf8&useSSL=true";
		//连接的数据库时使用的用户名
		String username = "root";
		//连接的数据库时使用的密码
		String password = "123456";
		//1.加载驱动
		//DriverManager.registerDriver(new com.mysql.jdbc.Driver());不推荐使用
		这种方式来加载驱动
		Class.forName("com.mysql.jdbc.Driver");//推荐使用这种方式来加载驱动
		//2.获取与数据库的链接
		Connection conn = DriverManager.getConnection(url, username,
		password);
		//3.获取用于向数据库发送sql语句的statement
		Statement st = conn.createStatement();
		String sql = "select id,name,password,email,birthday from users";
		//4.向数据库发sql,并获取代表结果集的resultset
		ResultSet rs = st.executeQuery(sql);
		//5.取出结果集的数据
		while(rs.next()){
			System.out.println("id=" + rs.getObject("id"));
			System.out.println("name=" + rs.getObject("name"));
			System.out.println("password=" + rs.getObject("password"));
			System.out.println("email=" + rs.getObject("email"));
			System.out.println("birthday=" + rs.getObject("birthday"));
		}
		//6.关闭链接,释放资源
		rs.close();
		st.close();
		conn.close();
	}
}

1.5、对象说明

DriverManager类讲解

Jdbc程序中的DriverManager用于加载驱动,并创建与数据库的链接,这个API的常用方法:

DriverManager.registerDriver(new Driver())
DriverManager.getConnection(url, user, password)

注意:在实际开发中并不推荐采用registerDriver方法注册驱动。原因有二:

  1. 查看Driver的源代码可以看到,如果采用此种方式,会导致驱动程序注册两次,也就是在内存中会有两个Driver对象。
  2. 程序依赖mysql的api,脱离mysql的jar包,程序将无法编译,将来程序切换底层数据库将会非常麻烦。

推荐方式:Class.forName(“com.mysql.jdbc.Driver”);
采用此种方式不会导致驱动对象在内存中重复出现,并且采用此种方式,程序仅仅只需要一个字符串,不需要依赖具体的驱动,使程序的灵活性更高。

数据库URL讲解

URL用于标识数据库的位置,通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:



常用数据库URL地址的写法:

  • Oracle写法:jdbc:oracle:thin:@localhost:1521:sid
  • SqlServer写法:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
  • MySql写法:jdbc:mysql://localhost:3306/sid

如果连接的是本地的Mysql数据库,并且连接使用的端口是3306,那么的url地址可以简写为:
jdbc:mysql:///数据

Connection类讲解

Jdbc程序中的Connection,它用于代表数据库的链接,Collection是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过connection对象完成的,这个对象的常用方法:

  • createStatement():创建向数据库发送sql的statement对象。
  • prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
  • setAutoCommit(boolean autoCommit):设置事务是否自动提交。
  • commit() :在链接上提交事务。
  • rollback() :在此链接上回滚事务。

Statement类讲解

Jdbc程序中的Statement对象用于向数据库发送SQL语句, Statement对象常用方法:

  • executeQuery(String sql) :用于向数据发送查询语句。
  • executeUpdate(String sql):用于向数据库发送insert、update或delete语句
  • execute(String sql):用于向数据库发送任意sql语句
  • addBatch(String sql) :把多条sql语句放到一个批处理中。
  • executeBatch():向数据库发送一批sql语句执行。

ResultSet类讲解

Jdbc程序中的ResultSet用于代表Sql语句的执行结果。Resultset封装执行结果时,采用的类似于表格的方式。ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。

ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法:

  • 获取任意类型的数据getObject(int index)getObject(string columnName)
  • 获取指定类型的数据,例如:getString(int index)getString(String columnName)

ResultSet还提供了对结果集进行滚动的方法:

  • next():移动到下一行
  • Previous():移动到前一行
  • absolute(int row):移动到指定行
  • beforeFirst():移动resultSet的最前面。
  • afterLast() :移动到resultSet的最后面。

释放资源

Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象,特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。

为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。

1.6、statement对象

Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。

Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,executeUpdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)。

Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象。

CRUD操作-create

使用executeUpdate(String sql)方法完成数据添加操作,示例操作:

Statement st = conn.createStatement();
String sql = "insert into user(….) values(…..) ";
int num = st.executeUpdate(sql);
if(num>0){
	System.out.println("插入成功!!!");
}

CRUD操作-delete

使用executeUpdate(String sql)方法完成数据删除操作,示例操作:

Statement st = conn.createStatement();
String sql = "delete from user where id=1";
int num = st.executeUpdate(sql);
if(num>0){
	System.out.println(“删除成功!!!");
}

CRUD操作-update

使用executeUpdate(String sql)方法完成数据修改操作,示例操作:

Statement st = conn.createStatement();
String sql = "update user set name='' where name=''";
int num = st.executeUpdate(sql);
if(num>0){
	System.out.println(“修改成功!!!");
}

CRUD操作-read

使用executeQuery(String sql)方法完成数据查询操作,示例操作:

Statement st = conn.createStatement();
String sql = "select * from user where id=1";
ResultSet rs = st.executeUpdate(sql);
while(rs.next()){
	//根据获取列的数据类型,分别调用rs的相应方法映射到java对象中
}

使用jdbc对数据库增删改查
1、新建一个 lesson02 的包
2、在src目录下创建一个db.properties文件,如下图所示:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcStudy?
useUnicode=true&characterEncoding=utf8&useSSL=true
username=root
password=123456

3、在lesson02 下新建一个 utils 包,新建一个类 JdbcUtils

package com.kuang.lesson02.utils;
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 JdbcUtils {
	private static String driver = null;
	private static String url = null;
	private static String username = null;
	private static String password = null;
	static{
		try{
			//读取db.properties文件中的数据库连接信息
			InputStream in =
			JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
			Properties prop = new Properties();
			prop.load(in);
			//获取数据库连接驱动
			driver = prop.getProperty("driver");
			//获取数据库连接URL地址
			url = prop.getProperty("url");
			//获取数据库连接用户名
			username = prop.getProperty("username");
			/获取数据库连接密码
			password = prop.getProperty("password");
			//加载数据库驱动
			Class.forName(driver);
		}catch (Exception e) {
			throw new ExceptionInInitializerError(e);
		}
	}
	// 获取数据库连接对象
	public static Connection getConnection() throws SQLException{
		return DriverManager.getConnection(url, username,password);
	}
	// 释放资源,要释放的资源包括Connection数据库连接对象,负责执行SQL命令的Statement	对象,存储查询结果的ResultSet对象
	public static void release(Connection conn,Statement st,ResultSet rs){
		if(rs!=null){
			try{
				//关闭存储查询结果的ResultSet对象
				rs.close();
			}catch (Exception e) {
				e.printStackTrace();
			}
			rs = null;
		}
		if(st!=null){
			try{
				//关闭负责执行SQL命令的Statement对象
				st.close();
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
		if(conn!=null){
			try{
				//关闭Connection数据库连接对象
				conn.close();
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

使用statement对象完成对数据库的CRUD操作

1、插入一条数据

package com.kuang.lesson02;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestInsert {
public static void main(String[] args) {
	Connection conn = null;
	Statement st = null;
	ResultSet rs = null;
	try{
		//获取一个数据库连接
		conn = JdbcUtils.getConnection();
		//通过conn对象获取负责执行SQL命令的Statement对象
		st = conn.createStatement();
		//要执行的SQL命令
		String sql = "insert into users(id,name,password,email,birthday)		" +
		"values(4,'kuangshen','123','24736743@qq.com','2020-01-
		01')";
		//执行插入操作,executeUpdate方法返回成功的条数
		int num = st.executeUpdate(sql);
		if(num>0){
			System.out.println("插入成功!!");
		}
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			//SQL执行完成之后释放相关资源
			JdbcUtils.release(conn, st, rs);
		}
	}
}

2、删除一条数据

package com.kuang.lesson02;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestDelete {
	public static void main(String[] args) {
		Connection conn = null;
		Statement st = null;
		ResultSet rs = null;
		try{
			conn = JdbcUtils.getConnection();
			String sql = "delete from users where id=4";
			st = conn.createStatement();
			int num = st.executeUpdate(sql);
			if(num>0){
				System.out.println("删除成功!!");
			}catch (Exception e) {
				e.printStackTrace();
			}finally{
				JdbcUtils.release(conn, st, rs);
			}
	}
}

3、更新一条数据

package com.kuang.lesson02;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestUpdate {
	public static void main(String[] args) {
		Connection conn = null;
		Statement st = null;
		ResultSet rs = null;
		try{
			conn = JdbcUtils.getConnection();
			String sql = "update users set
			name='kuangshen',email='24736743@qq.com' where id=3";
			st = conn.createStatement();
			int num = st.executeUpdate(sql);
			if(num>0){
				System.out.println("更新成功!!");
			}
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			JdbcUtils.release(conn, st, rs);
		}
	}
}

4、查询数据

package com.kuang.lesson02;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestSelect {
	public static void main(String[] args) {
	Connection conn = null;
	Statement st = null;
	ResultSet rs = null;
	try{
		conn = JdbcUtils.getConnection();
		String sql = "select * from users where id=3";
		st = conn.createStatement();
		rs = st.executeQuery(sql);
		if(rs.next()){
			System.out.println(rs.getString("name"));
		}
	}catch (Exception e) {
		e.printStackTrace();
	}finally{
		JdbcUtils.release(conn, st, rs);
	}
}

SQL 注入问题

通过巧妙的技巧来拼接字符串,造成SQL短路,从而获取数据库数据

package com.kuang.lesson02;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class SQL注入 {
	public static void main(String[] args) {
		// login("zhangsan","123456"); // 正常登陆
		login("'or '1=1","123456"); // SQL 注入
	}
	public static void login(String username,String password){
		Connection conn = null;
		Statement st = null;
		ResultSet rs = null;
		try{
			conn = JdbcUtils.getConnection();
			// select * from users where name='' or '1=1' and password =			'123456'
			String sql = "select * from users where name='"+username+"' and
			password='"+password+"'";
			st = conn.createStatement();
			rs = st.executeQuery(sql);
			while(rs.next()){
				System.out.println(rs.getString("name"));
				System.out.println(rs.getString("password"));
				System.out.println("==============");
			}
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			JdbcUtils.release(conn, st, rs);
		}
	}
}

1.7 、PreparedStatement对象

PreperedStatement是Statement的子类,它的实例对象可以通过调用
Connection.preparedStatement()方法获得,相对于Statement对象而言:PreperedStatement可以避免SQL注入的问题。

Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。

PreparedStatement可对SQL进行预编译,从而提高数据库的执行效率。并且PreperedStatement对于sql中的参数,允许使用占位符的形式进行替换,简化sql语句的编写。

使用PreparedStatement对象完成对数据库的CRUD操作

1、插入数据

package com.kuang.lesson03;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.util.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class TestInsert {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		try{
		//获取一个数据库连接
		conn = JdbcUtils.getConnection();
		//要执行的SQL命令,SQL中的参数使用?作为占位符
		String sql = "insert into users(id,name,password,email,birthday) 		values(?,?,?,?,?)";
		//通过conn对象获取负责执行SQL命令的prepareStatement对象
		st = conn.prepareStatement(sql);
		//为SQL语句中的参数赋值,注意,索引是从1开始的
		st.setInt(1, 4);//id是int类型的
		st.setString(2, "kuangshen");//name是varchar(字符串类型)
		st.setString(3, "123");//password是varchar(字符串类型)
		st.setString(4, "24736743@qq.com");//email是varchar(字符串类型)
		st.setDate(5, new java.sql.Date(new
		Date().getTime()));//birthday是date类型
		//执行插入操作,executeUpdate方法返回成功的条数
		int num = st.executeUpdate();
		if(num>0){
			System.out.println("插入成功!!");
		}
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			//SQL执行完成之后释放相关资源
			JdbcUtils.release(conn, st, rs);
		}
	}
}

2、删除一条数据

package com.kuang.lesson03;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class TestDelete {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		try{
			conn = JdbcUtils.getConnection();
			String sql = "delete from users where id=?";
			st = conn.prepareStatement(sql);
			st.setInt(1, 4);
			int num = st.executeUpdate();
			if(num>0){
				System.out.println("删除成功!!");
			}
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			JdbcUtils.release(conn, st, rs);
		}
	}
}

3、更新一条数据

package com.kuang.lesson03;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class TestUpdate {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		try{
			conn = JdbcUtils.getConnection();
			String sql = "update users set name=?,email=? where id=?";
			st = conn.prepareStatement(sql);
			st.setString(1, "kuangshen");
			st.setString(2, "24736743@qq.com");
			st.setInt(3, 2);
			int num = st.executeUpdate();
			if(num>0){
			System.out.println("更新成功!!");
		}
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			JdbcUtils.release(conn, st, rs);
		}
	}
}

4、查询一条数据

package com.kuang.lesson03;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class TestSelect {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		try{
			conn = JdbcUtils.getConnection();
			String sql = "select * from users where id=?";
			st = conn.prepareStatement(sql);
			st.setInt(1, 1);
			rs = st.executeQuery();
			if(rs.next()){
				System.out.println(rs.getString("name"));
			}
		}catch (Exception e) {
		}finally{
			JdbcUtils.release(conn, st, rs);
		}
	}
}

避免SQL 注入

package com.kuang.lesson03;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class SQL注入 {
	public static void main(String[] args) {
		// login("zhangsan","123456"); // 正常登陆
		login("'or '1=1","123456"); // SQL 注入
	}
	public static void login(String username,String password){
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		try{
			conn = JdbcUtils.getConnection();
			// select * from users where name='' or '1=1' and password =		'123456'
			String sql = "select * from users where name=? and password=?";
			st = conn.prepareStatement(sql);
			st.setString(1,username);
			st.setString(2,password);
			rs = st.executeQuery();
			while(rs.next()){
				System.out.println(rs.getString("name"));
				System.out.println(rs.getString("password"));
				System.out.println("==============");
			}
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			JdbcUtils.release(conn, st, rs);
		}
	}
}

原理:执行的时候参数会用引号包起来,并把参数中的引号作为转义字符,从而避免了参数也作为条件的一部分

2、javaweb-jdbc

什么是JDBC : Java连接数据库!



需要jar包的支持:

  • java.sql
  • javax.sql
  • mysql-conneter-java… 连接驱动(必须要导入)

实验环境搭建

CREATE TABLE users(
	id INT PRIMARY KEY,
	`name` VARCHAR(40),
	`password` VARCHAR(40),
	email VARCHAR(60),
	birthday DATE
);
INSERT INTO users(id,`name`,`password`,email,birthday)
VALUES(1,'张三','123456','zs@qq.com','2000-01-01');
INSERT INTO users(id,`name`,`password`,email,birthday)
VALUES(2,'李四','123456','ls@qq.com','2000-01-01');
INSERT INTO users(id,`name`,`password`,email,birthday)
VALUES(3,'王五','123456','ww@qq.com','2000-01-01');

SELECT * FROM users

导入数据库依赖

<!--mysql的驱动-->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.47</version>
</dependency>

IDEA中连接数据库:



JDBC 固定步骤:

  1. 加载驱动
  2. 连接数据库,代表数据库
  3. 向数据库发送SQL的对象Statement : CRUD
  4. 编写SQL (根据业务,不同的SQL)
  5. 执行SQL
  6. 关闭连接
public class TestJdbc {
	public static void main(String[] args) throws ClassNotFoundException,SQLException {
		//配置信息
		//useUnicode=true&characterEncoding=utf-8 解决中文乱码
		String url="jdbc:mysql://localhost:3306/jdbc?
		useUnicode=true&characterEncoding=utf-8";
		String username = "root";
		String password = "123456";
		//1.加载驱动
		Class.forName("com.mysql.jdbc.Driver");
		//2.连接数据库,代表数据库
		Connection connection = DriverManager.getConnection(url, username,password);
		//3.向数据库发送SQL的对象Statement,PreparedStatement : CRUD
		Statement statement = connection.createStatement();
		//4.编写SQL
		String sql = "select * from users";
		//5.执行查询SQL,返回一个 ResultSet : 结果集
		ResultSet rs = statement.executeQuery(sql);
		while (rs.next()){
		System.out.println("id="+rs.getObject("id"));
		System.out.println("name="+rs.getObject("name"));
		System.out.println("password="+rs.getObject("password"));
		System.out.println("email="+rs.getObject("email"));
		System.out.println("birthday="+rs.getObject("birthday"));
		}
		//6.关闭连接,释放资源(一定要做) 先开后关
		rs.close();
		statement.close();
		connection.close();
	}
}

预编译SQL

public class TestJDBC2 {
	public static void main(String[] args) throws Exception {
		//配置信息
		//useUnicode=true&characterEncoding=utf-8 解决中文乱码
		String url="jdbc:mysql://localhost:3306/jdbc?
		useUnicode=true&characterEncoding=utf-8";
		String username = "root";
		String password = "123456";
		//1.加载驱动
		Class.forName("com.mysql.jdbc.Driver");
		//2.连接数据库,代表数据库
		Connection connection = DriverManager.getConnection(url, username,		password);
		//3.编写SQL
		String sql = "insert into users(id, name, password, email,
		birthday) values (?,?,?,?,?);";
		//4.预编译
		PreparedStatement preparedStatement = 		connection.prepareStatement(sql);
		preparedStatement.setInt(1,2);//给第一个占位符? 的值赋值为1;
		preparedStatement.setString(2,"狂神说Java");//给第二个占位符? 的值赋值为		狂神说Java;
		preparedStatement.setString(3,"123456");//给第三个占位符? 的值赋值为		123456;
		preparedStatement.setString(4,"24736743@qq.com");//给第四个占位符? 的 		值赋值为1;
		preparedStatement.setDate(5,new Date(new
		java.util.Date().getTime()));//给第五个占位符? 的值赋值为new Date(new		java.util.Date().getTime());
		//5.执行SQL
		int i = preparedStatement.executeUpdate();
		if (i>0){
			System.out.println("插入成功@");
		}
		//6.关闭连接,释放资源(一定要做) 先开后关
		preparedStatement.close();
		connection.close();
	}
}

事务
要么都成功,要么都失败!
ACID原则:保证数据的安全。

开启事务
事务提交 commit()
事务回滚 rollback()
关闭事务
转账:
A:1000
B:1000
A(900) --100--> B(1100)

Junit单元测试
依赖

<!--单元测试-->
<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
</dependency>

简单使用
@Test注解只有在方法上有效,只要加了这个注解的方法,就可以直接运行!

@Test
public void test(){
	System.out.println("Hello");
}



失败的时候是红色:


相关推荐

Linux 路由三大件

Linux路由涉及到三大组成部分:路由表、路由策略和网络地址转换(NAT)。1.路由表(RoutingTable):...

linux的永久静态路由

永久静态路由(PermanentStaticRoute)是一种路由器属性,用于在特定的子网或网段内定义一个固定不变的路由。当路由器收到发送至该路由器的请求时,它会使用该路由器中保存的路由表来计算下...

Linux route命令详解和使用示例(查看和操作IP路由表)

在Linux系统中,设置路由通常是为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的IP地址设置为Linux机器的默认路由。要...

一文掌握linux系统路由跟踪指令traceroute

概述traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一...

没有公网IP,花生壳+SSH实现Windows连接远程Linux执行命令

在我们学习、工作中,常遇到需要使用Windows系统的电脑,来访问远程Linux系统进行相关部署操作,但远程Linux系统服务与本地Windows不在同一个局域网,而且Linux系统所在的外网IP是动...

打造你的家庭数据中心系列(三)PVE虚拟机安装爱快/iKuai软路由

一、软硬件要求1、安装好PVE虚拟环境的X86系统,32位爱快系统需要512MB以上内存,64位爱快系统需要4GB以上。...

OpenWrt路由器打造小型NAS服务(二):把家庭网络搬上云端(上)

家庭网络搬上云端意味着什么?通常我们在家里组建的局域网,离家之后就不能访问了。家庭网络上云,就意味着我们可以像访问百度一样,从Internet访问自己的家庭网络。这时我们可以做到:随时随地调校路由...

VMware安装openWRT软路由系统的步骤(图文教程)

本人是从众多媒体玩家的视频中无意了解到了软路由,它的功能非常强大,你想要的不想要的上面都有,重点是软路由可以安装到各种设备中(各种盒子、虚拟机、笔记本、x86设备、Arm设备),功能简直可以秒杀一切普...

一天一个Linux命令:网络管理(IP 地址配置)

方法一:使用nmcli命令nmcli介绍设备管理连接到设备断开设备连接设置网络连接配置静态IP连接配置IP方法二:使用ip命令...

Linux系统中的网络配置指南

在Linux系统中,正确的网络配置是确保系统顺利连接互联网和其他网络设备的关键。本文将为您介绍几个常用的Linux网络配置命令和技巧,帮助您更好地了解和配置网络设置。一、网络接口管理查看网络接口:使用...

Linux下的路由技术

在现代互联网环境中,网络服务的稳定性和可靠性至关重要。为了确保网络服务的高可用性和优化性能,Linux网络中的路由技术得到了广泛的应用。本文将介绍Linux下的路由技术,并提供相关的基础知识以及实践案...

LINUX 网络配置

【八】基本网络配置...

Linux进阶笔记-网络配置

本文档涵盖TCP/IP网络、网络管理和系统配置基础知识。Linux可以支持多个网络设备。设备名称已编号,从零开始向上计数。例如,具有两个NIC的计算机将有两个标记为eth0和eth1...

Linux-5种Linux系统下通过配置文件方式配置永久网络

1、SUSELinuxEnterpriseServer网络配置路径...

Linux添加路由的两种方法

在Linux中,您可以使用以下两种方法添加路由:使用"route"命令:使用"route"命令可以临时添加路由,这些路由在系统重新启动后将失效。下面是使用"ro...

取消回复欢迎 发表评论: