zoukankan      html  css  js  c++  java
  • com.jsj.utils===新闻发布系统(5)

    2020-05-14

    刚刚我完成了对dao层的业务的定义,定义了我们需要实现的操作的名称

    下面我开始介绍工具类,这个就是工具,就是通过提前写好什么类,

    然后后面如果你遇到,就直接调用就好了

    为什么我要先介绍了?

      因为,后面daoImpl需要调用方法,害怕等会看不懂

    BeanHandler.java

     1 package com.jsj.utils;
     2 
     3 import java.sql.ResultSet;
     4 
     5 public class BeanHandler extends ResultSetHandler {
     6 
     7     private Class<?> clazz;
     8     //构造函数:来初始化的
     9     public BeanHandler(Class<?> clazz){
    10         this.clazz = clazz;
    11     }
    12 
    13     @Override
    14     public Object handle(ResultSet resultSet) throws Exception {
    15         if (resultSet.next()){
    16             return buildObject(resultSet, clazz);
    17         }else {
    18             return null;
    19         }
    20     }
    21 
    22 }
    View Cod

    BeanListHandler.java

     1 package com.jsj.utils;
     2 
     3 import java.sql.ResultSet;
     4 import java.util.ArrayList;
     5 import java.util.List;
     6 
     7 public class BeanListHandler extends ResultSetHandler {
     8     //无法确定类型的泛型
     9     private Class<?> clazz;
    10     //也是初始化变量
    11     public BeanListHandler(Class<?> clazz){
    12         this.clazz = clazz;
    13     }
    14 
    15     @Override
    16     public List handle(ResultSet resultSet) throws Exception {
    17         //数组
    18         List list = new ArrayList();
    19         //
    20         while(resultSet.next()) {
    21             Object bean = buildObject(resultSet, clazz);
    22             list.add(bean);
    23         }
    24         return list;
    25     }
    26 }
    View Code

    JdbcTemple.java

     1 package com.jsj.utils;
     2 
     3 import java.sql.*;
     4 
     5 public class JdbcTemplate {
     6 
     7     private JdbcTemplate(){
     8     }
     9 
    10     /**
    11      * 更新方法
    12      */
    13     public static int update(String sql, Object ...params) throws SQLException {
    14        //创建连接
    15         Connection connection = JdbcUtils.getConnection();
    16         //然后是获取PreparedStatement对象
    17         //try(语句)这种写法,可以自动调动close()方法
    18         try(PreparedStatement preparedStatement = connection.prepareStatement(sql)){
    19            //这个是赋值,一个问号对应一哥变量,数从1开始
    20             for (int i = 1; i <= params.length; i++){
    21                 preparedStatement.setObject(i, params [i-1]);
    22             }
    23             //返回的是数据库发生改变的行数目,
    24             //可以用来确定是否执行成功
    25             return preparedStatement.executeUpdate();
    26         }finally {
    27             //释放了申请的资源
    28             //比如connection
    29             JdbcUtils.releaseConnection(connection);
    30         }
    31     }
    32 
    33     /**
    34      * 查询方法
    35      */
    36     public static Object query(String sql, ResultSetHandler handler, Object... params) throws Exception {
    37         //创建连接对象
    38         Connection connection = JdbcUtils.getConnection();
    39         //执行sql语句
    40         try(PreparedStatement preparedStatement = connection.prepareStatement(sql)){
    41             //读出值
    42             for (int i = 1; i <= params.length; i++){
    43                 preparedStatement.setObject(i, params [i-1]);
    44             }
    45             //resultSet就是flag,就是确定是否成功
    46             try(ResultSet resultSet = preparedStatement.executeQuery()){
    47                 //
    48                 return handler.handle(resultSet);
    49             }
    50         }finally {
    51             //释放connection资源
    52             JdbcUtils.releaseConnection(connection);
    53         }
    54     }
    55 
    56     public static int queryCount(String sql, Object... params) throws Exception{
    57         //创建数据库连接
    58         Connection connection = JdbcUtils.getConnection();
    59         //括号里面是导入sql语句,获取对象
    60         try(PreparedStatement preparedStatement = connection.prepareStatement(sql)){
    61             //这个是赋值
    62             for (int i = 1; i <= params.length; i++){
    63                 preparedStatement.setObject(i, params [i-1]);
    64             }
    65             //执行sql语句
    66             try(ResultSet resultSet = preparedStatement.executeQuery()){
    67                 //读取数据的时候
    68                 if (resultSet.next()){
    69                     //还有返回1
    70                     return resultSet.getInt(1);
    71                 }else {
    72                     //没有数据了,返回-1
    73                     return -1;
    74                 }
    75             }
    76         }finally {
    77             JdbcUtils.releaseConnection(connection);
    78         }
    79     }
    80 
    81 }
    View Code

    JdbcUtils.java

     1 package com.jsj.utils;
     2 
     3 import com.mchange.v2.c3p0.ComboPooledDataSource;
     4 
     5 import java.sql.Connection;
     6 import java.sql.SQLException;
     7 
     8 /**
     9  * jdbc工具类
    10  */
    11 public class JdbcUtils {
    12 
    13     private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
    14 
    15     private static ThreadLocal<Connection> threadLocal = new ThreadLocal<>();
    16 
    17     public static Connection getConnection() throws SQLException {
    18         Connection transactionConnection = threadLocal.get();
    19         if (transactionConnection!=null){
    20             return transactionConnection;
    21         }
    22         return dataSource.getConnection();
    23     }
    24 
    25     /**
    26      * 开启事务
    27      */
    28     public static void beginTransaction() throws SQLException {
    29         Connection transactionConnection = threadLocal.get();
    30         if (transactionConnection!=null){
    31             throw new SQLException("事务已开启");
    32         }
    33         transactionConnection = getConnection();
    34         transactionConnection.setAutoCommit(false);
    35         threadLocal.set(transactionConnection);
    36     }
    37 
    38     /**
    39      * 提交事务
    40      */
    41     public static void commitTransaction() throws SQLException {
    42         Connection transactionConnection = threadLocal.get();
    43         if (transactionConnection==null){
    44             throw new SQLException("事务未开启");
    45         }
    46         transactionConnection.commit();
    47         transactionConnection.close();
    48         threadLocal.remove();
    49     }
    50 
    51     /**
    52      * 回滚事务
    53      */
    54     public static void rollbackTransaction() throws SQLException {
    55         Connection transactionConnection = threadLocal.get();
    56         if (transactionConnection==null){
    57             throw new SQLException("事务未开启");
    58         }
    59         transactionConnection.rollback();
    60         transactionConnection.close();
    61         threadLocal.remove();
    62     }
    63 
    64     /**
    65      * 释放连接资源
    66      */
    67     public static void releaseConnection(Connection connection) throws SQLException {
    68         if (threadLocal.get()==null){
    69             connection.close();
    70             return;
    71         }
    72         if (connection!=threadLocal.get()){
    73             connection.close();
    74         }
    75     }
    76 }
    View Code

     ResultSetHandler.java

     1 package com.jsj.utils;
     2 
     3 import java.lang.reflect.Field;
     4 import java.sql.ResultSet;
     5 
     6 abstract class ResultSetHandler {
     7 
     8     abstract Object handle(ResultSet resultSet) throws Exception;
     9 
    10     Object buildObject(ResultSet resultSet, Class<?> clazz) throws Exception {
    11         Object bean = clazz.newInstance();
    12         Field[] fields = clazz.getDeclaredFields();
    13         // 封装数据
    14         for (int i = 1; i <= resultSet.getMetaData().getColumnCount(); i ++) {
    15             Object value = resultSet.getObject(i);
    16             //匹配实体类中对应的属性
    17             for (Field field : fields) {
    18                 if (resultSet.getMetaData().getColumnName(i).replaceAll("_","").equals(field.getName().toLowerCase())) {
    19                     boolean flag = field.isAccessible();
    20                     field.setAccessible(true);
    21                     field.set(bean, value);
    22                     field.setAccessible(flag);
    23                     break;
    24                 }
    25             }
    26         }
    27         return bean;
    28     }
    29 
    30 }
    View Code
    会当凌绝顶,一览众山小
  • 相关阅读:
    微信小程序中的组件使用1
    小程序中的请求封装
    路由
    nodejs静态web服务
    跨端开发小程序
    非阻塞I/O事件驱动
    Node文件模块
    提炼游戏引擎系列:初步设计引擎
    提炼游戏引擎系列:开篇介绍
    发布HTML5 2D游戏引擎YEngine2D
  • 原文地址:https://www.cnblogs.com/quenvpengyou/p/12891275.html
Copyright © 2011-2022 走看看