day16(jdbc进阶,jdbc之dbUtils)
1.jdbc进阶
jdbc事务管理
jdbc中的事务管理其实就是交给了连接对象去管理。先写一个简单的事务管理
public class Demo01 {
private static Connection conn;
private static PreparedStatement ctt;
public static void main(String[] args) {
//创建连接对象
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///数据库名",数据库用户名,数据库密码);
String sql="update user set password=password+? where username=?";
ctt = conn.prepareStatement(sql);
ctt.setString(1,"-1000");
ctt.setString(2,"刘备");
conn.setAutoCommit(false);//设置自动是否自动提交数据
ctt.executeUpdate();//执行sql语句
ctt.setString(1,"1000");//对参数进行重新修改
ctt.setString(2,"关羽");//对参数进行重新修改
ctt.executeUpdate();//再次重新执行sql语句
conn.commit();//如果执行语句错误则数据就不会提交
} catch (ClassNotFoundException e) {
try {
conn.rollback();//在提交前发生错误怎进行事务回滚
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
//释放资源
if (conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn=null;
}
}
if (ctt!=null) {
try {
ctt.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
ctt=null;
}
}
}
}
}
jdbc连接池
连接池: 是存储连接对象的容器;使用一个连接可以直接取连接 ,用完后进行销毁,提高了效率。
作用 : 解决了jdbc使用时必须重新创建 而连接池解决了重新创建的这一个过程,直接从连接池中获取。节约了时间。
bruid连接池:属于阿里巴巴团队开发jar包
环境的搭建: 需要的导包 druid-1.0.9.jar
创建连接池:
自定义设置参数:
DruidDataSource dds=new DruidDataSource();
dds.setDriverClassName("com.mysql.jdbc.Driver");//设置驱动
dds.setUrl("jdbc:mysql:///数据库名");
dds.setUsername("root");//设置数据库用户名
dds.setPassword("123");//设置用户名密码
DruidPooledConnection conn = dds.getConnection();
通过配置文件进行获取参数配置
db.properties文件内容 :
DriverClassName=com.mysql.jdbc.Driver//驱动
url=jdbc:mysql:///数据库名
username=root //数据库用户名
password=123 //数据库密码
加载配置文件
Properties pps=new Properties();
pps.load(new FileInputStream("src/db.properties"));//加载文件
DataSource ddsf=DruidDataSourceFactory.createDataSource(pps);
Connection conn = ddsf.getConnection();
c3p0连接池(3种) 必须要导入c3p0-0.9.1.2.jar
自己设置参数
ComboPooledDataSource cpd=new ComboPooledDataSource();
//driverClass
cpd.setDriverClass("com.mysql.jdbc.Driver");
//url
cpd.setJdbcUrl("jdbc:mysql:///db_test1");
//username
cpd.setUser("root");
//password
cpd.setPassword("123");
//获取连接
Connection conn = cpd.getConnection();
配置文件
properties(c3p0.properties 规定的名字不能修改)
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql:///数据库名
c3p0.user=root//数据库用户名
c3p0.password=123//数据库密码
xml(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:///数据库名</property>
<property name="user">数据库用户名</property>
<property name="password">数据库密码</property>
<property name="initialPoolSize">初始化连接chi大小</property>
<property name="maxIdleTime">最大空闲时间</property>
<property name="maxPoolSize">最大连接池数</property>
<property name="minPoolSize">最小连接池数</property>
</default-config>
</c3p0-config>
获取连接
ComboPooledDataSource cpd=new ComboPooledDataSource();//c3p0会自动在src下进行自动检索 不需要手动加载 //优先级 c3p0会优先检查c3p0-config.xml文件 没有c3p0-config.xml文件则检索c3p0.properties文件
Connection conn = cpd.getConnection();
自定义连接池
连接池的定义:我们使用连接时只需要在连接池中取连接,不用时则添加到连接池中去。
创建连接对象
public class MyConnection implements Connection{
private Connection oldConnection;//获取到的连接
private LinkedList<Connection> pool;//连接池
//通过构造方法进行初始化
public MyConnection(Connection oldConnection,LinkedList<Connection> pool) {
this.oldConnection=oldConnection;
this.pool=pool;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
// TODO Auto-generated method stub
return oldConnection.unwrap(iface);
} @Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
// TODO Auto-generated method stub
return oldConnection.isWrapperFor(iface);
} @Override
public Statement createStatement() throws SQLException {
// TODO Auto-generated method stub
return oldConnection.createStatement();
} @Override
public PreparedStatement prepareStatement(String sql) throws SQLException {
// TODO Auto-generated method stub
return oldConnection.prepareStatement(sql);
}
//方法没有写完 只需要自动生成即可 ;
//这里只展示了重要的方法
}
创建连接池
/**
* 初始化: 初始化连接池的连接个数
* @author Administrator
*
*/
public class MyDataSource implements DataSource { //创建连接池对象
private static LinkedList<Connection> pool=new LinkedList<Connection>();
static{ //初始化连接池
Connection conn=null;
for (int i = 0; i < 5; i++) {
try {
conn=JdbcUtils.getConnection();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
pool.add(conn);
System.out.println(conn);
}
}
@Override
public Connection getConnection() throws SQLException {
Connection conn=null;
if (pool.size()>0) {
conn = pool.removeFirst();
MyConnection mycon=new MyConnection(conn, pool);
System.out.println("获取连接");
return mycon;
}else{
new RuntimeException("服务器繁忙!");
}
return null;
}
@Override
public PrintWriter getLogWriter() throws SQLException {
// TODO Auto-generated method stub
return null;
} @Override
public void setLogWriter(PrintWriter out) throws SQLException {
// TODO Auto-generated method stub } @Override
public void setLoginTimeout(int seconds) throws SQLException {
// TODO Auto-generated method stub } @Override
public int getLoginTimeout() throws SQLException {
// TODO Auto-generated method stub
return 0;
} @Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
// TODO Auto-generated method stub
return null;
} @Override
public <T> T unwrap(Class<T> iface) throws SQLException {
// TODO Auto-generated method stub
return null;
} @Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
// TODO Auto-generated method stub
return false;
} @Override
public Connection getConnection(String username, String password)
throws SQLException {
// TODO Auto-generated method stub
return null;
} }
测试连接池:
public class Test {
public static void main(String[] args) throws SQLException {
DataSource ms=new MyDataSource();//获取数据源
Connection conn = ms.getConnection();//从数据源中获取连接
Statement ctt = conn.createStatement();//获取连接类中执行sql语句的对象
String sql="insert into user values(null,'8','3333')";//创建sql语句
int i = ctt.executeUpdate(sql);//执行sql语句
if (i>0) {
System.out.println("插入成功");
}
if (conn!=null) {//释放资源
try {
conn.close();//把连接放回集合中
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn=null;
}
}
if (ctt!=null) {
try {
ctt.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
ctt=null;
}
}
}
}
2.jdbc之dbUtils
dbutils是一个apache组织开发的工具类 封装了 对数据库的增删改查操作。 大大的简化了代码的质量
增 ,删 ,改操作:
public class Demo03 {
@Test
public void method() throws SQLException{
ComboPooledDataSource cpds=new ComboPooledDataSource();
QueryRunner qr=new QueryRunner(cpds);
int i = qr.update("增删改sql语句");//返回受影响行数
if (i>0) {
System.out.println("成功");
}
}
}
dbutils主要是对于查询语句 进行了介绍
public class User {
private int id;
private String username;
private String 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;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password="
+ password + "]";
} }
1.ResultSetHandler <类名> 返回一行数据
2.ResultSetHandler <list<类名>> 返回多行数据
使用匿名内部类 实现 handle方法
@Test //查询一行数据
public void method1() throws SQLException{
ComboPooledDataSource cpds=new ComboPooledDataSource();
QueryRunner qr=new QueryRunner(cpds);
User user = qr.query("select * from user where id=32", new ResultSetHandler<User>(){//返回一行数据
@Override
public Object handle(ResultSet rs) throws SQLException {
User u=new User();
while(rs.next()){
u.setId(rs.getInt("id"));
u.setUsername(rs.getString("username"));
u.setPassword(rs.getString("password"));
}
return u;
}});
System.out.println(user);
}
@Test //查询多行数据
public void method1() throws SQLException{
ComboPooledDataSource cpds=new ComboPooledDataSource();
QueryRunner qr=new QueryRunner(cpds);
List<User> list = qr.query("select * from user", new ResultSetHandler<List<User>>(){
@Override
public List<User> handle(ResultSet rs) throws SQLException {
List<User> list=new ArrayList<User>();
while(rs.next()){
User u=new User();
u.setId(rs.getInt("id"));
u.setUsername(rs.getString("username"));
u.setPassword(rs.getString("password"));
list.add(u);
}
return list;
}
});
for (User user : list) {
System.out.println(user);
}
}
1.ArrayHandler() //查询一行数据,以数组的方式返回
2.ArrayListHandler() //查询多行数据 以集合的方式进行返回
@Test
/**
* 查询一行数据
* @throws SQLException
*/
public void method1() throws SQLException{
ComboPooledDataSource cpds=new ComboPooledDataSource();
QueryRunner qr=new QueryRunner(cpds);
Object[] query = qr.query("select * from user where id=32", new ArrayHandler());
for (Object o: query) {
System.out.println(o);
}
}
@Test
/**
* 查询多行数据
* @throws SQLException
*/
public void method1() throws SQLException{
ComboPooledDataSource cpds=new ComboPooledDataSource();
QueryRunner qr=new QueryRunner(cpds);
List<Object[]> query = qr.query("select * from user", new ArrayListHandler());
for (Object[] o: query) {
for (Object object : o) {
System.out.print(object+",");
}
System.out.println();
}
}
1.BeanHandler 返回一行数据
2.BeanListHandler 返回多行数据
@Test
/**
* 查询一行数据
* @throws SQLException
*/
public void method1() throws SQLException{
ComboPooledDataSource cpds=new ComboPooledDataSource();
QueryRunner qr=new QueryRunner(cpds);
User user = qr.query("select * from user where id=32", new BeanHandler<User>(User.class));
System.out.println(user);
}
@Test
/**
* 查询多行数据
* @throws SQLException
*/
public void method1() throws SQLException{
ComboPooledDataSource cpds=new ComboPooledDataSource();
QueryRunner qr=new QueryRunner(cpds);
List<User> user = qr.query("select * from user", new BeanListHandler<User>(User.class));
for (User user2 : user) {
System.out.println(user2);
}
}
1.ColumnListHandler 查询一列数据
@Test
/**
* 查询一列数据
* @throws SQLException
*/
public void method1() throws SQLException{
ComboPooledDataSource cpds=new ComboPooledDataSource();
QueryRunner qr=new QueryRunner(cpds);
List<Object> user = qr.query("select * from user ", new ColumnListHandler("username"));//查询username一列数据
for (Object user2 : user) {
System.out.println(user2);
}
}
2.ScalarHandler //获取一行中的一列
@Test
/**
* 查询一列数据
* @throws SQLException
*/
public void method1() throws SQLException{
ComboPooledDataSource cpds=new ComboPooledDataSource();
QueryRunner qr=new QueryRunner(cpds);
//查询一行中的一列内容 默认第一行第一列
Object user = qr.query("select * from user ", new ScalarHandler("username"));
System.out.println(user);
}
1.MapHandler 返回一行数据 使用键值对 键(列名) =值(列值)
2.MapListHandler 返回多行数据
@Test
/**
* 查询一行数据
* @throws SQLException
*/
public void method1() throws SQLException{
ComboPooledDataSource cpds=new ComboPooledDataSource();
QueryRunner qr=new QueryRunner(cpds);
//查询一行中的一列内容 默认第一行第一列
Map<String, Object> map = qr.query("select * from user ", new MapHandler());
System.out.println(map);
}
@Test
/**
* 查询多行数据
* @throws SQLException
*/
public void method1() throws SQLException{
ComboPooledDataSource cpds=new ComboPooledDataSource();
QueryRunner qr=new QueryRunner(cpds);
//查询一行中的一列内容 默认第一行第一列
List<Map<String, Object>> map = qr.query("select * from user ", new MapListHandler());
for (Map<String, Object> map2 : map) {
System.out.println(map2);
}
}
1.keyedhandler 返回多条数据
@Test
/**
*
* @throws SQLException
*/
public void method1() throws SQLException{
ComboPooledDataSource cpds=new ComboPooledDataSource();
QueryRunner qr=new QueryRunner(cpds);
Map<Object, Map<String, Object>> map = qr.query("select * from user", new KeyedHandler("username")); //以username列作为最右边一列进行返回
for (Object keyo : map.keySet()) {
Set<String> set = map.get(keyo).keySet();
System.out.println(keyo+" "+map.get(keyo));
}
}
qqq{id=31, username=qqq, password=44444}
77{id=34, username=77, password=3333}
zhouxingxing{id=32, username=zhouxingxing, password=4564}
O{id=29, username=O, password=3333}
OO{id=27, username=OO, password=3333}
pPPP{id=21, username=pPPP, password=3333}
张飞{id=19, username=张飞, password=10000}
7{id=35, username=7, password=3333}
关羽{id=18, username=关羽, password=13000}
zOOO{id=22, username=zOOO, password=3333}
zO{id=30, username=zO, password=3333}
8{id=36, username=8, password=3333}
zOO{id=28, username=zOO, password=3333}
88{id=33, username=88, password=88}
zZZ{id=20, username=zZZ, password=3333}
OOO{id=25, username=OOO, password=3333}
day16(jdbc进阶,jdbc之dbUtils)的更多相关文章
- JDBC总结(含DbUtils组件)
jdbc1. jdbc:使用java代码(程序)发送sql语句的技术2. jdbc的核心接口(查看API): java.sql Driver,DriverManger,Statement,Result ...
- JDBC连接池和DBUtils
本节内容: JDBC连接池 DBUtils 一.JDBC连接池 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采取连接池技术,来共享连接Conne ...
- JDBC终章- 使用 DBUtils实现增删查改- C3P0Utils数据源/QueryRunner runner连接数据源并执行sql
JDBC终章- 使用 DBUtils实现增删查改 1.数据库结构 Create Table CREATE TABLE `user` ( `id` ) NOT NULL AUTO_INCREMENT, ...
- Python之路,Day16 - Django 进阶
Python之路,Day16 - Django 进阶 本节内容 自定义template tags 中间件 CRSF 权限管理 分页 Django分页 https://docs.djangoproj ...
- JDBC实例--JDBC连接池技术解密,连接池对我们不再陌生
一.为什么我们要用连接池技术? 前面的数据库连接的建立及关闭资源的方法有些缺陷.统舱传统数据库访问方式:一次数据库访问对应一个物理连接,每次操作数据库都要打开.关闭该物理连接, 系统性能严重受损. 解 ...
- 线程池-连接池-JDBC实例-JDBC连接池技术
线程池和连接池 线程池的原理: 来看一下线程池究竟是怎么一回事?其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当客 ...
- JDBC学习笔记(9)——DBUtils的使用
使用DBUtils提供的功能需要使用commons-dbutils-1.6.jar这个JAR包,在Apache官网可以下载到 使用DBUtils进行更新操 测试QueryRunner类的update方 ...
- 【转】JDBC学习笔记(9)——DBUtils的使用
转自:http://www.cnblogs.com/ysw-go/ 使用DBUtils提供的功能需要使用commons-dbutils-1.6.jar这个JAR包,在Apache官网可以下载到 使用D ...
- JDBC开源框架:DBUtils使用入门
在单元测试过程中,只涉及到数据库的直接操作来验证业务逻辑是否正确的情况,DBUtils非常适合使用.它结构简单,包小,友好处理掉那些jdbc异常,让你更专注于业务代码,而非底层的操作.官网对它的定义: ...
随机推荐
- Win10 pip install gensim 报错处理
# 故障描述 shell > pip install gensim # 报错信息如下: Command "c:\users\op\appdata\local\programs\pyth ...
- EasyMock使用总结
最重要的事说在前面:遇到一个你不熟悉的知识,一定要去官网仔仔细细的看官方文档!一定要仔仔细细!一定要!(尔康鼻孔脸..) 正篇: 一.使用 首先,当然是添加依赖,有人用maven,有人用ant或者ma ...
- Delphi 解析系统环境变量
// http://www.outofmemory.cn function ExpandEnvironment(const strValue: string): string; var chrResu ...
- 如何打开Windows Server 2008 R2的域安全策略
今天安装了Windows Server 2008 R2系统,并且建了域环境,在添加新用户的时候,发现用简单的密码时域安全策略提示密码复杂度不够,于是我就想在域安全策略里面把密码复杂度降低一点,但是很快 ...
- 吴裕雄 python 数据处理(1)
import time print(time.time())print(time.localtime())print(time.strftime('%Y-%m-%d %X',time.localtim ...
- bootstrap中给表格设置display之后表格宽度变小问题解决
问题描述:bootstrap中给表格设置display之后表格宽度变小了 解决方案:给表格加上 display:table样式就可以了.
- appcan更新
升级用到了config.xml文件中配置的‘更新地址‘所填写的url,此url开发者可任意配置自己的服务器地址* 当app执行uexWidget.checkUpdate()时,AppCan会请求上述u ...
- django1.8模板位置的设置setting.py
大多数django教程比较老,给出的template的设置方案为: 更改工程下的setting.py文件, TEMPLATE_DIRS = ( os.path.join( APP_DIR, ' ...
- Spring简单获得实体类的实例, 使用ApplicationContext()方法的几点注意事项
今天接触了Spring的初步用法, 感觉跟实例化实体类没啥区别, 像这种简单的代码还不如直接实例化来的方便, 这样使用Spring的话总共需要三个文件 第一个当然是一个实体类了, 定义好属性, get ...
- VMware安装Windows注意
安装Windows通用步骤,分区,重建分区表,重写MBR引导.安装即可. VMware安装Windows 如果进不了CM/ROM,在.vmx文件里: 加入一行:bios.forceSetupOnce ...