1. jdbc阐述
- 程序->数据库驱动->数据库交互。。数据库驱动由数据库厂商提供
- jdbc:sun公司简化开发人员的(对数据库的统一)操作(多驱动操作不同数据库),提供一个(java操作数据库)规范
- 规范的实现是有厂商实现的,开发人员掌握jdbc的接口操作即可
- 架构中,没有什么是加一层解决不了的,如果解决不了那在加一层tomcat-nginx-lx
- 演变:程序->JDBC规范->DB驱动->DB交互,DB驱动由DB厂商提供
2. jdbc程序
- java.sql
- javax.sql
- 驱动包mysql-connector-java-8.0.15.jar
2.1 创建步骤
-
创建测试数据库
-
创建一个普通项目
-
导入数据库驱动,并点击add as library项目库
-
方式2:
-
编写测试代码
-
ssl报错是因为5.7.28以后的版本才真正支持ssl,但应用服务器没有提供验证所以出错,通过提供truststore或关闭ssl解决
-
注意时区&serverTimezone=UTC
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//链接数据库和用可视化工具一样
//引入驱动
//最新的使用规范变成了(com.mysql.cj.jdbc.Driver)
Class.forName("com.mysql.cj.jdbc.Driver"); //固定,加载驱动
//输入链接信息
//中文编码 字符集 安全链接
//useUnicode=true&characterEncoding=utf8&useSSL=true
String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC";
String user = "root";
String password = "123456";
//链接成功,返回sql对象 connection代表数据库
Connection connection = DriverManager.getConnection(url, user, password);
//执行sql对象,statement 执行sql代码,存在结果返回结果
Statement statement = connection.createStatement();
String sql = "SELECT * FROM `users`";
//查询是executeQuery
ResultSet resultSet = statement.executeQuery(sql); //返回结果集
while (resultSet.next()){
System.out.println("i"+resultSet.getObject("Name"));
}
//插入和更新,删除是executeUpdate
//释放链接
resultSet.close();
statement.close();
connection.close();
}
- 步骤总结:
-
- 加载驱动
- 链接信息
- 链接数据库Connection
- 创建执行对象statement
- 执行sql语句,返回结果ResultSet
- 关闭资源
2.2 所用对象
- DriverManager
//DriverManager.registerDriver(new Driver()); //之前的写法,new Driver()原方法已经注册执行,相当于执行两遍
Class.forName("com.mysql.cj.jdbc.Driver"); //固定,加载驱动
//链接成功,返回sql对象 connection代表数据库
Connection connection = DriverManager.getConnection(url, user, password);
//数据库级别可以设置自动提交、提交回滚
connection.setAutoCommit(true);
connection.commit();
connection.rollback();
- url
String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC";
//mysql
jdbc:mysql协议
jdbc:mysql://主机地址:端口号/DBNAME?参数1&参数2&参数3
//oracle 1521
jdbc:oracle:thin:@主机地址:端口号:sid
//oracle没数据库,都是表空间-数据库
- Statement SQL执行对象:
- 用于向数据库发送sql语句,若要完成对数据库的增删改查,只需通过这个对象向数据库发送增删改查即可
- statement.executeUpdate方法用于向数据库发送增删改的sql语句,executeUpdate执行完后,会返回一个整数(增删改语句导致的数据表几行数据发生变化)
- statement.executeQuery方法用于向数据库发送查询的sql语句,executeQuery方法返回代表查询结果的resultset对象
Statement statement = connection.createStatement();
statement.execute(""); //执行全部,有判断过程效率低
statement.executeQuery("");//查询返回结果集
statement.executeUpdate("");//增删该,返回受影响行数
statement.executeBatch(); //批处理
Statement statement = connection.createStatement();
String sql = "INSERT INTO `users`() VALUES()";
int num = statement.executeUpdate(sql);
if(num>0){
System.out.println("插入成功");
}
//删除、更新也是同样操作
- preparedStatement SQL执行预处理对象
PreparedStatement preparedStatement = connection.prepareStatement("");
- ResultSet
//使用方式1
resultSet.getObject("Name");//不知道数据库表中列具体类型
resultSet.getInt("");//得知数据库表中列具体类型
//遍历 resultSet--set
resultSet.beforeFirst(); //指针指向第一行
resultSet.afterLast(); //指针指向最后一行
resultSet.next();
resultSet.previous();//指针指向前一行
resultSet.absolute(1); //指针指向某一行
- 释放资源
resultSet.close();
statement.close();
connection.close(); //耗资源
2.3 jdbc工具类
- jdbc工具类:
- proterties文件作用:目的类属性和功能分离,方法就是配置文件+工具类
- proterties文件放src目录下,通过反射中类加载即可用文件明直接加载到,若放到项目下,则需要用路径
- jdbc插入i(nsert)数据时,要显示指明插入的字段名,即使是全部插入,也要写
#db.properties每句不加;号,否则反射无法加载这个配置文件
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
username=root
password=123456
public class JdbcUtils {
private static String driver = null;
private static String url = null;
private static String username = null;
private static String password = null;
static {
//db.properties配置文件放在src目录,可以直接读取到
//若放在项目包目录下,需要加路径
InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
try {
properties.load(in);
driver = properties.getProperty("driver");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
try {
//驱动只用加载一次
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, username, password);
}
public static void close(Connection connection, Statement statement, ResultSet resultSet){
//按顺序释放
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (statement!=null){
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
- 利用jdbc工具类进行crud操作
private static void insertMethod() {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
connection = JdbcUtils.getConnection();
statement = connection.createStatement();
String sql = "INSERT INTO `users`(`name`,`PASSWORD`,`email`,`birthday`) VALUES('李四','123456','123456789@163.com',NOW())";
int num = statement.executeUpdate(sql);
if(num>0){
System.out.println("插入成功");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JdbcUtils.close(connection,statement,resultSet);
}
}
2.4 sql注入问题
- sql存在漏洞:SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
- 本质就是破坏掉当前执行的sql语句的结构,sql会被拼接,or
public static void main(String[] args) {
selectMethod("' or '1=1","123456");
}
private static void selectMethod(String user,String password) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
connection = JdbcUtils.getConnection();
statement = connection.createStatement();
PreparedStatement preparedStatement = connection.prepareStatement("");
String sql = "SELECT * FROM `users` WHERE `NAME`='"+user+"' and `PASSWORD` = '"+password+"';";
ResultSet rs = statement.executeQuery(sql);
while (rs.next()){
System.out.println(rs.getString("name")+"===="+rs.getString("PASSWORD"));
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JdbcUtils.close(connection,statement,resultSet);
}
}
2.5 PreparedStatement对象
- 防止sql注入,效率更高
- PreparedStatement防止sql注入的本质将参数作为字符,用””包裹
- 遇到转义字符如’’则会转义掉
private static void insertMethod() {
Connection connection = null;
PreparedStatement pstm = null;
ResultSet resultSet = null;
try {
connection = JdbcUtils.getConnection();
//区别
//使用?作为占位符
String sql = "INSERT INTO `users`(`name`,`PASSWORD`,`email`,`birthday`) VALUES(?,?,?,?)";
//先写下面这个预编译的方法,上面的sql会提示
pstm = connection.prepareStatement(sql); //预编译,先写sql然后不执行
pstm.setString(1,"王五");
pstm.setString(2,"123456");
pstm.setString(3,"123456789@163.com");
//注意:sql.date 数据库支持的 java.sql.Date
// util.Date java new.Date.gettime() 获得时间戳
pstm.setDate(4,new Date(System.currentTimeMillis()));
boolean flag = pstm.execute(); //返回ResultSet为true,否则相反
int num = pstm.executeUpdate(); //受影响行数
if(num>0){
System.out.println("插入成功");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JdbcUtils.close(connection,pstm,resultSet);
}
}
private static void selectMethod2(String user,String password) {
Connection connection = null;
PreparedStatement pstm = null;
ResultSet resultSet = null;
try {
connection = JdbcUtils.getConnection();
//PreparedStatement防止sql注入的本质将参数作为字符,用""包裹
//遇到转义字符如''则会转义掉
String sql= "SELECT * FROM `users` WHERE `NAME`= ? and `PASSWORD` = ?;";
pstm = connection.prepareStatement(sql);
pstm.setString(1,user);
pstm.setString(2,password);
ResultSet rs = pstm.executeQuery();
while (rs.next()){
System.out.println(rs.getString("name")+"===="+rs.getString("PASSWORD"));
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JdbcUtils.close(connection,pstm,resultSet);
}
}
3. IDEA链接数据库
- 提前导入驱动包mysql-connector-java-8.0.15.jar
- 收合IDEA侧边栏
- 链接成功后,选择数据库
- 双击数据库
- 提交数据
- sql编辑器
- 控制台
- 切换数据库
- 存在的问题
4.事务
- 要么都成功,要么都失败
ACID原则
原子性:要么都成功,要么都失败
一致性:数据最终结果一致
隔离性:多进程不干扰
持久性:一旦提交,数据不变
- 隔离性导致的问题
- 脏读:读未提交
- 不可重复读:读被更新
- 幻读:读被新增删除
- 事物实现
- 关闭数据库自动提交,自动会开启事务connection.setAutoCommit(false); //开启事务
- 业务完毕提交事务 connection.commit();
- catch中用connection.rollback(); //如果失败就回滚(显示的)、不写也会回滚 (默认)
private static void insertMethod() {
Connection connection = null;
PreparedStatement pstm = null;
ResultSet resultSet = null;
try {
connection = JdbcUtils.getConnection();
//关闭数据库自动提交,自动会开启事务
connection.setAutoCommit(false); //开启事务
//区别
//使用?作为占位符
String sql = "INSERT INTO `users`(`name`,`PASSWORD`,`email`,`birthday`) VALUES(?,?,?,?)";
//先写下面这个预编译的方法,上面的sql会提示
pstm = connection.prepareStatement(sql); //预编译,先写sql然后不执行
pstm.setString(1,"王五");
pstm.setString(2,"123456");
pstm.setString(3,"123456789@163.com");
//注意:sql.date 数据库支持的 java.sql.Date
// util.Date java new.Date.gettime() 获得时间戳
pstm.setDate(4,new Date(System.currentTimeMillis()));
boolean flag = pstm.execute(); //返回ResultSet为true,否则相反
//业务完毕提交事务
connection.commit();
int num = pstm.executeUpdate(); //受影响行数
if(num>0){
System.out.println("插入成功");
}
} catch (SQLException throwables) {
try {
//不写也会回滚
connection.rollback(); //如果失败就回滚
} catch (SQLException e) {
e.printStackTrace();
}
throwables.printStackTrace();
}finally {
JdbcUtils.close(connection,pstm,resultSet);
}
}
5.数据库连接池#### 1. jdbc阐述
- 程序->数据库驱动->数据库交互。。数据库驱动由数据库厂商提供
- jdbc:sun公司简化开发人员的(对数据库的统一)操作(多驱动操作不同数据库),提供一个(java操作数据库)规范
- 规范的实现是有厂商实现的,开发人员掌握jdbc的接口操作即可
- 架构中,没有什么是加一层解决不了的,如果解决不了那在加一层tomcat-nginx-lx
- 演变:程序->JDBC规范->DB驱动->DB交互,DB驱动由DB厂商提供
2. jdbc程序
- java.sql
- javax.sql
- 驱动包mysql-connector-java-8.0.15.jar
2.1 创建步骤
- 创建测试数据库
- 创建一个普通项目
- 导入数据库驱动,并点击add as library项目库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IZdkUqyW-1651813848222)(E:\zkNote\typora-user-images\image-20220501000513789.png)]
- 方式2:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EjGB5p5Y-1651813848223)(E:\zkNote\typora-user-images\image-20220501232203507.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bQwZpOeI-1651813848224)(E:\zkNote\typora-user-images\image-20220501232245541.png)]
- 编写测试代码
- ssl报错是因为5.7.28以后的版本才真正支持ssl,但应用服务器没有提供验证所以出错,通过提供truststore或关闭ssl解决
- 注意时区&serverTimezone=UTC
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//链接数据库和用可视化工具一样
//引入驱动
//最新的使用规范变成了(com.mysql.cj.jdbc.Driver)
Class.forName("com.mysql.cj.jdbc.Driver"); //固定,加载驱动
//输入链接信息
//中文编码 字符集 安全链接
//useUnicode=true&characterEncoding=utf8&useSSL=true
String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC";
String user = "root";
String password = "123456";
//链接成功,返回sql对象 connection代表数据库
Connection connection = DriverManager.getConnection(url, user, password);
//执行sql对象,statement 执行sql代码,存在结果返回结果
Statement statement = connection.createStatement();
String sql = "SELECT * FROM `users`";
//查询是executeQuery
ResultSet resultSet = statement.executeQuery(sql); //返回结果集
while (resultSet.next()){
System.out.println("i"+resultSet.getObject("Name"));
}
//插入和更新,删除是executeUpdate
//释放链接
resultSet.close();
statement.close();
connection.close();
}
- 步骤总结:
-
- 加载驱动
- 链接信息
- 链接数据库Connection
- 创建执行对象statement
- 执行sql语句,返回结果ResultSet
- 关闭资源
2.2 所用对象
- DriverManager
//DriverManager.registerDriver(new Driver()); //之前的写法,new Driver()原方法已经注册执行,相当于执行两遍
Class.forName("com.mysql.cj.jdbc.Driver"); //固定,加载驱动
//链接成功,返回sql对象 connection代表数据库
Connection connection = DriverManager.getConnection(url, user, password);
//数据库级别可以设置自动提交、提交回滚
connection.setAutoCommit(true);
connection.commit();
connection.rollback();
- url
String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC";
//mysql
jdbc:mysql协议
jdbc:mysql://主机地址:端口号/DBNAME?参数1&参数2&参数3
//oracle 1521
jdbc:oracle:thin:@主机地址:端口号:sid
//oracle没数据库,都是表空间-数据库
- Statement SQL执行对象:
- 用于向数据库发送sql语句,若要完成对数据库的增删改查,只需通过这个对象向数据库发送增删改查即可
- statement.executeUpdate方法用于向数据库发送增删改的sql语句,executeUpdate执行完后,会返回一个整数(增删改语句导致的数据表几行数据发生变化)
- statement.executeQuery方法用于向数据库发送查询的sql语句,executeQuery方法返回代表查询结果的resultset对象
Statement statement = connection.createStatement();
statement.execute(""); //执行全部,有判断过程效率低
statement.executeQuery("");//查询返回结果集
statement.executeUpdate("");//增删该,返回受影响行数
statement.executeBatch(); //批处理
Statement statement = connection.createStatement();
String sql = "INSERT INTO `users`() VALUES()";
int num = statement.executeUpdate(sql);
if(num>0){
System.out.println("插入成功");
}
//删除、更新也是同样操作
- preparedStatement SQL执行预处理对象
PreparedStatement preparedStatement = connection.prepareStatement("");
- ResultSet
//使用方式1
resultSet.getObject("Name");//不知道数据库表中列具体类型
resultSet.getInt("");//得知数据库表中列具体类型
//遍历 resultSet--set
resultSet.beforeFirst(); //指针指向第一行
resultSet.afterLast(); //指针指向最后一行
resultSet.next();
resultSet.previous();//指针指向前一行
resultSet.absolute(1); //指针指向某一行
- 释放资源
resultSet.close();
statement.close();
connection.close(); //耗资源
2.3 jdbc工具类
- jdbc工具类:
- proterties文件作用:目的类属性和功能分离,方法就是配置文件+工具类
- proterties文件放src目录下,通过反射中类加载即可用文件明直接加载到,若放到项目下,则需要用路径
- jdbc插入i(nsert)数据时,要显示指明插入的字段名,即使是全部插入,也要写
#db.properties每句不加;号,否则反射无法加载这个配置文件
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
username=root
password=123456
public class JdbcUtils {
private static String driver = null;
private static String url = null;
private static String username = null;
private static String password = null;
static {
//db.properties配置文件放在src目录,可以直接读取到
//若放在项目包目录下,需要加路径
InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
try {
properties.load(in);
driver = properties.getProperty("driver");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
try {
//驱动只用加载一次
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, username, password);
}
public static void close(Connection connection, Statement statement, ResultSet resultSet){
//按顺序释放
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (statement!=null){
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
- 利用jdbc工具类进行crud操作
private static void insertMethod() {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
connection = JdbcUtils.getConnection();
statement = connection.createStatement();
String sql = "INSERT INTO `users`(`name`,`PASSWORD`,`email`,`birthday`) VALUES('李四','123456','123456789@163.com',NOW())";
int num = statement.executeUpdate(sql);
if(num>0){
System.out.println("插入成功");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JdbcUtils.close(connection,statement,resultSet);
}
}
2.4 sql注入问题
- sql存在漏洞:SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
- 本质就是破坏掉当前执行的sql语句的结构,sql会被拼接,or
public static void main(String[] args) {
selectMethod("' or '1=1","123456");
}
private static void selectMethod(String user,String password) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
connection = JdbcUtils.getConnection();
statement = connection.createStatement();
PreparedStatement preparedStatement = connection.prepareStatement("");
String sql = "SELECT * FROM `users` WHERE `NAME`='"+user+"' and `PASSWORD` = '"+password+"';";
ResultSet rs = statement.executeQuery(sql);
while (rs.next()){
System.out.println(rs.getString("name")+"===="+rs.getString("PASSWORD"));
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JdbcUtils.close(connection,statement,resultSet);
}
}
2.5 PreparedStatement对象
- 防止sql注入,效率更高
- PreparedStatement防止sql注入的本质将参数作为字符,用””包裹
- 遇到转义字符如’’则会转义掉
private static void insertMethod() {
Connection connection = null;
PreparedStatement pstm = null;
ResultSet resultSet = null;
try {
connection = JdbcUtils.getConnection();
//区别
//使用?作为占位符
String sql = "INSERT INTO `users`(`name`,`PASSWORD`,`email`,`birthday`) VALUES(?,?,?,?)";
//先写下面这个预编译的方法,上面的sql会提示
pstm = connection.prepareStatement(sql); //预编译,先写sql然后不执行
pstm.setString(1,"王五");
pstm.setString(2,"123456");
pstm.setString(3,"123456789@163.com");
//注意:sql.date 数据库支持的 java.sql.Date
// util.Date java new.Date.gettime() 获得时间戳
pstm.setDate(4,new Date(System.currentTimeMillis()));
boolean flag = pstm.execute(); //返回ResultSet为true,否则相反
int num = pstm.executeUpdate(); //受影响行数
if(num>0){
System.out.println("插入成功");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JdbcUtils.close(connection,pstm,resultSet);
}
}
private static void selectMethod2(String user,String password) {
Connection connection = null;
PreparedStatement pstm = null;
ResultSet resultSet = null;
try {
connection = JdbcUtils.getConnection();
//PreparedStatement防止sql注入的本质将参数作为字符,用""包裹
//遇到转义字符如''则会转义掉
String sql= "SELECT * FROM `users` WHERE `NAME`= ? and `PASSWORD` = ?;";
pstm = connection.prepareStatement(sql);
pstm.setString(1,user);
pstm.setString(2,password);
ResultSet rs = pstm.executeQuery();
while (rs.next()){
System.out.println(rs.getString("name")+"===="+rs.getString("PASSWORD"));
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JdbcUtils.close(connection,pstm,resultSet);
}
}
3. IDEA链接数据库
- 提前导入驱动包mysql-connector-java-8.0.15.jar
- 收合IDEA侧边栏
- 链接成功后,选择数据库
- 双击数据库
- 提交数据
- sql编辑器
- 控制台
- 切换数据库
- 存在的问题
4.事务
- 要么都成功,要么都失败
ACID原则
原子性:要么都成功,要么都失败
一致性:数据最终结果一致
隔离性:多进程不干扰
持久性:一旦提交,数据不变
- 隔离性导致的问题
- 脏读:读未提交
- 不可重复读:读被更新
- 幻读:读被新增删除
- 事物实现
- 关闭数据库自动提交,自动会开启事务connection.setAutoCommit(false); //开启事务
- 业务完毕提交事务 connection.commit();
- catch中用connection.rollback(); //如果失败就回滚(显示的)、不写也会回滚 (默认)
private static void insertMethod() {
Connection connection = null;
PreparedStatement pstm = null;
ResultSet resultSet = null;
try {
connection = JdbcUtils.getConnection();
//关闭数据库自动提交,自动会开启事务
connection.setAutoCommit(false); //开启事务
//区别
//使用?作为占位符
String sql = "INSERT INTO `users`(`name`,`PASSWORD`,`email`,`birthday`) VALUES(?,?,?,?)";
//先写下面这个预编译的方法,上面的sql会提示
pstm = connection.prepareStatement(sql); //预编译,先写sql然后不执行
pstm.setString(1,"王五");
pstm.setString(2,"123456");
pstm.setString(3,"123456789@163.com");
//注意:sql.date 数据库支持的 java.sql.Date
// util.Date java new.Date.gettime() 获得时间戳
pstm.setDate(4,new Date(System.currentTimeMillis()));
boolean flag = pstm.execute(); //返回ResultSet为true,否则相反
//业务完毕提交事务
connection.commit();
int num = pstm.executeUpdate(); //受影响行数
if(num>0){
System.out.println("插入成功");
}
} catch (SQLException throwables) {
try {
//不写也会回滚
connection.rollback(); //如果失败就回滚
} catch (SQLException e) {
e.printStackTrace();
}
throwables.printStackTrace();
}finally {
JdbcUtils.close(connection,pstm,resultSet);
}
}
- 数据库连接池部分请见本专栏下一篇常用的数据库连接池使用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123956.html