c3p0和DbUtils的小案例:
-
创建SQL语令
create table User1(
id int primary key not null auto_increment,
username varchar(20),
password varchar(20)
); -
eclipse中详细步骤
-
导入jar包 分别有数据库连接包、c3p0包、c3p0依赖包、DbUtils包
jar的网盘分享地址为:https://pan.baidu.com/s/1PRFNCJfUUHDyNlpT-oxjVA
提取码:u9rb -
编写c3p0-config.xml文件
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <named-config name="pool"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql:///chu1</property> <property name="user">root</property> <property name="password">szxy</property> <property name="initialPoolSize">5</property> <property name="maxPoolSize">20</property> </named-config> </c3p0-config>
-
创建utils包、service包、bean包、test包
- utils包中创建名为JdbcUtils类,在类中创建静态获取数据池中的资源,创建连接方法、关闭资源
public class JdbcUtils{ public static Datasource ds= null; static { ds= new ComboPooledDataSource("pool"); } public static DataSource getDataSource(){ return ds; } public static Connection getConnection() throws SQLException{ return ds.getConnection(); } public static void close(Connection conn ,Statement stmt,ResultSet set){ close(); } }
domain实体类
package com.h3.domain; public class User { private int id; private String username; private String password; public User() { } public User(int id, String username, String password) { this.id = id; this.username = username; this.password = password; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
service类
public class JdbcService { //DButils的QueryRunner去池中找数据 private QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); public int addUser(String username, String password) throws SQLException { String sql = "insert into user values (null,?,?)"; int row = qr.update(sql, username, password); return row; } public int deleteUser(int id) throws SQLException { String sql = "delete from user where id = ?"; int row = qr.update(sql, id); return row; } public int updateUser(int id, String password) throws SQLException { String sql="update user set password =? where id =?"; int row = qr.update(sql,password,id); return row; } //查看所有的信息 // BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。 public void selectAll() throws SQLException { String sql = "select * from user"; // qr.ResultSetHandler<T> 这是接口 BeanListHander 是实现类 // BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。 // 把结果集转为一个 Bean 的 List, 并返回.。Bean的类型在创建 // BeanListHanlder对象时以 Class对象的方式传入,可以适应列的别名来映射 JavaBean 的属性名 // query(String sql, Object[] params, ResultSetHandler rsh): // 方法本身不提供数据库连接,执行选择查询,在查询中,对象阵列的值被用来作为查询的置换参数。 List<User> user = qr.query(sql, new BeanListHandler<User>(User.class)); for (User u : user) { System.out.println(u.getId() + "--" + u.getUsername() + "--" + u.getPassword()); } } //把结果集转为一个 Bean,并返回 //Bean的类型在创建BeanHandler 对象时以 Class 对象的方式传入 BeanHandler(Class<T> type)。 //BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。 public User selectOneUser(int id) throws SQLException { String sql = "select * from user where id = ?"; User u = qr.query(sql, new BeanHandler<User>(User.class), id); return u; } // ScalarHandler:将结果集中某一条记录的其中某一列的数据存成Object。 // 可以返回指定列的一个值或返回一个统计函数的值,比如count(1) public void select(String xing) throws SQLException { String sql = "select count(*) from user where username like ? "; long count = qr.query(sql, new ScalarHandler<>(), xing + "%"); System.out.println(count); } }
测试类
public class JdbcTest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); JdbcService service = new JdbcService(); try { for (; ; ) { System.out.println("请输入 1.添加 2.删除 3.修改 4.查所有 5.查单人 6.查姓X的人 7.退出"); switch (sc.next()) { case "1": System.out.println("请输入用户名"); String username = sc.next(); System.out.println("请输入密码"); String password = sc.next(); int addRow = service.addUser(username, password); if (addRow > 0) { System.out.println("添加成功"); } else { System.out.println("添加失败"); } break; case "2": System.out.println("请输入id"); int delId = sc.nextInt(); int delRow = service.deleteUser(delId); if (delRow > 0) { System.out.println("删除成功"); } else { System.out.println("删除失败"); } break; case "3": System.out.println("请输入id"); int updateId = sc.nextInt(); System.out.println("请输入新密码"); String newPwd = sc.next(); int updateRow = service.updateUser(updateId, newPwd); if (updateRow > 0) { System.out.println("修改成功"); } else { System.out.println("修改失败"); } break; case "4": service.selectAll(); break; case "5": System.out.println("请输入id"); int selectId = sc.nextInt(); User u = service.selectOneUser(selectId); if (u == null) { System.out.println("查无此人"); } else { System.out.println(u.getId() + "--" + u.getUsername() + "--" + u.getPassword()); } break; case "6": System.out.println("请输入姓"); String xing = sc.next(); service.select(xing); break; case "7": System.out.println("再见"); return; } } } catch (Exception e) { e.printStackTrace(); } }
#相关的知识点:
为了简化Jdbc技术的操作-----DBUtils
Apache组织提供的一个对JDBC进行简单封装的开源工具类库
作用:DBUtils主要负责转载驱动、关闭连接的工作
dbutil的作用 不用自己关闭资源
DBUtils就是为了简化JDBC的快发而产生的开发工具包.对JDBC的一种封装
用池来管理Connection,这样可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。
在开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,所以通常用连接池结束,来共享连接Connection.这样就不用每次都创建连接,释放链接了,这些操作都交给连接池.
QreryRunner类(org.apache.commons.dbutils.QueryRunner) 是Dbutils的核心类之一,它显著的简化了SQL查询,并与ResultSetHandler协同工作将使编码量大为减少。它包含以下几个方法:
-
query(Connection conn, String sql, Object[] params, ResultSetHandler rsh):执行选择查询,在查询中,对象阵列的值被用来作为查询的置换参数。
-
query (String sql, Object[] params, ResultSetHandler rsh):方法本身不提供数据库连接,执行选择查询,在查询中,对象阵列的值被用来作为查询的置换参数。
-
query(Connection conn, String sql, ResultSetHandler rsh):执行无需参数的选择查询。
-
update(Connection conn, String sql, Object[] params):被用来执行插入、更新或删除(DML)操作。
-
ResultSetHandler 的作用: QueryRunner 的 query 方法的返回值最终取决于 query 方法的 ResultHandler 参数的 hanlde 方法的返回值。
-
BeanListHandler: 把结果集转为一个 Bean 的 List, 并返回.。Bean的类型在创建 BeanListHanlder对象时以 Class对象的方式传入,可以适应列的别名来映射 JavaBean 的属性 名: String sql = "SELECT id, name customerName, email, birth " + “FROM customers WHERE id = ?”; BeanListHandler(Class type)。
-
BeanHandler: 把结果集转为一个 Bean,并返回.。Bean的类型在创建BeanHandler 对象时以 Class 对象的方式传入 BeanHandler(Class type)。
-
MapHandler: 把结果集转为一个 Map 对象, 并返回。若结果集中有多条记录, 仅返回 第一条记录对应的Map对象.。Map的键: 列名(而非列的别名), 值: 列的值。
-
MapListHandler: 把结果集转为一个 Map 对象的集合, 并返回.。Map的键: 列名(而非列的别名), 值: 列的值。
-
ScalarHandler: 可以返回指定列的一个值或返回一个统计函数的值,比如count(1)。