JDBC与连接池技术

JDBC与连接池技术

JDBC

JDBC基本概念

JDBC基本概念
Java DataBase 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.setObject(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)配置文件(一般使用xml)
 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, Object> map = template.queryForMap(sql, 1001);
   -queryForList():查询结果将结果集封装为list结合(了解)
	!!!查询的结果为多条(row>1),将字段封装为LIST<MAP<String,Object>>
	例:
	 String sql = "SELECT * FROM emp";
     List<Map<String, Object>> 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));
	-queryForObject:查询结果,将结果封装为对象*****
	 !!!查询一个值,一般和聚合函数一起用
	 例:
       String sql = "select count(id) from emp"
	   Long total = template.queryForObject(sql,Long.class);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值