- 面向接口编程概念: (接口:规范)屏蔽了各个数据库之间的差异; 操作思想:通过jdbc中的接口,从驱动中取出实现类,调用实现类的重写方法,由他们操作数据库.
- JDBC开发的步骤
- JDBC里面接口和类的作用
SUN公司定义了一套操作所有关系型数据库的规则(接口),各个数据库厂商去实现这套接口,提供数据库驱动Jar包.我们可以使用这套接口(JDBC)编程,真正执行的是驱动Jar包中的实现类;
驱动:两个设备之间通信的桥梁,电脑的驱动就是让计算机能够识别硬件;
数据库的驱动:JDBC的实现类,由各个数据库厂商提供的.
1. 导入驱动jar包
2. 注册驱动
3. 获取数据库的连接对象 Connection
4. 定义sql语句
5. 获取执行sql的对象Statement语句
6. 执行sql,接受返回结果
7. 处理结果
8. 释放资源
/*1.导入jar包
a.复制jar包到项目的新建libs目录下
b.右键Add As Libraray
*/
//2.注册驱动
Class.forName(“com.mysql.jdbc.Driver”);
//3.获取连接
Connection conn = DriverManager.getConnection(jdbc:mysql://localhost:3306/mydb3,”root”,”root”);
//4.操作sql
//编写sql语句
String sql = “update student set age = 18 where id = 1”;
//获取执行sql的Statement对象
Statement stmt = conn.createStatement();
//执行sql
int count = stmt.executeUpdate(sql);
//处理结果
System.out.println(count);
//5.释放资源
stmt.close();
conn.close();
//代码:
Class.forName(“com.mysql.jdbc.Driver”);
static void registerDriver(Driver driver):
//注册与给定的驱动程序注册驱动;
//查看源码,发现在”com.mysql.jdbc.Driver”类中有一个静态代码块;
static{
try{
java.sql.DriverManager.registerDriver(new driver());
}catch(SQLException e){
e.printStackTrace();
}
}
方法:static Connection getConnection(String url,String user,String password)
URL: 协议名:子协议名://ip地址:端口号/数据库名 如果访问的是本地数据库,则可以省略ip地址和端口号
eg: jdbc:mysql:///数据库名
//1.获取执行sql的对象
Statement createStatement():
PrepareStatement prepareStatement(String sql):
//2.管理事务:
//开启事务:
setAutoCommit(boolean autoCommit)
//回滚事务:
rollback()
//提交事务:
commit()
1. boolean execute(String sql): (了解)可以执行任意的sql
2. int executeUpdate(String sql): --- 增删改
执行DML(insert,update,delete)语句/DDL(create,alter,drop)语句
int: 影响的行数 ---可以判断DML语句是否执行成功,返回值>0则执行成功
3. ResultSet executeQuery(String sql) --- 查询语句
执行DQL(select)语句
[补充] 快捷键: ctrl alt + T: 快速try catch finally
1. boolean next(): 游标向下移动一行
判断当前行是否是最后一行(是否有数据),如果有则返回true,反之false;
2. getXxx(参数): 获取数据 Xxx: 数据类型
eg: getInt() getString()
参数:
int: 代表列的编号 ,从1开始 eg: getString(1)
String: 代表列的名称 eg: getInt(“age”)
注意:
使用步骤:
1. 游标向下移动一行
2. 判断是否有数据
3. 获取数据
封装查询到的数据到JavaBean注意事项:
1. JavaBean的属性名要和表中的列名一致
2. JavaBean的属性数据类型要和表中的一致
1. sql的注入问题:
在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题;
2. 解决sql注入问题:使用PreparedStatement对象来解决,
参数使用?作为占位符
步骤:
1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
2. 注册驱动
3. 获取数据库连接对象 Connection
4. 定义sql
注意:sql的参数使用?作为占位符。
如:select * from user where username = ? and password = ?;5. 获取执行sql语句的对象
PreparedStatement ps = Connection.prepareStatement(String sql)
6. 给?赋值:
- 方法: setXxx(参数1,参数2)
- 参数1:?的位置编号 从1 开始
- 参数2:?的值
7. 执行sql,接受返回结果,不需要传递sql语句
8. 处理结果
9. 释放资源
注意:后期都会使用PreparedStatement来完成增删改查的所有操作(可以防止SQL注入 / 效率更高)
目的:简化书写
//1. 抽取注册驱动的代码 (使用静态代码块)
private static String driver;
private static String url;
private static String user;
private static String password;
static{
try{
//(URL,USER,PASSWORD,DRIVER是需要修改的内容,可以都放入配置文件内,然后将配置文件放在**src**文件下)
//1. 创建Properties对象
Properties pro = new Properties();
//2. 加载配置文件
ClassLoader cl = JDBCUTils.class.getClassLoader();
InputStream is=cl.getResourceAsStream("jdbc.properties");
pro.load(is);
//3. 获取数据并赋值
//注意:key值都要和配置文件的一一对应
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//4. 替换数据
/*将“com.mysql.jdbc.Driver”替换为driver;
将“jdbc:mysql://localhost:3306/myjdbc”替换为url;
将”root”替换为user;
将”root”替换为password;*/
Class.forName("com.mysql.jdbc.Driver");
}catch(SQLException e){
e.printStackTrace();
}
}
//2. 抽取获取连接对象的方法
public static Connection getConnection(){
return DriverManager.getConnection("jdbc:mysql://localhost:3306/myjdbc","root","密码")
}
//3. 抽取释放资源的方法
public static void close(Connection conn,Statement stmt){
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,Connection conn,Statement stmt){
if(conn != null){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
close(conn,stmt);
}
1. 开启事务:setAutoCommit(boolean autoCommit) :
调用该方法设置参数为false,即开启事务 在执行sql之前开启事务
2. 提交事务:commit()
当所有sql都执行完提交事务
3. 回滚事务:rollback()
在catch中回滚事务