c3p0连接池结合dbutils工具类操作数据库的简单使用。

本人最近为了了解c3p0,自己找到个新闻管理的小项目做。使用的是jsp,javabean,servlet开发模式。

环境:jdk1.8、Tomcat9、IDE使用的是IntelliJ IDEA 2018.1.4 x64。个人感觉idea确实比eclipse好用,主要体现在智能代码提示与超级智能的重构功能上,论坛里已经有很多了,我是参考安装:https://blog.csdn.net/qq1404510094/article/details/79005826

破解主要是把路径指向破解jar包,破解成功后使用期限会显示到2099年:https://blog.csdn.net/qq_38637558/article/details/78914772

配置Tomcat:https://blog.csdn.net/u013291367/article/details/78053195

注册阶段使用md5加密类。使用到的jar包包括:c3p0-0.9.1.2+commons-dbutils-1.7+mysql-connector-java-5.1.34-bin。

1.首先导入c3p0jar包与mysql连接者jar包。然后编写c3p0配置文件。

<c3p0-config>
	<!-- 默认配置,如果没有指定则使用这个配置 -->
	<default-config>
		<!-- 基本配置:填写数据库名、登陆账号密码 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
                                            <!-- 此处回环地址后的/填写数据库名 -->
		<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/newsdb</property>
		<property name="user">root</property>
		<property name="password">123</property>
	
		<!--扩展配置-->
		<property name="checkoutTimeout">30000</property>
		<property name="idleConnectionTestPeriod">30</property>
		<property name="initialPoolSize">10</property>
		<property name="maxIdleTime">30</property>
		<property name="maxPoolSize">100</property>
		<property name="minPoolSize">10</property>
		<property name="maxStatements">200</property>
	</default-config> 
	
	
	<!-- 命名的配置 -->
	<named-config name="itcast">
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/xxxx</property>
		<property name="user">root</property>
		<property name="password">1234</property>
		
		
		<!-- 如果池中数据连接不够时一次增长多少个 -->
		<property name="acquireIncrement">5</property>
		<property name="initialPoolSize">20</property>
		<property name="minPoolSize">10</property>
		<property name="maxPoolSize">40</property>
		<property name="maxStatements">20</property>
		<property name="maxStatementsPerConnection">5</property>
	</named-config>
</c3p0-config> 

2.导入dbutil工具包。创建DataSourceUtils工具类,集成c3p0与dbutils。

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DataSourceUtils {
	static ComboPooledDataSource ds=new ComboPooledDataSource();
	
	/**
	 * 获取数据源
	 * @return 连接池
	 */
	public static DataSource getDataSource(){
		return ds;
	}
	
	/**
	 * 获取连接
	 * @return 连接
	 * @throws SQLException
	 */
	public static Connection getConnection() throws SQLException{
		return ds.getConnection();
	}
	
	
	
	/**
	 * 释放资源
	 * 
	 * @param conn
	 *            连接
	 * @param st
	 *            语句执行者
	 * @param rs
	 *            结果集
	 */
	public static void closeResource(Connection conn, Statement st, ResultSet rs) {
		closeResultSet(rs);
		closeStatement(st);
		closeConn(conn);
	}

	/**
	 * 释放连接
	 * 
	 * @param conn
	 *            连接
	 */
	public static void closeConn(Connection conn) {
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			conn = null;
		}

	}

	/**
	 * 释放语句执行者
	 * 
	 * @param st
	 *            语句执行者
	 */
	public static void closeStatement(Statement st) {
		if (st != null) {
			try {
				st.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			st = null;
		}

	}

	/**
	 * 释放结果集
	 * 
	 * @param rs
	 *            结果集
	 */
	public static void closeResultSet(ResultSet rs) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			rs = null;
		}

	}
}

 

到这里就大功告成了,不用刻意开启关闭各种资源。不需要用常规jdbc连接数据库。只需要创建dbutils的QueryRunner对象就能自动调用与归还连接。

现在再来试试使用QueryRunner来实现CRUD操作。

 

//创建QueryRunner对象
    QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());

    /**
     * 添加新闻
     * @param n     新闻实体信息
     * @return  sql语句影响的行数
     */
    @Override
    public int addNewInfo(NewsInfo n) {
        //编写插入信息的sql语句。
        String sql="INSERT INTO newinfo(n_title,n_content,n_time,n_author,n_type,n_pic)VALUES(?,?,NOW(),?,?,?)";
        //将各种javabean实体存入数组。
        Object []objs={
                n.getN_title(),
                n.getN_content(),
                n.getN_author(),
                n.getN_type(),
                n.getN_pic()
        };
        int i=66;
        try {
            //QueryRunner对象的update方法,传入两个参数:sql语句+?占位符
            i = qr.update(sql, objs);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return i;
    }

 查询信息操作:

 

 /**
     * 
     * @return 新闻实体集合
     */
public List<NewsInfo> getAllNewInfo() {
        //编写查询新闻信息的sql语句
        String sql="SELECT  n_id,n_title,n_time,n_author,n_type,n_pic FROM newinfo order by n_time desc";
        List<NewsInfo> list=null;
        try {
        //初始化javabean集合
        list=new ArrayList <NewsInfo>();

        list = qr.query(sql, new BeanListHandler<>(NewsInfo.class));

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return  list;
    }

 

public NewsInfo getNew(int nid) {
        String sql = "select n_type,n_title,n_author,n_time,n_content from newinfo where n_id=?";
        NewsInfo ni=null;
        try {
            //注意此处的参数在new BeanHandler<>(NewsInfo.class)之后
            ni=qr.query(sql,new BeanHandler<>(NewsInfo.class),nid);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ni;
    }

常用的如下:

ResultSetHandler:封装结果集
    BeanHandler 将结果集中第一条记录封装到一个指定的javaBean中
    BeanListHandler 将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
    MapListHandler 将结果集中每一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值,在将这些Map封装到List集合中。
    ScalarHandler 它是用于单数据。例如select count(*) from 表操作。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值