目录
零、码仙励志
一、基本准备
二、连接数据库
1.建立连接
2.Statement接口的用法
3.PreparedStatement的基本用法
4.ResultSet结果集的基本用法
5.关闭连接
6.批处理的基本用法
7.事务的基本用法
8.插入不同格式的时间
9.取出指定时间段的数据
10.CLOB文本大对象的使用
11.BLOB二进制大对象的使用
永不言败,是成功者的最佳品格
首先先新建一个Java Project项目,我这里名字叫做jdbc。
接着给项目添加MYSQL驱动
没有驱动的去下面地址下载,要与你的MYSQL版本对应
https://mvnrepository.com/artifact/mysql/mysql-connector-java
到这里准备工作就做好了
首先新建一个数据库,我的数据库的名字叫做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();
}
}
}
出现下面内容说明成功
首先在数据库中建立一张表,我的表的名字叫user1
我一共建立了三个字段,其中id是自增的
我给表中存放了一些数据
然后运行下面代码
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();
}
}
}
数据表里就会增加一条记录
看起来很完美,但是会有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的记录,但是因为传入的数据有问题,结果导致整张表的数据全部被删除了,后面会解决这个问题。
因为刚才表里的数据都没有了,我干脆再重新建立一个表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();
}
}
}
因为我运行了多次,所以有多次记录
还是新建一张表,叫user3
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";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, 4); // 把id小于4的记录都取出来
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt(1) + "--" + rs.getString(2) + "--" + rs.getObject(3) + "--" + rs.getDate(4));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
有了上面的知识,基本上可以对数据库进行一些简单的增删改查的操作了,但是上面的连接没有关闭,会浪费内存资源,所以这里关闭一下,关闭的顺序是后打开的先关闭。我这里还用上面的代码演示。
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 id";
ps = conn.prepareStatement(sql);
ps.setInt(1, 4); // 把id小于4的记录都取出来
rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt(1) + "--" + rs.getString(2) + "--" + rs.getObject(3) + "--" + rs.getDate(4));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 遵循:resultset-->statment-->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();
}
}
}
}
还是新建一张表,叫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();
}
}
}
}
还是新建一张表,叫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();
}
}
}
}
还是新建一张表,叫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();
}
}
}
}
这里用的是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");
java.sql.Date start = new java.sql.Date(str2Date("2019-1-22 10:23:45"));
java.sql.Date end = new java.sql.Date(str2Date("2019-1-25 10:23:45"));
ps.setObject(1, start);
ps.setObject(2, end);
*/
ps = conn.prepareStatement("select * from user6 where lastLoginTime>? and lastLoginTime order by lastLoginTime ");
Timestamp start = new Timestamp(str2Date("2019-1-22 10:23:45"));
Timestamp end = new Timestamp(str2Date("2019-1-25 10:23:45"));
ps.setObject(1, start);
ps.setObject(2, end);
rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("name") + "--" + rs.getDate("regTime") + "--" + rs.getTimestamp("lastLoginTime"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
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();
}
}
}
}
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();
}
}
}
}
将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();
}
}
}
}
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();
}
}
}
}
把图片从数据库中取出来
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