本人最近为了了解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 表操作。