首先,准备工作是要建立好一个数据库叫test,里面有一张t_user的表。
然后在IDEA环境中加载mysql-java-80.0.12.jar包。
首先连接数据库。
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC","root","password");
下面是这么写的原因:
当然,这里的表名还有其他的参数,建议放在一个.properities配置文件中,这样修改比较简单。注意,配置文件要和你写的代码在同一级目录下,不然会搜索不到。
连接上之后就是要考虑如何操作数据库。
分三块来讲,第一块是直接操作,第二块是批操作,第三块是事物。
首先是直接操作,很简单,用两个类。
第一个是Statement,这个类的作用可以理解为用java语言调用SQL语句,使用用法如下。
Statement stmt = conn.createStatement();
String sql = "select * from t_user"//任意的SQL语句
stmt.execute(sql);
这就运行了,但是有个什么毛病呢。会产生SQL注入问题,就是我们不建议用字符串拼接的方式来完善SQL语句,而应该用含有占位符的语句。
这么说你可能不清楚是什么意思。那我们将采用第二个类。
PreparedStatement。这个类允许在SQL语句中用?作为占位符,然后在后面的语句中填空。用法如下:
sql = "insert into t_user (username,pwd) values (?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
//下面可以对问号赋值,注意,数字代表是第几个问号,从1开始
ps.setString(1,'java');
ps.setObject(2,"Better_than_Cpp");
//这里的setXxx代表为用什么样的类型存储。
ps.execute();
我们程序员经常要用到的就是增删改查,特别是查表。在MySQL的命令窗口输入查询,返回的是张表,那在Java中怎么查询呢?
于是就有了Resultset,这个类用于存储返回的数据。这个类类似于迭代器,可以用.next()进行遍历,这个遍历是一条记录一条记录的遍历。用GetXxx方法可以查询记录中每个字段的值。
二,批操作
批操作在1的基础上改一改就行了。
首先要把事务提交改成手动提交。
conn.setAutoCommit(false);//这个默认是true,要改成false
也很好理解,如果自动提交了,那你的所有SQL语句不就全部提交了么,而我们的要求是打包在一起然后一起执行。
conn.setAutoCommit(false);
stmt = conn.createStatement();
for(int i=0;i<2000;i++){//添加批任务
stmt.addBatch("insert into t_user (username,pwd) values ('huang" + i +"',666666)");
}
stmt.executeBatch();//批执行
conn.commit();//提交任务
三,事务
conn.setAutoCommit(false);//默认自动提交
String sql = "insert into t_user (username,pwd) values (?,?)";
ps = conn.prepareStatement(sql);
ps.setObject(1,"魏璎珞");
ps.setObject(2,"guifeibixusi");
ps.execute();
sql = "insert into t_user (username,pwd) values (?,?)";
ps1 = conn.prepareStatement(sql);
ps1.setObject(1,"高贵妃");
ps1.setObject(2,"weiyingluobixusi");
ps1.execute();
conn.commit();
在commit之前的所有操作都保存在内存中,只有到了commit才更新表单,否则不修改。如果失败了,在异常处理中conn.rollback进行回退。
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
下面给出我写的一些小例子:
package com.njust.MyJDBC;
import java.sql.*;
public class ConnectJDBC {
public static void main(String[] args){
Connection conn = null;
Statement stmt = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC","root","08173237eerrtt");
stmt = conn.createStatement();
String sql = "SELECT * FROM t_user";
stmt.execute(sql);
sql = "insert into t_user (username,pwd) values (?,?)";
ps = conn.prepareStatement(sql);
ps.setString(1,"Java");
ps.setObject(2,"Better_than_Cpp");
System.out.println("插入一条消息");
int count = ps.executeUpdate();//返回值是更新的条目数量
System.out.println(count);
sql = "SELECT id,username,pwd FROM t_user where id>?";//用于查询
ps = conn.prepareStatement(sql);
ps.setObject(1,3);
rs = ps.executeQuery();
while(rs.next()){
System.out.println(rs.getInt(1)+"-----"+rs.getObject(2) + "------" + rs.getObject(3));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
finally {
//这里的异常的try_catch必须分开用,以防止后面的不关闭
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps!=null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
package com.njust.MyJDBC;
import java.sql.*;
public class Transaction {
public static void main(String[] args){
Connection conn = null;
Statement stmt = null;
PreparedStatement ps = null;
PreparedStatement ps1 = null;
ResultSet rs = null;
try {
//加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC","root","08173237eerrtt");
conn.setAutoCommit(false);//默认自动提交
String sql = "insert into t_user (username,pwd) values (?,?)";
ps = conn.prepareStatement(sql);
ps.setObject(1,"魏璎珞");
ps.setObject(2,"guifeibixusi");
ps.execute();
sql = "insert into t_user (username,pwd) values (?,?)";
ps1 = conn.prepareStatement(sql);
ps1.setObject(1,"高贵妃");
ps1.setObject(2,"weiyingluobixusi");
ps1.execute();
conn.commit();
} catch (ClassNotFoundException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
finally {
//这里的异常的try_catch必须分开用,以防止后面的不关闭
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps!=null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}