JDBC基础入门,常用操作大全!
相关插件以及源码均上传至云盘:
链接:https://pan.baidu.com/s/1oTatOzhGUNi0leLc3Dx22A
提取码:2c17
- Statement接口
由createStatement创建,用于发送简单的SQL语句(不带参数);存在SQL注入 - PreparedStatement
继承自Statement接口,由preparedStatement创建,用于发送含有一个或者多个输入参数的sql语句,PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入。一般都是用PreparedStatement; - CallableStatement
继承自PreparedStatement。由prePareCall创建,用于调用存储过程 - 常用的Statement方法
1 execute():运行语句,返回是否由结果集
2 executeQuery:运行select语句,返回ResultSet结果集
3 executeUpdate():运行insert/update/delete操作,返回更新的行数。
测试JDBC:
原表中存在一行数据:
package edu.hue.jk.mysql;
import java.lang.management.ManagementPermission;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
/**
* JDBC的基础使用!
* @author 超爱学习的可琛同学
*
*/
public class JdbcTest01 {
public static void main(String[] args) throws SQLException {
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
//建立连接
//3306为mysql特定端口 jdbctest为我创建的数据库名
//第一个root为用户名 第二个root 为密码
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "root");
String sql = "insert into tb_dept (user,pwd) values('admin','d123456');";
//存在SQL注入问题,一般都是用PreparedStatement类,
Statement statement = conn.createStatement();
statement.execute(sql);
}
}
可以看见数据成功插入到mysql中了
什么是SQL注入呢?
正常情况:我如果要删除id=1的数据:
若一些恶意用户这样输入呢?
这就很恐怖了 1=1 为true 执行后,必然我们数据库表直接清空!
这就是一个SQL注入简单的例子!
2.PreparedStatement
package edu.hue.jk.mysql;
import java.lang.management.ManagementPermission;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.PseudoColumnUsage;
import java.sql.SQLException;
import java.sql.Statement;
/**
* JDBC的基础使用!
* @author 超爱学习的可琛同学
*
*/
public class JdbcTest01 {
public static void main(String[] args) throws SQLException {
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
//建立连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "root");
String sql ="insert into tb_dept (user,pwd) values(?,?)";//?为占位符,由预处理机制,有效放置SQL注入;
PreparedStatement pStatement = conn.prepareStatement(sql);
// pStatement.setString(1, "admin");
// pStatement.setString(2, "123456");
// pStatement.execute();
//还可以直接用Object
pStatement.setObject(1, "achen");
pStatement.setObject(2, 654321);
pStatement.execute();
}
}
2.1ResultSet的使用 :返回一个结果集
package edu.hue.jk.mysql;
import java.lang.management.ManagementPermission;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.PseudoColumnUsage;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* JDBC的基础使用!
* ResultSet的使用
* @author 超爱学习的可琛同学
*
*/
public class JdbcTest02 {
static Connection conn = null;
static ResultSet resultSet = null;
static PreparedStatement pStatement = null;
public static void main(String[] args) throws SQLException {
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//建立连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "root");
String sql ="select * from tb_dept where id > ?";//?为占位符,由预处理机制,有效放置SQL注入;
pStatement = conn.prepareStatement(sql);
pStatement.setObject(1, 5);
resultSet = pStatement.executeQuery();//返回一个结果集
//存在下一行返回true 并且游标指向下一行
/*/
* ResultSet提供的检索不同类型字段的方法,常用的有:
* getString();获得在数据库里是varchar、char等数据类型的对象;
* getFloat();
* getDate();
* getBoolean();
*/
while(resultSet.next()) {
System.out.println(resultSet.getInt(1)+"--"+resultSet.getString(2)+"--"+resultSet.getString(3) );
}
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally {
//依序关闭 ResultSet->Statement ->Connection
if(resultSet != null) {
resultSet.close();
}
if(pStatement != null) {
pStatement.close();
}
if(conn != null) {
conn.close();
}
}
}
}
3.数据库中时间的处理
package edu.hue.jk.mysql;
import java.lang.management.ManagementPermission;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.PseudoColumnUsage;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
/**
* JDBC的基础使用!
*
* 时间的基本处理
* @author 超爱学习的可琛同学
*
*/
public class JdbcTest04 {
static Connection conn = null;
static Statement stms = null;
static PreparedStatement pStatement = null;
public static void main(String[] args) throws SQLException {
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//建立连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "root");
String sql = "insert into tb_dept (user,pwd,regTime,lastLoginTime) values(?,?,?,?)";
pStatement = conn.prepareStatement(sql);
pStatement.setObject(1, "admin");
pStatement.setObject(2, "admin");
pStatement.setDate(3, new java.sql.Date(System.currentTimeMillis()));
pStatement.setTimestamp(4, new Timestamp(System.currentTimeMillis()));
//如果需要插入指定日期可以使用calendar类或者是 dataformat 字符串转时间
pStatement.executeUpdate();
System.out.println("插入一行数据");
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally {
//依序关闭 ResultSet->Statement ->Connection
if(stms != null) {
stms.close();
}
if(conn != null) {
conn.close();
}
}
}
}
4.JDBC 批处理Batch :插入两万行数据
package edu.hue.jk.mysql;
import java.lang.management.ManagementPermission;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.PseudoColumnUsage;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
/**
* JDBC的基础使用!
* 批处理的基本使用
* PreparedStatement有预处理过程,处理批处理占用资源太大,所以用Statement
* @author 超爱学习的可琛同学
*
*/
public class JdbcTest03 {
static Connection conn = null;
static Statement stms = null;
public static void main(String[] args) throws SQLException {
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//建立连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "root");
conn.setAutoCommit(false);//这里设置手动提交事务
long start = System.currentTimeMillis();//开始时间
stms = conn.createStatement();
for(int i =0 ; i<20000;i++) {
java.sql.Date date = new java.sql.Date(System.currentTimeMillis());
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
stms.addBatch("insert into tb_dept (user,pwd,regTime,lastLoginTime) values ('user"+ i +"',123456,'"+date+"','"+timestamp
+"')");
}
stms.executeBatch();
conn.commit();//提交事务
long end = System.currentTimeMillis();//开始时间
System.out.println("插入20000行数据 ,耗时(毫秒):" + (end-start));
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally {
//依序关闭 ResultSet->Statement ->Connection
if(stms != null) {
stms.close();
}
if(conn != null) {
conn.close();
}
}
}
}

5.查询指定时间段的信息
package edu.hue.jk.mysql;
import java.lang.management.ManagementPermission;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.PseudoColumnUsage;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
/**
* JDBC的基础使用!
*
* 查询指定段时间信息
* @author 超爱学习的可琛同学
*
*/
public class JdbcTest05 {
static Connection conn = null;
static PreparedStatement pStatement = null;
static ResultSet resultSet = null;
public static long convertTime(String date) {
DateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
try {
return dFormat.parse(date).getTime();
} catch (ParseException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return 0;
}
public static void main(String[] args) throws SQLException {
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//建立连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "root");
pStatement = conn.prepareStatement( "select * from tb_dept where lastLoginTime > ? and lastLoginTime < ? ;");
java.sql.Date start = new java.sql.Date (convertTime("2019-7-19 10:29:00"));
java.sql.Date end = new java.sql.Date (convertTime("2019-7-20 10:29:00"));
pStatement.setObject(1, start);
pStatement.setObject(2, end);
resultSet = pStatement.executeQuery();
while (resultSet.next()) {
System.out.println(resultSet.getInt("Id")+"--"+resultSet.getString("user")+"--"+resultSet.getString("pwd")+"--"+resultSet.getTimestamp("lastLoginTime"));
}
System.out.println("插入一行数据");
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally {
//依序关闭 ResultSet->Statement ->Connection
if(conn != null) {
conn.close();
}
}
}
}
6.对JDBC进行简单的封装
package edu.hue.jk.mysql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 简单封装jdbc中加载驱动类和close方法
* @author Mr . Xu's PC
*
*/
public class JDBCUtil {
public static Connection getMySqlConnect() {
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "root");
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
//建立连接
return null;
}
public static void close(ResultSet resultSet,PreparedStatement pStatement,Connection conn) {
if(resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(pStatement != null) {
try {
pStatement.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
public static void close(PreparedStatement pStatement,Connection conn) {
if(pStatement != null) {
try {
pStatement.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
public static void close(Statement statement,Connection conn) {
if(statement != null) {
try {
statement.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
public static void close(Connection conn) {
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
6.2 资源文件properties处理JDBC连接信息
mysqlDriver=com.mysql.jdbc.Driver
mysqlURL=jdbc\:mysql://localhost\:3306/jdbctest
mysqlUser=root
mysqlPwd=root
oravleDriver=oracle.jdbc.driver.OracleDriver
oracleURL=jdbc:oracle:thin:@localhost:1521:orcl
oracleUser=scott
oraclePwd=tiger
package edu.hue.jk.mysql;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* 简单封装jdbc中加载驱动类和close方法
* @author 超爱学习的可琛同学
*
*/
public class JDBCUtil {
static Properties properties = null;//可以帮助读取和处理资源文件中的信息
static {//加载JDBCUtil时自动被调用
properties = new Properties();
try {
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
public static Connection getMySqlConnect() {
try {
//加载驱动类
Class.forName(properties.getProperty("mysqlDriver"));
return DriverManager.getConnection(properties.getProperty("mysqlURL"), properties.getProperty("mysqlUser"), properties.getProperty("mysqlPwd"));
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
//建立连接
return null;
}
public static void close(ResultSet resultSet,PreparedStatement pStatement,Connection conn) {
if(resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(pStatement != null) {
try {
pStatement.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
public static void close(PreparedStatement pStatement,Connection conn) {
if(pStatement != null) {
try {
pStatement.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
public static void close(Statement statement,Connection conn) {
if(statement != null) {
try {
statement.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
public static void close(Connection conn) {
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
package edu.hue.jk.mysql;
import java.lang.management.ManagementPermission;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.PseudoColumnUsage;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 测试JDBCUtil的使用
*
* @author 超爱学习的可琛同学
*
*/
public class TestJdbcUtil {
static Connection conn = null;
static ResultSet resultSet = null;
static PreparedStatement pStatement = null;
public static void main(String[] args) throws SQLException {
Connection connection = JDBCUtil.getMySqlConnect();
}
}
7 ORM原理,Map与List合作封装多条信息
基本思想:Map存键值对,再将map存入list
package edu.hue.jk.mysql;
/**
* 这是一个Javabean
* @author Mr . Xu's PC
*
*/
public class Emp {
private String uname;
private int age;
private double salary;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Emp [uname=" + uname + ", age=" + age + ", salary=" + salary + "]";
}
public Emp(String uname, int age, double salary) {
super();
this.uname = uname;
this.age = age;
this.salary = salary;
}
public Emp() {
super();
}
}
package edu.hue.jk.mysql;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* ORM:基本思想 用map键值对存 uname ,age等等,再将map存入list
* @author Mr . Xu's PC
*
*/
public class JdbcTestORM {
static PreparedStatement pStatement = null;
static ResultSet resultSet = null;
static Connection conn = null;
static List<Map<String, Object>> lists;
public static void main(String[] args) {
// TODO 自动生成的方法存根
conn = JDBCUtil.getMySqlConnect();
String sql = "select * from emp";
try {
lists = new ArrayList<>();
pStatement = conn.prepareStatement(sql);
resultSet = pStatement.executeQuery();
while (resultSet.next()) {
Map<String,Object> map = new HashMap<>();
map.put("uname", resultSet.getObject("uname"));
map.put("age", resultSet.getObject("age"));
map.put("salary", resultSet.getObject("salary"));
lists.add(map);
}
for(Map<String, Object> emp: lists) {
System.out.println(emp);
}
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}