1.概念:
java DataBase Connectivity java 数据库连接,java语言操作数据库
的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包,用户可以使用这套接口编程,真正执行的代码是驱动jar包中的实现类。
2.入门
步骤:
1.导入驱动jar包 mysql-connector-java-(版本号 具体要根据你的mysql版本)-bin.jar
1.复制mysql-connector....jar到项目lib目录下
2.add as library(如果使用maven,不需要这个步骤)
2.注册驱动
Class.forName("com.mysql.jdbc.Driver"); 或者Class.forName("com.mysql.cj.jdbc.Driver");
3。获取数据库连接对象 Connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名称", "用户名", "密码");
4.定义sql
String sql = "";
5.获取执行sql语句的对象statement
Statement stmt = conn.createStatement();
6.执行sql,接收返回结果
int count = stmt.executeUpdate(sql);
7.处理结果
8.释放资源
stmt.close();
conn.close();
3.各个对象
1.DriverManager:驱动管理对象
功能:
1.注册驱动:告诉程序该使用哪一个数据库驱动jar(mysql15之后可以省略注册驱动的步骤)
2.获取数据库连接:
方法:static Connection getConnection(String url,String user,String password)
参数:
url:指定连接的路径
语法:jdbc:mysql://ip地址:端口号/数据库名称
例:jdbc:mysql://localhost:3306/db1
如果连接的是本机mysql服务器,可以简写为jdbc:mysql:///db1
user:用户名
password:密码
2.Connection:数据库连接对象
功能:
1.获取执行sql的对象
Statement createStatement()
PreparedStatement prepareStatement(String sql)
2.管理事务
开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
提交事务:commit()
回滚事务:rollback()
3.Statement:执行sql的对象
1.执行sql
1.boolean execute(String sql):可以执行任意的sql
2.int executeUpdate(String sql):执行DML(insert\update\delete)语句、DDL(create\alter\drop)语句
返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0则执行成功,反之,则失败。
3.ResultSet executeQuery(String sql):执行DQL(select)语句
4.ResultSet:结果集对象,封装查询结果
boolean next():游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
getXXX(参数):获取数据
XXx:代表数据类型 如:int getInt(),String getString()
参数:
1.int 代表列的编号,从1开始 如:getString(1)
2.String:代表列名称 如:getDouble("balance")
使用步骤:
1、游标向下移动一行
2.判断是否有数据
3.获取数据
5.PreparedStatement:执行sql的对象
1.SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题
2.解决sql注入问题:使用PreparedStatement对象来解决
3.预编译的sql:参数使用?作为占位符
4.步骤
1、导入驱动jar包
2、注册驱动
3、获取数据库连接对象
4、定义sql
5、获取执行sql语句的对象
6、给?赋值
方法:setXxx(参数1,参数2)
参数1:?的位置编号 从1开始
参数2:?的值
7、执行sql,接受返回结果,不需要传递sql语句
8、处理结果
9、释放资源
使用PreparedStatement来完成增删查改的所有操作优点:1、可以防止sql注入 2、效率更高
JDBC工具类:JDBCUtils
目的:简化书写
方法:配置文件 xxxx.properties
代码实现:
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
private static DataSource ds;
static {
Properties pro=new Properties();
ClassLoader classLoader=JDBCUtils.class.getClassLoader();
URL res=classLoader.getResource("druid.properties");
String path=res.getPath();
try {
pro.load(new FileReader(path));
} catch (IOException e) {
e.printStackTrace();
}
url=pro.getProperty("url");
user=pro.getProperty("user");
password=pro.getProperty("password");
driver=pro.getProperty("driver");
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
public static void close(Statement stmt, Connection conn){
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet rs,Statement stmt,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
JDBC控制事务
1.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
2.操作:
1.开启事务
2.提交事务
3.回滚事务
3.使用Connection对象来管理事务
开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
在执行sql之前开启事务
提交事务:commit()
当所有sql都执行完提交事务
回滚事务:rollback()
在catch中回滚事务
代码举例:
public class JDBCDemo {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt1 = null;
PreparedStatement pstmt2 = null;
try {
//1.获取连接
conn = JDBCUtils.getConnection();
//开启事务
conn.setAutoCommit(false);
//2.定义sql
String sql1 = "update account set balance = balance - ? where id = ?";
String sql2 = "update account set balance = balance + ? where id = ?";
//3.获取执行sql对象
pstmt1 = conn.prepareStatement(sql1);
pstmt2 = conn.prepareStatement(sql2);
//4. 设置参数
pstmt1.setDouble(1,500);
pstmt1.setInt(2,1);
pstmt2.setDouble(1,500);
pstmt2.setInt(2,2);
//5.执行sql
pstmt1.executeUpdate();
// 手动制造异常,体会事务
int i = 300/0;
pstmt2.executeUpdate();
//提交事务
conn.commit();
} catch (Exception e) {
//事务回滚
try {
if(conn != null) {
conn.rollback();
}
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
JDBCUtils.close(pstmt1,conn);
JDBCUtils.close(pstmt2,null);
}
}
}
数据库连接池
1.概念:一个容器(集合),存放数据库连接的容器。当系统初始化完成之后,容器被创建,容器会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问问完之后,会将连接对象归还给容器。
2.优点:节约资源、用户访问高效
3.实现:
1.标准接口:DataSource
1.方法:
获取连接:getConnection()
归还连接(释放资源):Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了,而是归还连接。
2.在之后的工作中,一般是不自己手写,由数据库厂商实现,例如阿里巴巴
1.C3P0:数据库连接池技术
2.Druid:数据库连接池实现技术(注意是实现技术),由阿里巴巴提供
4.C3P0:数据库连接池技术
步骤:
1.导入jar包:c3p0-xxx.jar 和mchange-commons-java-xxx.jar (数据库驱动jar包不能落下)
2.定义配置文件:
名称:一般为c3p0.properties或者使用xml c3p0-config.xml
路径:直接将文件放在项目的src目录下
3.创建核心对象: 数据库连接对象 ComboPooledDataSource
4.获取连接:getConnection
5.Druid:数据库连接池实现技术(使用较多)
1.步骤:
1.导入jar包 druid-xxx.jar
2.定义配置文件:xxx.properties ,可以放在任意目录下
3.加载配置文件。proerties
4.获取数据库连接池对象: DruidDataSourceFactory
5.获取连接:getConnection
2.定义工具类
1.定义类 JDBCUtils
2.童工静态代码块加载配置文件,初始化连接池对象
3.提供方法
1.获取连接方法:通过数据库连接池获取连接
2.释放资源
3.获取连接池的方法
4.代码实现 参照JDBC工具类的代码实现
Spring JDBC
Spring框架对JDBC的简单封装。提供一个JDBCTemplate对象简化JDBC的开发
步骤:
1.导入jar包
2.创建jdbcTempllate对象,依赖于数据源DataSource
jdbcTemplate template=new jdbcTemplate(ds);
3.调用jdbcTemplate的方法来完成增删查改的操作
update() 执行DML语句
queryForMap()查询结果将结果集封装为map集合,将列名作为key,将值作为value将这条记录封装为一个map集合(该方法查询的结果集长度只能是1)
queryForList() 查询结果将结果封装为list集合 (将每一条记录封装为一个map集合,再将map集合装载到list集合中
query()查询结果,将结果封装为javaBean对象
参数:RowMapper
一般使用BeanPropertyRowMapper实现类,可以完成数据到javaBean的自动封装
new BeanPropertyRowMapper<类型》
queryForObject:查询结果,将结果封装为对象
一般用于聚合函数的查询