• JDBC操作BLOB类型字段


    JDBC中Statement接口本身不能直接操作BLOB数据类型 

    操作BLOB数据类型需要使用PreparedStatement或者CallableStatement(存储过程)

    这里演示通过PreparedStatement操作数据库BLOB字段 

    设置最大传入字节  一般是4M  可以通过以下命令修改

        set global max_allowed_packet=1024*1024*32;

    这里封装的方法本身就可以对Blob字段进行   存   取 

    数据库

    实体类

    JDBC的封装类

    1. package com.utils;
    2. import java.lang.reflect.Field;
    3. import java.sql.*;
    4. import java.util.ArrayList;
    5. import java.util.List;
    6. import java.util.ResourceBundle;
    7. /**
    8. * @author hrui
    9. * @date 2023/10/13 13:49
    10. */
    11. public class DBUtils {
    12. private static ResourceBundle bundle=ResourceBundle.getBundle("jdbc");
    13. private static String driver=bundle.getString("jdbc.driver");
    14. private static String url=bundle.getString("jdbc.url");
    15. private static String username=bundle.getString("jdbc.username");
    16. private static String password=bundle.getString("jdbc.password");
    17. static{
    18. try {
    19. Class.forName(driver);
    20. } catch (ClassNotFoundException e) {
    21. e.printStackTrace();
    22. }
    23. }
    24. //通用查询多个
    25. public static <T> List<T> selectList(Class<T> clazz, String sql, Object...args){
    26. Connection conn=null;
    27. PreparedStatement ps=null;
    28. ResultSet rs=null;
    29. try {
    30. conn=DBUtils.getConnection();
    31. ps=conn.prepareStatement(sql);
    32. for(int i=0;i<args.length;i++){
    33. ps.setObject(i+1, args[i]);
    34. }
    35. rs = ps.executeQuery();
    36. ResultSetMetaData metaData = rs.getMetaData();
    37. int columnCount = metaData.getColumnCount();
    38. List<T> list=new ArrayList<>();
    39. while(rs.next()){
    40. T t = clazz.newInstance();
    41. for(int i=0;i<columnCount;i++){
    42. Object object = rs.getObject(i + 1);
    43. //String columnName = metaData.getColumnName(i + 1); 这个方法返回实际列名
    44. String columnLabel = metaData.getColumnLabel(i + 1);//该方法返回别名,没有别名就返回列名
    45. columnLabel = getString(columnLabel);
    46. Field field = clazz.getDeclaredField(columnLabel);
    47. field.setAccessible(true);
    48. field.set(t,object);
    49. }
    50. list.add(t);
    51. }
    52. return list;
    53. } catch (Exception e) {
    54. e.printStackTrace();
    55. }finally {
    56. DBUtils.closed(conn,ps,rs);
    57. }
    58. return null;
    59. }
    60. private static String getString(String columnLabel) {
    61. if (columnLabel.contains("_")) {
    62. int index = columnLabel.indexOf("_");
    63. String replace = columnLabel.replace("_", "");
    64. char c = Character.toUpperCase(replace.charAt(index));
    65. columnLabel = replace.substring(0, index) + c + replace.substring(index + 1);
    66. }
    67. return columnLabel;
    68. }
    69. //通用查询单个
    70. public static <T> T selectOne(Class<T> clazz,String sql,Object...args){
    71. Connection conn=null;
    72. PreparedStatement ps=null;
    73. ResultSet rs=null;
    74. try {
    75. conn=DBUtils.getConnection();
    76. ps=conn.prepareStatement(sql);
    77. for(int i=0;i<args.length;i++){
    78. ps.setObject(i+1, args[i]);
    79. }
    80. rs = ps.executeQuery();
    81. ResultSetMetaData metaData = rs.getMetaData();
    82. int columnCount = metaData.getColumnCount();
    83. if(rs.next()){
    84. T t = clazz.newInstance();
    85. for(int i=0;i<columnCount;i++){
    86. Object object = rs.getObject(i + 1);
    87. //System.out.println(object.getClass());
    88. String columnLabel = metaData.getColumnLabel(i + 1);
    89. columnLabel = getString(columnLabel);
    90. Field field = clazz.getDeclaredField(columnLabel);
    91. field.setAccessible(true);
    92. field.set(t,object);
    93. }
    94. return t;
    95. }
    96. } catch (Exception e) {
    97. e.printStackTrace();
    98. }finally {
    99. DBUtils.closed(conn,ps,rs);
    100. }
    101. return null;
    102. }
    103. public static Connection getConnection() throws SQLException {
    104. Connection connection = DriverManager.getConnection(url, username, password);
    105. return connection;
    106. }
    107. //通用增删改方法
    108. public static int update(String sql,Object...args){
    109. Connection conn =null;
    110. PreparedStatement ps=null;
    111. int count=0;
    112. try {
    113. conn = DBUtils.getConnection();
    114. ps = conn.prepareStatement(sql);
    115. for(int i=0;i<args.length;i++){
    116. ps.setObject(i+1, args[i]);
    117. }
    118. count = ps.executeUpdate();
    119. //ps.execute();
    120. } catch (SQLException e) {
    121. e.printStackTrace();
    122. }finally {
    123. DBUtils.closed(conn,ps,null);
    124. }
    125. return count;
    126. }
    127. public static void closed(Connection conn, Statement st, ResultSet rs){
    128. if(rs!=null){
    129. try {
    130. rs.close();
    131. } catch (SQLException e) {
    132. e.printStackTrace();
    133. }
    134. }
    135. if(st!=null){
    136. try {
    137. st.close();
    138. } catch (SQLException e) {
    139. e.printStackTrace();
    140. }
    141. }
    142. if(conn!=null){
    143. try {
    144. conn.close();
    145. } catch (SQLException e) {
    146. e.printStackTrace();
    147. }
    148. }
    149. }
    150. }

    用工具类中封装的方法    存

    下面详解下PrepareStatement单独存取数据库Blob字段  

    有很多方法

    读取

    像下面这样也行 这样就保存文件了

  • 相关阅读:
    Linux docker 搭建Redis主从复制集群、新增(扩容)主/从节点、删除(缩容)主/从节点
    web网页设计期末课程大作业:美食餐饮文化主题网站设计——中华美德6页面HTML+CSS+JavaScript
    C++产生未定义的行为的原因分析
    Java基础面试
    腾讯薪酬改革:晋升不再直接调薪;iPhone 4S 和 6S 将被列入过时产品;Perl 5.36.0发布|极客头条
    什么样的架构师修炼之道文档,能帮助大家修炼成为出色的架构师?
    地图下载白嫖神器!你该怎么用好它
    线程基础知识
    上海亚商投顾:沪指冲高回落 纺织服装股午后集体走强
    百度apollo自动驾驶planning代码学习-Apollo\modules\planning\common\IndexedList类代码详解
  • 原文地址:https://blog.csdn.net/tiantiantbtb/article/details/133833936