JDBC与连接池技术

JDBC

JDBC基本概念

JDBC基本概念

Java Data  Connectivity

JDBC的本质

JDBC是官方(SUN公司)定义的一套操作所有关系型数据库的规范(接口)
数据库管理系统厂商去实现这套接口,提供数据库jar包

JDBC相关的类和方法

前置条件

导入数据库厂商实现的jar包
-在Module下创建libs文件夹,将jar包粘贴进去
-右键libs, Add As Library 选择Module

JDBC步骤

1) 注册驱动
  Class.forName(com.mysql.jdbc.Driver)
2) 获取连接对象
  Connection con = DriverManager.getConnection(\"jdbc:mysql://locoalhost:3306/数据库名称\",\"user\",\"password\")
3)创建SQL和执行对象
  String sql = \"SELECT * FROM 表名 WHERE 列名=值\"
  Statement stmt = con.createStatement();
  或
  String sql = \"SELECT * FROM 表名 WHERE 列名=?\"
  PreparedStatement pst = con.prepareStatement();
  pst.set (index,value)
4)执行SQL语句
  -当sql语句为DDL/DML
   int result = stmt.executeUpdate(sql)/pst.executeUpdate()
   注:DML成功返回影响的行数,失败返回0;DDL始终返回0
  -当sql语句为DQL
   ResultSet rs = stmt.executeQuery(sql)/pst.executeQuery();
5)处理结果集
6)释放资源
  rs.close()
  sttm/pst.close()
  con.close()
!!!第2步为什么不用DriverManager.registerDriver(new Driver())注册?
因为JDBC driver通过静态代码块在初始化时就注册了一次
使用registerDriver 在new Driver()会注册两次

DriverManager-驱动管理类

功能:
1)注册驱动
  -static void register(Driver driver):注册给定的驱动程序 DrivrManager
	 写代码:Class.forName(\"com.mysql.jdbc.Driver\")
     该Class类有静态代码块,使用了DriverManger的register方法
2)获取数据库连接
  -static Connection getConnection(String url,String user,String password)
   *参数:
     url:指定连接的路径
   *语法: jdbc:mysql://ip地址(域名):端口号/数据库名称
   *例子: jdbc:mysql://localhost:3306/db3
   *注意:如果连接是本机MySQL服务器而且端口号为3306,可以省略ip和端口jbdc:mysql:///db3
  -user:用户名
  -password:密码

Connection-数据库连接 接口

功能:
1)获取执行SQL的对象
   -Statement createStatement()
   -PreparedStatement prepaereStatement(String sql)
2)管理事务
   -开启事务  void setAutoCommit(booean b)
     autoCommit:调用该方法设置参数为false,开启事务
   -提交事务  void commit():提交事务
   -回滚事务  void rollback():回滚事务

Statement接口-执行SQL的对象

功能
1)执行DML和DDL语句(DDL语句一般不使用jdbk)
   -int excuteUpdate(String sql) 
     返回值是影响的行数,可以通过影响的行数来判断DML语句是否执行成功
2)执行DQL语句(SELECT)
   -ResultSet excuteQuery(String sql) 

ResultSet-结果集对象

作用:存储结果到结果集
   -boolean next():游标向下移动一行,判断当前行是否是最后一行末尾,如果是则返回false,否则返回true
   -Xxx getXxx(参数):获取一列数据
	 *Xxx:代表数据类型 如Int getInt(), String getString()
	 * 参数: 
		 int:代表列的编号  注意:!!编号从1开始
		 String:代表列的名称
	 *遍历集合
注意:ResultSet结果集也是一个资源,在程序结束时需要释放

PreparedStatement-执行SQL的对象,是Statement的实现类****

功能:用于执行动态SQL语句并返回其生成结果对象
!!注意:PreparedStatement在操作大批量SQL语句时效率远远高于Statement,并且可以防止注入,后期使用PreparedStatement对象
   -SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全问题
    例:SQL:SELECT * FROM user WHERE username = \"adfafa\" and password \'a\' OR \'a\' = \'a\',会查出表的所有内容
   -解决sql注入问题
   -预编译的SQL:参数使用?号作为占位符

事务控制

使用Connection对象来管理事务
-开启事务:SetAutoCommit(boolean b)
   autoCommit:调用该方法设置参数为false,即开启事务
   在try中开启事务
-提交事务:commit();
   在执行完后提交commit
-回滚事务:rollback();
   在catch中rollback

连接池技术

概念

数据库连接池就是一个容器(集合),用于存放数据库连接,类似于线程池
用来管理连接Connection对象(驱动,url,username,password)

连接池的实现

连接池的实现依赖于接口DataSource

C3P0连接池:使用人数最多

 1)导入jar包
 2)配置文件(一般使用 )
 3)获取DataSource对象
   DataSource ds =new ComboPooledDataSource()
 4)获取连接
   Connection con = ds.getConnection();
 5)释放资源回连接池
   con.close();
 注意:如果con是从连接池获得,close()方法是把连接返还给连接池

Druid连接池:阿里技术

 1)导入jar包
 2)配置文件(一般用properties文件)
 3)获取配置文件
  //创建Properties对象
  Properties pro = new Properties()
  //获取文件输入流
  InputStream is = 类.class.getClassLoader.getResourseAsStream(\".properties\")
  pro.load(is)
 4)创建DS对象
  DataSource ds = DruidDataSourceFactory.createDataSource(pro)
 5)获取连接
  Connection con = ds.getConnection();
 6)释放连接
  con.close()

JDBCTemplate

概念

  • Spring框架对JDBC的简单封装,提供了JDBCTemplte对象简化JDBC的开发
  • 注意:JDBCTemlate依赖于DataSource接口

步骤

 1)导入jar包
 2)创建JDBCTemplate对象,依赖于数据源DataSource
    *JdpcTemplate template = new JDBCTemplate(ds);
 3)调用方法来JDBCTemplate的方法来完成CRUD操作 
  -update():执行DML语句,增、删、改语句*****
	例:不需要释放资源,update(sql,?占位符... 参数...)
    String sql = \"update account set balance = 5000 where id = ?\";
	int count  = template.update(sql,3);
  -queryForMap():查询结果将结果集封装为map集合(了解)
	!!!查询的结果集长度(row)只能是1,将字段设置为KEY,值为Value
	例:
	 String sql = \"SELECT * FROM emp WHERE id = ?\";
     Map<String,  > map = template.queryForMap(sql, 1001);
   -queryForList():查询结果将结果集封装为list结合(了解)
	!!!查询的结果为多条(row>1),将字段封装为LIST<MAP<String, >>
	例:
	 String sql = \"SELECT * FROM emp\";
     List<Map<String,  >> maps = template.queryForList(sql);
    -query():查询结果,将结果封装为JavaBean对象*****
	!!!查询的结果封装为对象集合
    !!!query(sql,RowMapper,?占位符... 参数...)
	!!!RowMapper是一个接口,可以直接重写其中的mapRow方法,但是一般不这么做,太麻烦
	!!!一般使用Template定义好的实现类,如:BeanPropertyRowMapper,可以实现JavaBean自动封装
		 BeanPropertyRowMapper<T> (Class<T> mappedClass);
    例:
	   String sql = \"SELECT * FROM emp\";
       List<Emp> list = template.query(sql,new BeanPropertyRowMapper<Emp>(Emp.class));
	-queryFor :查询结果,将结果封装为对象*****
	 !!!查询一个值,一般和聚合函数一起用
	 例:
       String sql = \"select count(id) from emp\"
	   Long total = template.queryFor (sql,Long.class);
收藏 打印