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);