首先声明,本文只给出代码,并不是做教程用,如有不便之处,还请各位见谅。

  PreparedStatement相较于Statement,概括来说,共有三个优势:

  1. 代码的可读性和易维护性:PreparedStatement不需要像Statement那样拼接sql语句,而是用?代替,再对其进行赋值,代码简洁易懂,一目了然。

  2. 预编译及DB的缓存过程,使得PreparedStatement在效率上高于Statement。

  3. 防止SQL注入(这个不太懂,先这样写着吧)

  之前在使用Statement时提过,jdbc的过程大致分为6步(也可以说是7步):注册驱动、建立连接、创建Statement、定义SQL语句、执行SQL语句(如有结果集还需遍历)、关闭连接。PreparedStatement和Statement过程大致相当,不同之处在于,先定义SQL语句,再创建PreparedStatement,再设置参数。总结起来,过程如下:

  1. // 1. 注册驱动
  2. // 2. 建立连接
  3. // 3. 定义sql
  4. // 4. 创建PreparedStatement
  5. // 5. 设置参数
  6. // 6. 执行sql,如果有结果集需遍历并获取
  7. // 7. 关闭资源

  下面给出PreparedStatement进行CRUD的代码。

  1. package com.colin.dao;
  2.  
  3. import com.colin.bean.User;
  4. import com.colin.util.DBUtil;
  5.  
  6. import java.sql.*;
  7. import java.util.*;
  8.  
  9. public class PreparedjdbcTest {
  10.  
  11. /**
  12. * 插入一条新记录_PreparedStatement
  13. * @param id id 主键
  14. * @param name 姓名
  15. * @param age 年龄
  16. * @throws SQLException
  17. */
  18. public static void insert(int id, String name, int age) throws SQLException {
  19. long starttime = System.currentTimeMillis();
  20.  
  21. PreparedStatement preparedStatement = null;
  22. Connection connection = null;
  23. try {
  24. // 1. 注册驱动
  25. // 2. 建立连接
  26. connection = DBUtil.getConnection();
  27. // 3. 定义sql——?是占位符,在设置参数部分会被替换掉
  28. String sql = "insert into user(id, name, age) values(?, ?, ?)";
  29. // 4. 创建PreparedStatement
  30. preparedStatement = connection.prepareStatement(sql);
  31. // 5. 设置参数
  32. preparedStatement.setInt(1, id);
  33. preparedStatement.setString(2, name);
  34. preparedStatement.setInt(3, age);
  35. // 6. 执行sql,如果有结果集需遍历并获取
  36. int affectrows = preparedStatement.executeUpdate();
  37. System.out.println("affectrows : " + affectrows);
  38. } finally {
  39. // 7. 关闭资源
  40. DBUtil.closeAll(preparedStatement, connection);
  41. }
  42.  
  43. System.out.println("总用时: " + (System.currentTimeMillis() - starttime));
  44. }
  45.  
  46. /**
  47. * 修改一条记录
  48. * @param id
  49. * @param name
  50. * @param age
  51. * @throws SQLException
  52. */
  53. public static void update(int id, String name, int age) throws SQLException {
  54. long starttime = System.currentTimeMillis();
  55.  
  56. PreparedStatement preparedStatement = null;
  57. Connection connection = null;
  58. try {
  59. connection = DBUtil.getConnection();
  60. String sql = "update user set name = ?, age = ? where id = ?";
  61. preparedStatement = connection.prepareStatement(sql);
  62. preparedStatement.setInt(3, id);
  63. preparedStatement.setString(1, name);
  64. preparedStatement.setInt(2, age);
  65. int affectrows = preparedStatement.executeUpdate();
  66. System.out.println("affectrows : " + affectrows);
  67. } finally {
  68. DBUtil.closeAll(preparedStatement, connection);
  69. }
  70.  
  71. System.out.println("总用时 : " + (System.currentTimeMillis() - starttime));
  72.  
  73. }
  74.  
  75. /**
  76. * 删除一条记录
  77. * @param id
  78. * @throws SQLException
  79. */
  80. public static void delete(int id) throws SQLException {
  81. long starttime = System.currentTimeMillis();
  82.  
  83. PreparedStatement preparedStatement = null;
  84. Connection connection = null;
  85. try {
  86. connection = DBUtil.getConnection();
  87. String sql = "delete from user where id = ?";
  88. preparedStatement = connection.prepareStatement(sql);
  89. preparedStatement.setInt(1, id);
  90. int affectrows = preparedStatement.executeUpdate();
  91. System.out.println("affectrows : " + affectrows);
  92. } finally {
  93. DBUtil.closeAll(preparedStatement, connection);
  94. }
  95.  
  96. System.out.println("总用时 : " + (System.currentTimeMillis() - starttime));
  97. }
  98.  
  99. /**
  100. * 查询一条记录
  101. * @param id
  102. * @throws SQLException
  103. */
  104. public static List<User> selectOne(int id) throws SQLException {
  105.  
  106. List<User> userList = new ArrayList<>();
  107.  
  108. ResultSet resultSet = null;
  109. PreparedStatement preparedStatement = null;
  110. Connection connection = null;
  111. try {
  112. // 1. 注册驱动,建立连接
  113. connection = DBUtil.getConnection();
  114. // 2. 定义SQL
  115. String sql = "SELECT id, name, age FROM user WHERE id = ?";
  116. // 3. 创建PreparedStatement
  117. preparedStatement = connection.prepareStatement(sql);
  118. preparedStatement.setInt(1, id);
  119. resultSet = preparedStatement.executeQuery();
  120. while (resultSet.next()) {
  121. User user = new User(
  122. resultSet.getInt("id"),
  123. resultSet.getString("name"),
  124. resultSet.getInt("age")
  125. );
  126. userList.add(user);
  127. }
  128. } finally {
  129. DBUtil.closeAll(resultSet, preparedStatement, connection);
  130. }
  131.  
  132. return userList;
  133. }
  134.  
  135. /**
  136. * 查询所有记录
  137. * @throws SQLException
  138. */
  139. public static List<User> selectAll() throws SQLException {
  140.  
  141. List<User> userList = new ArrayList<>();
  142.  
  143. ResultSet resultSet = null;
  144. PreparedStatement preparedStatement = null;
  145. Connection connection = null;
  146. try {
  147. // 1. 注册驱动,建立连接
  148. connection = DBUtil.getConnection();
  149. // 2. 定义SQL
  150. String sql = "SELECT id, name, age FROM user";
  151. // 3. 创建PreparedStatement
  152. preparedStatement = connection.prepareStatement(sql);
  153. resultSet = preparedStatement.executeQuery();
  154. while (resultSet.next()) {
  155. User user = new User(
  156. resultSet.getInt("id"),
  157. resultSet.getString("name"),
  158. resultSet.getInt("age")
  159. );
  160. userList.add(user);
  161. }
  162. } finally {
  163. DBUtil.closeAll(resultSet, preparedStatement, connection);
  164. }
  165.  
  166. return userList;
  167. }
  168.  
  169. public static void main(String[] args) throws SQLException {
  170.  
  171. // insert(10,"pestmtName",7);
  172. // update(10, "pestmtName2", 8);
  173. // delete(8);
  174.  
  175. // List<User> userList = selectOne(1);
  176. List<User> userList = selectAll();
  177. System.out.println(userList);
  178.  
  179. }
  180. }

——————————补充:关于增删改的自动提交和手动提交————————————

  JDBC中当发生使用DML语言(主要是insert update和delete)时,默认是自动提交的,当然也可以设成手动提交。手动提交需要如下代码(放在获取连接之后):

  1. connection.setAutoCommit(false);

  此外,在执行完SQL语句,即preparedStatement.executeXXX()时,需要connection.commit()。需要补充的代码较多,以一个手动提交的insert方法为例:

  1. public static void insert(int id, String name, int age) {
  2.  
  3. Connection connection = null;
  4. PreparedStatement preparedStatement = null;
  5.  
  6. try {
  7.  
  8. connection = DBUtil.getConnection();
  9. connection.setAutoCommit(false);
  10. String sql = "insert into user(id, name, age) values(?, ?, ?)";
  11. preparedStatement = connection.prepareStatement(sql);
  12. preparedStatement.setInt(1, id);
  13. preparedStatement.setString(2, name);
  14. preparedStatement.setInt(3, age);
  15.  
  16. int affectrows = preparedStatement.executeUpdate();
  17. System.out.println("affectrows : " + affectrows);
  18.  
  19. // 提交前如果发生异常,如throw new RuntimeException()怎么办?回滚
  20. connection.commit();
  21.  
  22. } catch (SQLException e) {
  23. e.printStackTrace();
  24. } catch (Exception e) {
  25. try {
  26. // 别忘了判断connection非空
  27. if (connection != null) {
  28. connection.rollback();
  29. }
  30. } catch (SQLException e1) {
  31. e1.printStackTrace();
  32. }
  33. e.printStackTrace();
  34. } finally {
  35. DBUtil.closeAll(preparedStatement, connection);
  36. }
  37.  
  38. }

  完毕。

  

jdbc笔记(二) 使用PreparedStatement对单表的CRUD操作的更多相关文章

  1. jdbc笔记(一) 使用Statement对单表的CRUD操作

    jdbc连接mysql并执行简单的CRUD的步骤: 1.注册驱动(需要抛出/捕获异常) Class.forName("com.mysql.jdbc.Driver"); 2.建立连接 ...

  2. 【Java EE 学习 44】【Hibernate学习第一天】【Hibernate对单表的CRUD操作】

    一.Hibernate简介 1.hibernate是对jdbc的二次开发 2.jdbc没有缓存机制,但是hibernate有. 3.hibernate的有点和缺点 (1)优点:有缓存,而且是二级缓存: ...

  3. 6.单表的CRUD操作

    1.插入后用新id初始化被插入对象 <insert id="insertStudentCatchId"> insert into student (age,name,s ...

  4. Django学习笔记(10)——Book单表的增删改查页面

    一,项目题目:Book单表的增删改查页面 该项目主要练习使用Django开发一个Book单表的增删改查页面,通过这个项目巩固自己这段时间学习Django知识. 二,项目需求: 开发一个简单的Book增 ...

  5. SQLServer学习笔记<>.基础知识,一些基本命令,单表查询(null top用法,with ties附加属性,over开窗函数),排名函数

    Sqlserver基础知识 (1)创建数据库 创建数据库有两种方式,手动创建和编写sql脚本创建,在这里我采用脚本的方式创建一个名称为TSQLFundamentals2008的数据库.脚本如下:   ...

  6. MyBatis-Plus学习笔记(1):环境搭建以及基本的CRUD操作

    MyBatis-Plus是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,使用MyBatis-Plus时,不会影响原来Mybatis方式的使用. SpringBoot+M ...

  7. Oracle触发器实现监控某表的CRUD操作

    前提:请用sys用户dba权限登录 1.创建一个表来存储操作日志 create table trig_sql( LT DATE not null primary key, SID NUMBER, SE ...

  8. 通过jdbc完成单表的curd操作以及对JDBCUtils的封装

    概述:jdbc是oracle公司制定的一套规范(一套接口),驱动是jdbc的实现类,由数据库厂商提供.所以我们可以通过一套规范实现对不同的数据库操作(多态) jdbc的作用:连接数据库,发送sql语句 ...

  9. JDBC简单增删改查实现(单表)

    0.准备工作 开发工具: MySQL数据库, intelliJ IDEA2017. 准备jar包: mysql-connector-java-5.1.28-bin.jar(其他均可) 1. 数据库数据 ...

随机推荐

  1. 正则序RegExp

    正则的理解 1.正则的懒惰性    每次在exec()中捕获的时候,只捕获第一次匹配的内容,而不往下不捕获了.我们把这叫正则的懒惰性,每一次捕获的开始位置都是从0开始 解决正则的懒惰性 修饰符g 正则 ...

  2. org.apache.ibatis.binding.BindingException: Parameter 'start' not found. Available parameters are [1, 0, param1, param2]

    DEBUG 2018-05-30 08:43:26,091 org.springframework.jdbc.datasource.DataSourceTransactionManager: Roll ...

  3. Java作业二(2017-9-18)

    /*程序员龚猛,求整数各个位上的和*/ import java.util.Scanner; public class Helloworld{ public static void main(Strin ...

  4. [转]BT原理分析

    BitTorrent协议. BT全名为BitTorrent,是一个p2p软件,你在下载download的同时,也在为其他用户提供上传upload,因为大家是“互相帮助”,所以不会随着用户数的增加而降低 ...

  5. 如何用anysend发wirshark的报文

    可以复制 抓包的的报文的 hex txt文档  粘贴到 anysend 继续发送

  6. IP协议号 IP首部中有8位协议号,用于指明IP的上层协议.

    IP协议号   IP首部中有8位协议号,用于指明IP的上层协议. 0 HOPOPT IPv6 逐跳选项 1 ICMP Internet 控制消息 2 IGMP Internet 组管理 3 GGP 网 ...

  7. Python基础听课笔记

    需求:为8位老师随机分配办公室 #先定义一个列表用来存储8位老师的姓名 teachers = ['xiaowang', 'xiaoli', 'xiangming', 'xiaohua', 'xiaog ...

  8. vue 通过自定义指令实现 置顶操作;

    项目需求:要求当前项目每个页面滑到超出一屏的距离时,出现 backTop 按钮,点击则回到最顶端:俗称置顶操作: 因为涉及到的页面较多,每个页面都加肯定显得重复累赘,最终想到了 Vue 的自定义指令  ...

  9. 初识springboot

    一.springboot简介: 1.简化spring应用开发框架 2.把spring所有技术整合在了一起 3.J2EE开发的一站式解决方案 我曾经学习springMVC时候,那许许多多的配置文件的配置 ...

  10. Mysql笔试题

    1.查询Student表中的所有记录的Sname.Ssex和Class列. SELECT Sname,Ssex,Class FROM Students; 2.查询教师所有的单位即不重复的Depart列 ...