JDBC
JDBC:java语言操作所有关系型数据库的一套API
快速入门
导入架包
//记得导入架包
public class Test {
public static void main(String[] args) throws Exception {
String url="jdbc:mysql://127.0.0.1:3306/itcast";
String usename="root";
String password="123456";
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
Connection conn=DriverManager.getConnection(url,usename,password);//返回connection对象
//3.定义sql语句
String sql="update emp set age=30 where name='柳岩'";
//4.获取执行sql的对象Statement
Statement stmt=conn.createStatement();
int count=stmt.executeUpdate(sql);//返回影响行数
System.out.println(count);
//5.释放资源
stmt.close();
conn.close();
}
}
常用API
DriverManager驱动管理类
1.注册驱动
DriverManager.registerDriver在 Class.forName("com.mysql.jdbc.Driver")静态代码块中//mysql5之后这段代码不写也行
2.获取数据库连接
DriverManager.getConnection(url,usename,password)返回Connection对象
url="jdbc:mysql://ip地址(域名):端口号/数据库名?参数键值对1&参数键值对2...."
注意事项:
1.例如url="jdbc:mysql://127.0.0.1:3306/test"(本机ip,默认端口可以省略,如:"jdbc:mysql:///test")
2.配置useSSL=false参数,禁用安全连接方式,解决警告提示,如url="jdbc:mysql://127.0.0.1:3306/test?useSSL=false"
Connection数据库连接对象
1.获取执行sql的对象
普通执行SQL对象:
Statement createStatement()
Statement stmt=conn.createStatement()//conn为建立连接返回的Connection对象
预编译sql的执行sql对象:防止sql注入
PrepareStatement prepareStatement(sql)
执行存储过程对象
CallableStatement prepareCall(sql)
2.管理事务
对比MySQL中的事务管理:
开启事务:begin;或者start transaction;
提交事务:commit;
回滚事务:rollback;
MySQL默认自动提交事务
JDBC事务管理:Connection接口中定义了3个对应的方法
开启事务:setAutoCommit(boolean autoCommit):true为自动提交事务,false为手动提交,即为开启事务
提交事务:commit
回滚事务:rollback
例如
在sql语句执行之前开启事务
try{
conn.setAutoCommit(false);//开启事务
//执行sql语句
conn.commit();//没有错误,提交事务
}catch(Exception throwables){
conn.rollback();//出现错误,回滚事务
}
Statement执行sql语句
int executeUpdate(sql);//执行DML,DDL语句
返回值:int
(1)DML语句影响行数
(2)DDL语句执行后,执行成功也可能返回0(一般不报异常就执行成功了)
ResultSet executeQuery(sql);//执行DQL语句
返回值:ResultSet结果集对象
ResultSet获取结果数据
获取查询结果数据:
boolean next();(1)将光标(初始在数据行上一行)从当前位置向前移动一行(2)判断当前行是否为有效行
返回值:(1)true有效行,当前行数据有效(2)false无效行,当前行没有数据
*** get***(参数):获取数据
***:数据类型;如:int getInt(参数);String getString(参数);
参数两种:(1)int:列的编号,从1开始 或者(2)String :列的名称
如:
1.注册驱动
2.获取连接
3.定义sql
String sql="select * from emp";
4.获取Statement对象
Statement stmt=conn.createStatement();
5.执行sql语句
ResultSet rs=stmt.executeQuery(sql);
6.处理结果
List<Account> list=new ArrayList<>();//创建集合
while(rs.next()){//光标向下移动一行,且判断当前行是否有数据
//获取数据;
//int id=rs.getInt(1);//getInt("id")
//int name=rs.getString(2);
Account ac=new Account();//创建对象
ac.setId(id);
ac.setName(name);
list.add(ac);
}
7.释放资源
rs.close();
stmt.close();
conn.close();
PreparedStatement防止sql注入
作用:预编译sql并执行sql语句
(1)获取PrepareStatement对象
//sql语句中的参数值,使用?占位符代替
String sql="select * from user where usename=? and password=?";//防止sql注入
//通过Connection 对象获取,并传入对应的sql语句
PreparedStatement pstmt=conn.prepareStatement(sql);//获取执行sql语句对象时,传入sql语句
(2)设置参数
PreparedStatement对象:set***(参数1,参数2):给?赋值
***:数据类型;如setInt(参数1,参数2)
参数:
参数1:?的位置编号,从1开始
参数2:?的值
(3)执行sql
executeUpdate();/executeQuery();:不需要再传递参数
例如:
//注册驱动
//设置连接
String name="****";
String password="*****";
定义sql
String sql="select * from tb_user where usename=? and password=?";
//获取pstmt对象
PreparedStatement pstmt=conn.prepareStatement(sql);
//设置?的值
pstmt.setString(1,name);
pstmt.setString(2,password);
//执行sql语句
Resultset rs=pstmt.executeQuery();
if(rs.next()){
//成功
}
else{
//失败
}
//释放资源
rs.close();
pstmt.close();
conn.close();
数据库连接池
简介:
数据库连接池是个容器负责分配、管理数据库连接
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
好处:
资源重用
提高系统响应速度
避免数据库连接遗漏
数据库连接池实现
标准接口:DateSourse
官方提供的数据库连接池标准接口,由第三方组织实现此接口
功能:获取连接
Connection getConnection()
常见的数据库连接池:DBCP、C3P0、Druid(常用)
配置文件: