JAVA中的JDBD(MYSQL)

目录

零、码仙励志

一、基本准备

二、连接数据库

1.建立连接

2.Statement接口的用法

3.PreparedStatement的基本用法

4.ResultSet结果集的基本用法

5.关闭连接

6.批处理的基本用法

7.事务的基本用法

8.插入不同格式的时间

9.取出指定时间段的数据

10.CLOB文本大对象的使用

11.BLOB二进制大对象的使用


零、码仙励志

永不言败,是成功者的最佳品格

一、基本准备

首先先新建一个Java Project项目,我这里名字叫做jdbc。

JAVA中的JDBD(MYSQL)_第1张图片

接着给项目添加MYSQL驱动

没有驱动的去下面地址下载,要与你的MYSQL版本对应

https://mvnrepository.com/artifact/mysql/mysql-connector-java

JAVA中的JDBD(MYSQL)_第2张图片

JAVA中的JDBD(MYSQL)_第3张图片

JAVA中的JDBD(MYSQL)_第4张图片

到这里准备工作就做好了

二、连接数据库

1.建立连接

首先新建一个数据库,我的数据库的名字叫做testjdbc

然后在eclipse中运行下面代码

package maxian.com.jdbdtest;

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

public class Demo1 {

	public static void main(String[] args) {
		try {
			// 加载驱动类
			Class.forName("com.mysql.jdbc.Driver");
			// 建立连接
			Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "root");
			System.out.println(conn);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

出现下面内容说明成功

2.Statement接口的用法

首先在数据库中建立一张表,我的表的名字叫user1

我一共建立了三个字段,其中id是自增的

我给表中存放了一些数据

JAVA中的JDBD(MYSQL)_第5张图片

然后运行下面代码

package maxian.com.jdbdtest;

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

public class Demo2 {

	public static void main(String[] args) {
		try {
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "root");
			Statement stmt = conn.createStatement();
			String name = "赵六";
			String sql = "insert into user1 (name,pwd) values ('" + name + "',66666)";
			stmt.execute(sql);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}

数据表里就会增加一条记录

JAVA中的JDBD(MYSQL)_第6张图片

看起来很完美,但是会有SQL注入的危险,比如:

package maxian.com.jdbdtest;

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

public class Demo2 {

	public static void main(String[] args) {
		try {
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "root");
			Statement stmt = conn.createStatement();
			String id = "5 or 1=1 ";
			String sql = "delete from user1 where id="+id;
			stmt.execute(sql);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}

原本我只想删除id为5的记录,但是因为传入的数据有问题,结果导致整张表的数据全部被删除了,后面会解决这个问题。

3.PreparedStatement的基本用法

因为刚才表里的数据都没有了,我干脆再重新建立一个表user2

运行下面代码

package maxian.com.jdbdtest;

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

public class Demo3 {

	public static void main(String[] args) {
		try {
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "root");

			String sql = "insert into user2 (name,pwd,regTime) values(?,?,?)"; // ?占位符
			PreparedStatement ps = conn.prepareStatement(sql);

			// 参数索引是从1开始计算, 而不是0
			ps.setString(1, "张三");
			ps.setString(2, "123456");
			ps.setDate(3, new java.sql.Date(System.currentTimeMillis()));

			// 也可以使用setObject方法处理参数
			// 如果同时执行,只会执行下面的
			// ps.setObject(1, "张三");
			// ps.setObject(2, "123456");
			// ps.setObject(3, new java.sql.Date(System.currentTimeMillis()));

			// ps.execute(); 返回true或者false
			int count = ps.executeUpdate(); // 返回执行的记录数
			System.out.println(count);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}

 因为我运行了多次,所以有多次记录

JAVA中的JDBD(MYSQL)_第7张图片

4.ResultSet结果集的基本用法

还是新建一张表,叫user3

JAVA中的JDBD(MYSQL)_第8张图片

package maxian.com.jdbdtest;

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

public class Demo4 {

	public static void main(String[] args) {
		try {
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "root");

			String sql = "select id,name,pwd,regTime from user3 where id

JAVA中的JDBD(MYSQL)_第9张图片

5.关闭连接

有了上面的知识,基本上可以对数据库进行一些简单的增删改查的操作了,但是上面的连接没有关闭,会浪费内存资源,所以这里关闭一下,关闭的顺序是后打开的先关闭。我这里还用上面的代码演示。

package maxian.com.jdbdtest;

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

public class Demo4 {

	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "root");

			String sql = "select id,name,pwd,regTime from user3 where idstatment-->connection这样的关闭顺序!
			// 一定要将三个trycatch块,分开写!因为这样其中一个没有关闭,不会影响下面的。
			try {
				if (rs != null) {
					rs.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if (ps != null) {
					ps.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}

		}
	}

}

6.批处理的基本用法

还是新建一张表,叫user4

运行下面代码

package maxian.com.jdbdtest;

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

public class Demo5 {
	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/testjdbc", "root", "root");

			conn.setAutoCommit(false); // 设为手动提交
			long start = System.currentTimeMillis();

			stmt = conn.createStatement();
			for (int i = 0; i < 20000; i++) {
				stmt.addBatch("insert into user4 (name,pwd,regTime) values ('maxian" + i + "',666666,now())");
			}
			stmt.executeBatch();
			conn.commit(); // 提交事务

			long end = System.currentTimeMillis();
			System.out.println("插入20000条数据,耗时(毫秒):" + (end - start));
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

JAVA中的JDBD(MYSQL)_第10张图片

7.事务的基本用法

还是新建一张表,叫user5

package maxian.com.jdbdtest;

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

public class Demo6 {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps1 = null;
		PreparedStatement ps2 = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "root");

			conn.setAutoCommit(false); // JDBC中默认是true,自动提交事务

			// 运行这条语句,俩条记录都会保存在数据表里
			ps1 = conn.prepareStatement("insert into user5 (name,pwd) values (?,?)");
			// 运行这条语句,俩条记录都不会保存在数据表里
			// ps1 = conn.prepareStatement("insert into user5 (name,pwd) values (?,?,?)");

			ps1.setObject(1, "码仙");
			ps1.setObject(2, "123456");
			ps1.execute();
			System.out.println("插入一个用户,码仙");

			try {
				Thread.sleep(6000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

			ps2 = conn.prepareStatement("insert into user5 (name,pwd) values (?,?)");
			ps2.setObject(1, "张三");
			ps2.setObject(2, "123456");
			ps2.execute();
			System.out.println("插入一个用户,张三");

			conn.commit(); // 提交事务
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			try {
				conn.rollback(); // 回滚
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (ps1 != null) {
					ps1.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if (ps2 != null) {
					ps2.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

8.插入不同格式的时间

还是新建一张表,叫user6

package maxian.com.jdbdtest;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Random;

public class Demo7 {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "root");

			for (int i = 0; i < 1000; i++) { // 插入1000条记录

				ps = conn.prepareStatement("insert into user6 (name,pwd,regTime,lastLoginTime) values (?,?,?,?)");
				ps.setObject(1, "码仙" + i);
				ps.setObject(2, "123456");

				// 为了下面随机生成时间
				int rand = 100000000 + new Random().nextInt(1000000000);

				java.sql.Date date = new java.sql.Date(System.currentTimeMillis() - rand);
				// 如果需要插入指定日期,可以使用Calendar、DateFormat
				Timestamp stamp = new Timestamp(System.currentTimeMillis() - rand);

				ps.setDate(3, date);
				ps.setTimestamp(4, stamp);
				ps.execute();
			}
			System.out.println("插入数据完毕");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (ps != null) {
					ps.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

 JAVA中的JDBD(MYSQL)_第11张图片

9.取出指定时间段的数据

这里用的是user6(上面的表)里面的数据

package maxian.com.jdbdtest;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Demo8 {

	/**
	 * 将字符串代表的日期转为long数字(格式:yyyy-MM-dd hh:mm:ss)
	 * @param dateStr
	 * @return
	 */
	public static long str2Date(String dateStr) {
		DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		try {
			return format.parse(dateStr).getTime();
		} catch (ParseException e) {
			e.printStackTrace();
			return 0;
		}
	}

	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "root");
/*
			 ps = conn.prepareStatement("select * from user6 where regTime>? and regTime? and lastLoginTime

JAVA中的JDBD(MYSQL)_第12张图片

10.CLOB文本大对象的使用

TEXT:65535字节
MEDIUMTEXT:16777215字节
LONGTEXT:4294967295字节

还是新建一张表,叫user7

将文件内容插入到数据库中

package maxian.com.jdbdtest;

import java.io.File;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Demo9_1 {

	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;

		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "root");

			ps = conn.prepareStatement("insert into user7 (name,text) values (?,?)");
			ps.setString(1, "码仙");
			// 将文本文件内容直接输入到数据库中
			ps.setClob(2, new FileReader(new File("D:/a.txt")));

			ps.execute();

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (ps != null) {
					ps.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

将字符串插入到数据库中

package maxian.com.jdbdtest;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Demo9_2 {

	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;

		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "root");

			ps = conn.prepareStatement("insert into user7 (name,text) values (?,?)");
			ps.setString(1, "码仙");
			// 将程序中的字符串输入到数据库的CLOB字段中
			ps.setClob(2, new BufferedReader(new InputStreamReader(new ByteArrayInputStream("aaaabbbbbb".getBytes()))));

			ps.execute();

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (ps != null) {
					ps.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

JAVA中的JDBD(MYSQL)_第13张图片

将CLOB字段值取出来

package maxian.com.jdbdtest;

import java.io.Reader;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 将CLOB字段值取出来的操作。
 */
public class Demo9_3 {

	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		Reader r = null;
		StringBuffer sb = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "root");

			ps = conn.prepareStatement("select * from user7 where id=?");
			ps.setObject(1, 1);

			rs = ps.executeQuery();
			sb = new StringBuffer();
			while (rs.next()) {
				Clob c = rs.getClob("text");
				r = c.getCharacterStream();
				int temp = 0;
				while ((temp = r.read()) != -1) {
					sb.append((char) temp);
				}
			}
			
			System.out.println(sb.toString());
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (r != null) {
					r.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
			try {
				if (rs != null) {
					rs.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
			try {
				if (ps != null) {
					ps.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

JAVA中的JDBD(MYSQL)_第14张图片

11.BLOB二进制大对象的使用

TINYBLOB:0-255字节
BLOB:0-65535字节
MEDIUMBLOB:0-16777215字节
LONGBLOB:0-4294967295字节

还是新建一张表,叫user8

把图片插入到数据库

package maxian.com.jdbdtest;

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Demo10_1 {

	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "root");

			ps = conn.prepareStatement("insert into user8 (name,headImg) values (?,?) ");
			ps.setString(1, "码仙");
			ps.setBlob(2, new FileInputStream("D:/hui.jpg"));
			ps.execute();

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (ps != null) {
					ps.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

JAVA中的JDBD(MYSQL)_第15张图片

把图片从数据库中取出来

package maxian.com.jdbdtest;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Demo10_2 {

	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		InputStream is = null;
		OutputStream os = null;
		try {
			// 加载驱动类
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "root");

			ps = conn.prepareStatement("select * from user8 where id=?");
			ps.setObject(1, 1);

			rs = ps.executeQuery();
			while (rs.next()) {
				Blob b = rs.getBlob("headImg");
				is = b.getBinaryStream();
				os = new FileOutputStream("D:/a.jpg");
				int temp = 0;
				while ((temp = is.read()) != -1) {
					os.write(temp);
				}
			}

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (is != null) {
					is.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
			try {
				if (os != null) {
					os.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
			try {
				if (rs != null) {
					rs.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if (ps != null) {
					ps.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

本篇博客来自于传智播客视频教程的总结以及笔记的整理,仅供学习交流,切勿用于商业用途,如有侵权,请联系博主删除,博主QQ:194760901

你可能感兴趣的:(Javase)