使用c3p0连接数据库实现增删改查
学习spring之前,视频中先给我们一个任务就是用c3p0连接数据库来完成增删改查
一、准备
JAR包:
既然是连接数据库第一个最重要的就是数据库的驱动包mysql-connection-java-5.1.44-bin.jar
接着就是C3P0-0.9.2.1.jar以及mchange-commons-java-0.2.3.4.jar
然后还少不了dbutils 使用的是commons-dbutils-1.7.jar
一共是4个JAR包
二、配置
配置数据库连接:
创建c3p0-config.xml的配置文件,里面包含连接数据库的信息
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/mybatis</property> <property name="user">root</property> <property name="password">123</property> <property name="acquireIncrement">5</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">5</property> <property name="maxPoolSize">20</property> </default-config> </c3p0-config>
创建C3P0Util.java 使用ComboPooledDataSource的对象获取数据库连接
package util; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3P0Util { private static ComboPooledDataSource ds=new ComboPooledDataSource(); //获取数据源 public static DataSource getDataSource(){ return ds; } //获取一个连接 public static Connection getConnection() throws SQLException{ return ds.getConnection(); } }
由于没有使用Mybatis的逆向工程,这里需要手动创建Customer.java 用于获取数据库表的所有列
package domain; import java.io.Serializable; public class Customer implements Serializable{ private int cust_id; private String cust_name; private String cust_source; private String cust_industry; private String cust_level; private String cust_address; private String cust_phone; public int getCust_id() { return cust_id; } public void setCust_id(int cust_id) { this.cust_id = cust_id; } public String getCust_name() { return cust_name; } public void setCust_name(String cust_name) { this.cust_name = cust_name; } public String getCust_source() { return cust_source; } public void setCust_source(String cust_source) { this.cust_source = cust_source; } public String getCust_industry() { return cust_industry; } public void setCust_industry(String cust_industry) { this.cust_industry = cust_industry; } public String getCust_level() { return cust_level; } public void setCust_level(String cust_level) { this.cust_level = cust_level; } public String getCust_address() { return cust_address; } public void setCust_address(String cust_address) { this.cust_address = cust_address; } public String getCust_phone() { return cust_phone; } public void setCust_phone(String cust_phone) { this.cust_phone = cust_phone; } @Override public String toString() { return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + ", cust_source=" + cust_source + ", cust_industry=" + cust_industry + ", cust_level=" + cust_level + ", cust_address=" + cust_address + ", cust_phone=" + cust_phone + "]"; } }
三、接口
上面的配置文件和数据库表信息文件都已经写好了,现在需要写两个接口提供所有的增删改查的方法
创建ICustomerDao.java 持久层接口 ,也就是最底层和数据库连接的接口类
package dao; import java.util.List; import domain.Customer; public interface ICustomerDao { List<Customer> findAllCustomer(); void saveCustomer(Customer customer); void updateCustomer(Customer customer); void deleteCustomer(int custId); Customer findCustomerById(int custId); }
创建ICustomerService.java 业务层接口,用于持久层和客户端连接的接口类,和Dao的方法一样
package service; import java.util.List; import domain.Customer; public interface ICustomerService { //查询所有客户 List<Customer> findAllCustomer(); //保存客户信息 void saveCustomer(Customer customer); //更改客户信息 void updateCustomer(Customer customer); //根据Id删除对象 void deleteCustomer(int cust_id); //根据ID查询用户,返回用户信息 Customer findCustomerById(int cust_id); }
四、实现类
创建CustomerDao.java 实现Dao接口,利用C3P0里的QueryRunner类获取到数据库连接信息连接数据库
并将SQL语句传给数据库然后得到SQL的返回值。
package dao.impl; import java.sql.SQLException; import java.util.List; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import dao.ICustomerDao; import domain.Customer; import util.C3P0Util; //客户的持久层实现类 public class CustomerDao implements ICustomerDao { private QueryRunner runner=new QueryRunner(C3P0Util.getDataSource()); @Override public List<Customer> findAllCustomer() { try { return runner.query("select * from cst_customer", new BeanListHandler<Customer>(Customer.class)); } catch (SQLException e) { throw new RuntimeException(e); } } @Override public void saveCustomer(Customer customer) { try { runner.update("insert into cst_customer(cust_name,cust_source,cust_industry,cust_level,cust_address,cust_phone)values(?,?,?,?,?,?)", customer.getCust_name(),customer.getCust_source(),customer.getCust_industry(), customer.getCust_level(),customer.getCust_address(),customer.getCust_phone()); } catch (SQLException e) { throw new RuntimeException(e); } } @Override public void updateCustomer(Customer customer) { try { runner.update("update cst_customer set cust_name=?,cust_source=?,cust_industry=?,cust_level=?,cust_address=?,cust_phone=? where cust_id=?", customer.getCust_name(),customer.getCust_source(),customer.getCust_industry(), customer.getCust_level(),customer.getCust_address(),customer.getCust_phone(),customer.getCust_id()); } catch (SQLException e) { throw new RuntimeException(e); } } @Override public void deleteCustomer(int custId) { try { runner.update("delete from cst_customer where cust_id=?",custId); } catch (SQLException e) { throw new RuntimeException(e); } } @Override public Customer findCustomerById(int custId) { try { return runner.query("select * from cst_customer where cust_id=?", new BeanHandler<Customer>(Customer.class),custId); } catch (SQLException e) { throw new RuntimeException(e); } } }
创建CustomerService.java 实现业务层,将需要查询的数据传给Dao层,并得到Dao层的返回值。
package service; import java.util.List; import dao.ICustomerDao; import dao.impl.CustomerDao; import domain.Customer; //客户的业务层实现类 public class CustomerServiceImpl implements ICustomerService { private ICustomerDao customerDao=new CustomerDao(); @Override public List<Customer> findAllCustomer() { // TODO Auto-generated method stub return customerDao.findAllCustomer(); } @Override public void saveCustomer(Customer customer) { customerDao.saveCustomer(customer); } @Override public void updateCustomer(Customer customer) { customerDao.updateCustomer(customer); } @Override public void deleteCustomer(int custId) { customerDao.deleteCustomer(custId); } @Override public Customer findCustomerById(int custId) { // TODO Auto-generated method stub return customerDao.findCustomerById(custId); } }
五、测试类
创建CustomerServiceTest.java 获取CustomerServiceImpl所有方法的测试方法
该类中在方法里创建CustomerServiceImpl对象 获取原始方法,将参数传入Customer中,通过CustomerService获取到返回值并打印。
package test; import static org.junit.Assert.fail; import java.util.List; import org.junit.Test; import domain.Customer; import service.CustomerServiceImpl; import service.ICustomerService; public class CustomerServicerTest { @Test public void testFindAllCustomer() { ICustomerService cs=new CustomerServiceImpl(); List<Customer> list=cs.findAllCustomer(); for(Customer c: list){ System.out.println(c); } } @Test public void testSaveCustomer() { ICustomerService cs=new CustomerServiceImpl(); Customer c=new Customer(); c.setCust_name("滴滴"); c.setCust_source("dache"); cs.saveCustomer(c); } @Test public void testUpdateCustomer() { fail("Not yet implemented"); } @Test public void testDeleteCustomer() { fail("Not yet implemented"); } @Test public void testFindCustomerById() { ICustomerService cs=new CustomerServiceImpl(); Customer c=cs.findCustomerById(2); System.out.println(c); } }
至此C3P0连接数据库进行单表增删改查功能完结。附上结构图
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- Logistic回归算法及Python实现
- <script>元素在XHTML中的用法
- 有趣的算法(四)——一致性Hash算法模拟redis集群
- ASP.NET5 中静态文件的各种使用方式服务端的静态文件开启目录浏览呈现默认文件使用UseFileServer方法文件类型基于IIS的考虑最佳实践
- 使用ASP.NET Identity以手机短信实现双重验证创建一个ASP.NET 5项目运行应用程序使用SMS短信进行双重验证开启双重验证使用双重验证登陆应用程序禁用账户来防止暴力破解
- ASP.NET 5 之 错误诊断和它的中间件们配置错误处理页面在Development阶段使用错误页面运行时信息页面欢迎页面
- 有趣的算法(五) ——Dijkstra双栈四则运算
- CSS深入理解学习笔记之float
- 轻松初探 Python 篇(五)—dict 和 set 知识汇总
- 全面解析C#中的异步编程为什么要异步过去糟糕的体验一个新的方式Tasks基于任务的异步编程模型Async和await时间处理程序和无返回值的异步方法结束语
- CSS深入理解学习笔记之absolute
- 5个经典的JavaScript面试题
- 轻松初探 Python 篇(四)—list tuple range 知识汇总
- CSS深入理解学习笔记之overflow
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 面试题:部分排序
- 变成语言的层次和类型
- Android自定义ViewGroup实现堆叠头像的点赞Layout
- Android给任何view添加全屏倾斜水印
- 分布式一致性协议 - Paxos
- 链表中穿针引线
- Android 帧动画的实例详解
- Android HandlerThread使用方法详解
- LeetCode 167,两数之和2
- 详解android 通过uri获取bitmap图片并压缩
- android线程消息机制之Handler详解
- 分布式一致性协议 - ZAB
- 删除链表的倒数第N个节点
- Open3d学习计划—高级篇 2(彩色点云配准)
- Android7.0上某些PopuWindow出现显示位置不正确问题的解决方法