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}
05-11 16:04