day06【JDBC连接池&JDBCTemplate】

今日内容

  • 数据库连接池
  • Spring JDBC : JDBC Template

1 数据库连接池

1.1 概念

其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

1.2 好处:

  1. 节约资源
  2. 用户访问高效

1.3 实现:

  1. 标准接口:DataSource javax.sql包下的
    • 获取连接:getConnection()
    • 归还连接:Connection.close()
      *如果连接对象Connection是连接池中获取的,那么调用Connection.close()方法不会关闭连接,而是归还到连接池。
  2. 一般我们不去实现它,由数据库厂商来实现
    • C3P0:连接池旧技术,不常用
    • Druid:阿里巴巴提供的新技术,效率更高

1.4 C3P0:数据库连接池技术

  1. 导入jar包
    • c3p0-0.9.5.2.jar
    • mchange-commons-java-0.2.12.jar
    • 数据库驱动jar包
  2. 定义配置文件:
    • 名称:c3p0.properties 或者 c3p0-config.xml
    • 路径:直接放到src目录下即可
  3. 创建数据库连接池对象
    ComboPooledDataSource
  4. 获取连接:
    getConnection
    //1. 创建数据库连接池对象
    DataSource ds = new ComboPooledDataSource();
    //2. 获取连接对象
    Connection conn = ds.getConnection();
    

1.5 Druid:数据库连接池技术(阿里)

  1. 导入jar包
    druid-1.0.9.jar
  2. 定义配置文件
    • 是properties形式的
    • 可以叫任意名称,可以房子任意目录
  3. 加载配置文件。Properties
  4. 获取数据库连接池对象:通过DruidDataSourceFactory工厂来获取
  5. 获取连接:getConnection
    //3. 加载配置文件
    Properties pro = new Properties();
    InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
    pro.load(is);
    //4. 获取连接池对象
    DataSource ds = DruidDataSourceFactory.createDataSource(pro);
    //5. 获取连接
    Connection conn = ds.getConnection();
    
    
  • 定义工具类
  1. 定义一个类 JDBCUtils
  2. 提供静态代码块加载配置文件,初始化连接池对象
  3. 获取连接池的方法
    public class JDBCUtils {
    	//1. 定义成员变量 DataSource
    	private static DataSource ds;
    	static {
    		try {
    			//1. 加载配置文件
    			Properties pro = new Properties();
    			pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
    			//2. 获取DataSource
    			ds = DruidDataSourceFactory.createDataSource(pro);
    			} catch (IOEXception e) {
    				e.printStackTrace();
    			} catch (Exception e) {
    				e.printStackTrance();
    			}
    		}
    	//获取连接
    	public static Connection getConnection() throw SQLException {
    		return ds.getConnection();
    	}
    	//释放资源
    	public static void close(Statement stmt,Connection conn){
    	       /* if(stmt != null){
    	            try {
    	                stmt.close();
    	            } catch (SQLException e) {
    	                e.printStackTrace();
    	            }
    	        }
    	
    	        if(conn != null){
    	            try {
    	                conn.close();//归还连接
    	            } catch (SQLException e) {
    	                e.printStackTrace();
    	            }
    	        }*/
    	
    	   close(null,stmt,conn);
    	}
    	public static void close(ResultSet rs , Statement stmt, Connection conn){
    	if(rs != null){
    	            try {
    	                rs.close();
    	            } catch (SQLException e) {
    	                e.printStackTrace();
    	            }
    	 }
    	  if(stmt != null){
    	            try {
    	                stmt.close();
    	            } catch (SQLException e) {
    	                e.printStackTrace();
    	            }
    	        }
    	
           if(conn != null){
                try {
                    conn.close();//归还连接
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        //获取连接池方法
        public static DataSource getDataSource() {
        	return ds;
        }
     }
    

2 Spring JDBC

Spring框架对JDBC的简单封装。提供了JDBCTemplate对象简化JDBC的开发

2.1 导入jar包

2.2 创建JdbcTemplate对象。依赖数据源DataSoure

JdbcTemplate template = new JdbcTemplate(ds);

2.3 调用JdbcTemplate的方法完成CRUD的操作

  1. update():执行DML增删改语句。
  2. queryForMap():查询并将这条结果封装为Map集合,列名作为key,值作为value
    *查询的结果集长度只能是1
  3. queryForList():查询并将结果集封装为list集合
    *每一条记录都是一个Map集合,再将Map集合装载到List集合
  4. query():查询并将结果封装为JavaBean对象
    *参数:RowMapper
    *一般使用BeanPropertyRowMapper实现类,可以完成数据到JavaBean的自动封装,基本数据类型直接使用:类型.class
    new BeanPropertyRowMapper<类型>(类型.class)
  5. queryForObject:查询并将结果封装为对象
    *一般用于聚合函数的查询,返回一行。
    public class JdbcTemplateDemo02 {
    	//1. 获取JDBCTemplate对象
    		private JdbcTemplate template = new JdbcTemplate(JDBCUtiles.getDataSource());
    		
    		//修改1号数据的salary为10000
    		@Test
    		public void test1() {
    		String sql = "update emp set salary = 10000 where id = 1";
    		template.update(sql);
    		}
    		//添加一条记录
    		@Test
    		public void test2() {
    		String sql = "insert into emp(id,name,dept_id) values(?,?,?)";
    		template.update(sql,1015,"爸爸",10);
    		}
    		//删除刚才添加的记录
    		@Test
    		public void test3() {
    		String sql = "delect from emp where id = ?";
    		template.update(sql,1015);
    		}
    		//查询id为1001的记录,将其封装为Map集合
    		@Test
    		public void test4() {
    		String sql = "select * from emp where id = ?";
    		Map<String,Object> map = template.qureyForMap(sql,1001);
    		}
    		//查询所有记录,将其封装为List
    		@Test
    		public void test5() {
    		String sql = "select * from emp";
    		List<Map<String,Object>> list = template.queryForList(sql);
    		for(Map<String,Object> map,list) {
    		sout(map);
    			}
    		}
    		//查询所有记录,将其封装为Emp对象的List集合
    		@Test
    		public void test6() {
    		String sql = "select * from emp";
    		List<Emp> list = template.query(sql,new BeanPropertyRowMapper<Emp>(Emp.class));
    		for(Emp emp : list) {
    		sout(emp);
    			}
    		}
    		//查询总记录数
    		@Test
    		public void test7() {
    		String sql = "select count(id) from emp";
    		Long total = template.queryForObject(sql,Long.class);
    		}
    	}
    

你可能感兴趣的:(JAVAWeb)