JDBC数据库连接池工具类和Service业务封装思想


共用的配置文件:database.properties

# 数据库配置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8
username=root
password=123456
# 初始化连接数
initialSize=10
# 最大连接数
maxActive=30
# 最小空闲连接数
minIdle=5
# 超时等待时间,单位:毫秒ms
maxWait=5000

1. JDBC 数据库连接池工具类

1.1 自定义连接池

```java
/**
 * 数据库连接池
 */
public class MyDBPool implements DataSource {
    // 存储连接对象的集合
    private static List<Connection> connections = new ArrayList<>();

    // 类加载时就往集合中存放指定数量的连接对象
    static {
        InputStream is = MyDBPool.class.getResourceAsStream("/db.properties");
        Properties properties = new Properties();
        try {
            properties.load(is);
            Class.forName(properties.getProperty("driver"));
            // 通过循环,创建 initialSize 个数据库连接对象,放进集合
            for (int i = 0; i < Integer.parseInt(properties.getProperty("initialSize")); i++) {
                Connection connection = DriverManager.getConnection(properties.getProperty("url"), properties.getProperty("username"), properties.getProperty("password"));
                connections.add(connection);
            }

        } catch (IOException | ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }

    @Override
    public Connection getConnection() throws SQLException {
        // 在池中获得连接
        System.out.println("池中有 " + connections.size() + " 个连接对象。");
        Connection connection = null;

        if (connections.size() > 0) {
            connection = connections.remove(0);
        }

        return connection;
    }

    /**
     * 将连接放回池中
     */
    public void release(Connection connection) {
        connections.add(connection);
        System.out.println("放回1个connection");
    }

    // 其他需要覆盖的方法...
}

1.2 Druid 德鲁伊连接池(alibaba)

Druid(德鲁伊)是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是目前最好的数据库连接池。在功能、性能、扩展性方面,都超过其他数据库连接池,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况。
特点
Druid 是目前比较流行高性能的,分布式列存储。

  1. 亚秒级查询
  2. 实时数据注入
  3. 可扩展的PB级存储
  4. 多环境部署
  5. 丰富的社区

依赖其独立的驱动 jar 包:druid-1.1.5.jar
源码下载地址:https://github.com/alibaba/druid
jar包下载地址:

使用示例:

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

public class DBPoolUtils {
    // 连接池对象:DataSource 的实现类
    private static DruidDataSource ds;

    static {
        Properties properties = new Properties();
        InputStream is = DBPoolUtils.class.getResourceAsStream("/database.properties");
        try {
            properties.load(is);
            // 使用德鲁伊工厂创建连接池
            ds = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() {
        try {
            // 在连接池中获得 connection
            // connection 中存放的是 DruidPooledConnection 实现类
            return ds.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void classAll(Connection c, Statement s, ResultSet r) {
        try {
            if (r != null) {
                r.close();
            }
            if (s != null) {
                s.close();
            }
            if (c != null) {
                // 调用的 close 不是 connection 关闭的,而是将连接资源放回到池中
                c.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

2. Service 业务封装思想

Service 业务封装思想
代码示例:

/**
 * Userinfo 的业务逻辑层对象
 */
public class UserinfoServiceImpl {
    /**
     * 注册业务:用户的注册功能
     */
    public String register(UserInfo userinfo) { // 1.接收参数
        UserInfoDaoImpl userInfoDao = new UserInfoDaoImpl();
        // 2.调用数据访问层对象的查询方法
        UserInfo check = userInfoDao.select(userinfo.getUser_id());
        if (check != null) {
            return "用户名已存在";
        }
        // 3.调用数据访问层对象的新增方法
        int result = userInfoDao.insert(userinfo);
        // 4.将操作结果返回给调用者
        if (result > 0) {
            return "注册成功!";
        } else {
            return "注册失败!";
        }
    }

    /**
     * 登陆业务:用户登陆功能
     */
    public UserInfo login(String user_name, String user_pwd) { // 1.接收参数
        UserInfoDaoImpl userInfoDao = new UserInfoDaoImpl();
        // 2.调用数据访问层对象
        UserInfo userInfo = userInfoDao.select(user_name);
        // 3.接收结果,处理结果
        if (userInfo != null) {
            // 检查用户密码和输入密码是否一致
            if (userInfo.getUser_pwd().equals(user_pwd)) {
                return userInfo;
            }
        }
        // 4.响应调用者结果
        return null;
    }
}
发布了320 篇原创文章 · 获赞 311 · 访问量 66万+

猜你喜欢

转载自blog.csdn.net/sinat_36184075/article/details/105252518