黑马程序员技术交流社区
标题:
【数据库02】-JDBC
[打印本页]
作者:
tianhaolin
时间:
2018-12-10 09:25
标题:
【数据库02】-JDBC
本帖最后由 tianhaolin 于 2018-12-10 09:26 编辑
JDBC
一、JDBC基本概念
1.JDBC
:Java DataBase Connectivity:Java 数据库连接
2.JDBC的本质:
JDBC是官方(SUN)定义的一套操作所有关系型数据库的规范及接口
各个数据库厂商去实现这套接口,提供数据库驱动jar包.
我们可以使用这套接口编程,真正执行的代码是驱动jar包中的实现类
二、JDBC入门
1.快速入门
步骤:
前置条件:
导入驱动jar包:mysql-connector-java-5.1.37-bin.jar
**在modual下创建libs目录
**拷贝jar包到项目的libs目录下
**Add As Library
1)注册驱动
Class.forName("com.mysql.jdbc.Driver");
2)获取数据库连接对象 Connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名称",用户名,密码)
3)定义SQL语句
String sql = 注意SQL语句结尾不要加分号
获取执行sql语句的对象 Statement,PreparedStatement(一般使用这个类)
Statement stmt = conn.createStatement();
4)执行SQL,接收返回的结果
5)遍历结果,对结果进行操作
6)释放资源
2.DriverManager-驱动管理类
功能:
1)注册驱动
-static void register(Driver driver):注册给定的驱动程序 DrivrManager
Class.forName("com.mysql.jdbc.Driver")
Class类有静态代码块,使用了DriverManger的register方法
注意:MySQL5之后的jar包可以省略,建议不要省略
为什么不使用DriverManager注册?***
--DriverManager.registeDriver(new Driver()),而new Driver()时候Driver的静态代码块又注册了一次
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:密码
3.Connection-数据库连接 接口
功能:
1)获取执行SQL的对象
-Statement createStatement()
-PreparedStatement prepaereStatement(String sql)
2)管理事务
-开启事务 void setAutoCommit(boolean autoCommit):调用该方法设置参数为false,开启事务
-提交事务 void commit():提交事务
-回滚事务 void rollback():回滚事务
4.Statement-执行SQL的对象
功能:用于执行静态SQL语句并返回其生成结果对象
1)执行DML和DDL语句(DDL语句一般不使用jdbk)
-int excuteUpdate(String sql)
**返回值是影响的行数,可以通过影响的行数来判断DML语句是否执行成功
2)执行DQL语句(SELECT)
-ResultSet excuteQuery(String sql)
5.ResultSet-结果集对象
-boolean next():游标向下移动一行,判断当前行是否是最后一行末尾,如果是则返回false,否则返回true
-Xxx getXxx(参数):获取一列数据
**Xxx:代表数据类型 如Int getInt(), String getString()
**参数:
int:代表列的编号 注意:!!编号从1开始
String:代表列的名称
-遍历集合
注意:ResultSet结果集也是一个资源,在程序结束时需要释放
6.PreparedStatement-执行SQL的对象,是Statement的实现类****
功能:用于执行动态SQL语句并返回其生成结果对象
注意:PreparedStatement在操作大批量SQL语句时效率远远高于Statement,并且可以防止注入,后期使用PreparedStatement对象
1)SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全问题
例:SQL:SELECT * FROM user WHERE username = "adfafa" and password 'a' OR 'a' = 'a',会查出表的所有内容
2)解决sql注入问题
3)预编译的SQL:参数使用?号作为占位符
4)步骤:
-注册驱动
-获取数据库连接对象 Connection
-定义SQL语句***** ? 只可以在Value的位置
*注意:sql的参数使用?作为占位符,如:slect * from user where username = ? and password = ?
-获取PreparedStatement对象
PreparedStatement Connection.prepareStatement()
-给?赋值
*方法:setXxx(参数1,参数2)
*参数1:?的位置编号,从1开始
*参数2:?的值
-执行SQL,接收返回的结果
-遍历结果,对结果进行操作
-释放资源
7.抽取JDBC工具类:JDBCUtils
1)目的:简化书写
2)分析:
*注册驱动抽取
*抽取一个方法获取连接对象
*抽取一个方法释放资源
管理事务
操作:
1)开启事务
2)提交事务/回滚事务
2.使用Connection对象来管理事务
*开启事务:SetAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
在try中开启事务
*提交事务:commit();
在执行完后提交commit
*回滚事务:rollback();
在catch中rollback
一、数据库连接池--DataSource接口
1.概念
数据库连接池就是一个容器(集合),用于存放数据库连接,类似于线程池
用来管理连接Connection对象(驱动,url,username,password)
2.好处
1)节约资源
2)高效
3.实现
1)标准接口: DataSource javax.sql包下
*方法:
-获取连接:getConnection();
-归还连接:
如果连接对象Connection是从连接池中获取的,那么调用 Connection.close()方法,则不再关闭而是归还连接
2)一般我们不去实现它,有数据库厂商来实现
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)创建核心对象 DataSource ds = new ComboPooledDataSource()
4)获取连接
Connection con = ds.getConnection()
5.Druid数据库连接池--阿里巴巴
1)导入jar包:druid-1.0.9.jar
2)定义配置文件:
*是以properties形式的
*可以叫任意名称,需要手动导入
3)加载配置文件:
Properties property = new Properties(...)
4)获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(property)
5)获取连接
Connection con = ds.getConnection()
6.使用Druid定义工具类
二、JDBCTemplate -- > Spring JDBC******
1.概念:
Spring框架对JDBC的简单封装,提供了JDBCTemplte对象简化JDBC的开发
三大框架:
SSM
springMVC : web
spring : 核心
Mybatis : 操作数据库
SSH
struts2: web
spring :核心
hibernate:操作数据库
2.步骤:
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);
3.javaBean:
构造
属性私有
提供get/set方法
实现序列化接口(可以不写)
作者:
不二晨
时间:
2018-12-11 15:05
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2