JDBC:
概念:Java数据库连接,Java语言操作数据库
JDBC本质:其实是官方定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商其实现这套接口,提供数据库驱动jar包。我们可以使用这套接口编程,真正执行的代码是驱动jar包中的实现类
快速入门:
1、导入驱动jar包
2、注册驱动
3、获取数据库连接对象 connection
4、定义SQL语句
5、获取执行SQL语句的对象 statement
6、执行SQL,接收返回结果
7、处理结果
8、释放资源
示例代码:
public class Demo { public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db?useSSL=false","root","123"); String sql = "select * from Student"; Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery(sql); stmt.close();; connection.close(); } }
详解JDBC:
1、DriverManager,驱动管理对象
功能:1、注册驱动:告诉程序该使用哪一个数据库驱动jar
static void registerDriver(Driver driver):注册与给定的驱动程序 DriverManager
写代码使用 Class.forName("com.mysql.jdbc.Driver");
在com.mysql.jdbc.Driver类中存在静态代码块
static{
java.sql.DriverManager.registerDriver(new Driver());
}catch(SQLException E){
thorw new RuntimeException("Can't register driver");
}
注意:mysql 5 之后的驱动jar包可以省略注册驱动的步骤
2、获取数据库连接
方法:static Connection getConnection(String url,string user,string password)
参数:1、url:指定连接的路径
语法: jdbc:mysql://ip地址(域名):端口号/数据库名称
例如:jdbc:mysql://localhost:3306/db
注意:如果连接的是本机地址,端口号为3306,那么可以省略不写
2、user:用户名
3、password:密码
2、Connection,数据库连接对象
1、获取执行SQL的对象Statement
statement createStatement();
preparStatement prepareStatement()
2、管理事务
开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
提交事务:commit()
回滚事务:rollback()
3、Statement,执行SQL对象
执行sql:1、boolean execute(String sql),可以执行任意的sql
2、int executeUpdate(string sql),执行DML(Update,insert,delete),DDL(create,alter,drop),返回值为影响行数
3、ResultSet executeQuery(string sql),执行DQL(select)
4、ResultSet,结果集对象,封装查询结果
next():游标向下移动一行,判断当前行是否是最后一行末尾,如果是返回false,不是返回true
getXXX(参数):获取数据
参数:int:代表列的编号,从1开始,如:getString(1);
String :代表列的名称 ,如:getDouble(“balance”)
使用步骤:1、游标向下移动一行
2、判断是否有数据
3、获取数据
while(rs.next()){int id = rs.getInt(1);}
5、PreparedStatement,执行SQL对象,Statement子类
解决问题:SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题
预编译SQL:参数使用?作为占位符
步骤:1、导入驱动jar包
2、注册驱动
3、获取数据库连接对象 Connection
4、定义sql
5、获取执行sql语句对象 preparedStatement Connection.prepaereStatement(String sql)
6、给?赋值:setXXX(参数1,参数2):参数1:?的位置编号,从1开始,参数2:?的值
7、执行sql,接受返回结果,不需要传递sql语句
8、处理结果
9、释放资源
注意:后期都会使用preparedStatement来完成增删改查的所有操作
1、可以防止SQL注入
2、效率更高
public class Demo { public static void main(String[] args) throws Exception{ Statement stme = null; Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); String sql="insert into Student value ('dd',18,'1992-07-05','1992-07-05')"; conn=DriverManager.getConnection("jdbc:mysql:///db?useSSL=false","root","123"); stme=conn.createStatement(); int count =stme.executeUpdate(sql); if (count>0){ System.out.println("成功"); }else { System.out.println("失败"); } }catch (Exception e){ e.printStackTrace(); } if (conn != null){ try { conn.close(); }catch (Exception e){ e.printStackTrace(); } } } }
JDBC控制事务:
使用Connection对象来管理事务
开启事务:在执行sql之前开启事务
提交事务:当所有sql都执行完提交事务
回滚事务:在catch中回滚事务
数据库连接池:
概念:就是一个容器,存放数据库连接的容器,当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完以后,会将连接对象归还给容器
好处:1、节约资源
2、用户访问高效
实现:标准接口:DataSource
方法:1、获取连接:getConnection()
2、归还连接:Connection.close()。如果连接对象是从数据库连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接,而是归还连接
一般我们不去实现它,有数据库厂商来实现
1、C3P0
使用步骤:1、导入jar包,c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar
注意还需要导入数据库驱动包
2、定义配置文件
名称:c3p0.properties 或者 c3p0-config.xml
路径:直接将文件放到src目录下即可
3、创建核心对象, 数据库连接池对象 combopooledDataSource
4、获取连接:getConnection
2、Druid
使用步骤:1、导入jar包,druid-1.0.9.jar
2、定义配置文件,注意:配置文件格式为priperties ,可以叫任意名字,放置在任意目录下
3、加载配置文件,Properties
4、获取数据库连接池对象:通过工厂来获取,DruidDataSourceFactory
5、获取连接,getConnection
JDBCTemplate:
spring 框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC的开发
步骤:1、导入jar包
2、创建jdbcTemplate对象。依赖于数据源DataSource
jdbcTemplate template = new jabcTemplate(ds);
3、调用jdbcTemplate的方法完成CRUD的操作
1、update():执行DML语句,增,删,改语句
2、queryForMap():查询结果将结果集封装为map集合,结果集长度只能是1。
3、queryForList():查询结果将结果封装为list集合,将每一条记录封装问map集合,再添加到list集合
4、qurey():查询结果,将结果封装为JavaBean对象
参数:RowMapper
一般我们使用BeanPropertyRowMapper实现类,实现自动封装
例如:new BeanpropertyRowMapper<类型>(类型.class)
5、queryForObject:查询结果,将结果封装为对象
一般用于聚合函数的查询结果