JDBC是什么?
JDBC(java database connectivity):java数据库连接,也称:java语言操作数据库。官方定义的一套操作所有关系型数据库的规则(一套接口),各个数据库产商要实现这套接口,提供数据库驱动jar包,我们程序猿可以使用这套接口编程(面向接口编程),真正执行的代码却是jar包中的实现类。
.
.
相关API:
java.sql包下的:
DriverManager(类):通过反射Class.foriName(com.mysql,jdbc.Driver)加载MySq厂商的实现类:com.mysql.jdbc.Driver;(类加载的时候执行一次其静态代码块(静态代码块中有执行注册驱动方法DriverManager.registerDriver(new Driver() ) ) );然后通过驱动管理对象DriverManager的getConnection(url,user,password)方法获取到Connection数据库连接对象;
Connection(接口):通过Connection数据库连接对象的方法获取Statement/PreparedStatement
Statement/PreparedStatement(接口)
ResultSet(接口)):通过执行sql对象的statement的executeQuery(sql)方法执行DQL语句获取到查询数据库后的结果集对象(常用方法有:boolean next();int getInt(列的编号));String getString(列的名称);
…
.
JDBC的编写流程?
1、导入JDBC驱动jar包,(导入jdbc这一套接口的诸多实现类(MySQL版本))
2、注册驱动(MySql 5 之后的驱动jar包可以省略注册驱动的步骤)
注册驱动:告诉程序应该使用哪一个数据库驱动;
驱动管理对象:DriverManager(是java.sql包下的一个类);
注册驱动的原理:
//通过反射加载MySql厂商的JDBC实现类:
Class.forName("com.mysql.jdbc.Driver);
//com.mysql.jdbc.Driver本身具有的静态代码块:
static{ //静态代码块在类加载的时候只会执行 一次,
try{
//驱动管理对象注册驱动--当前mysql的Driver对象。
DriverManager.registerDriver(new Driver())
} catch {
throw new RuntimeException("can't register driver ! ")
}
}
- 获取数据库连接对象(Connection:java.sql包下的一个接口)
//获取数据库连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db4",
"root", "root");
//DriverManager类下的获取连接方法:
static Connection getConnection(String url, String user, String password)
+ url参数:指定连接的路径
- 语法:jdbc:mysql://IP地址(域名):端口号/数据库名称
- 例:jdbc:mysql://127.0.0.1:3306/db1
- 注意事项:<font size=3 color=green>如果连接的是本机的MYSQL,并且MYSQL的端口是3306,则URL可以简写.</font>
- 格式:<font size=3 color=green>**jdbc:mysql:///数据库名称**</font>
+ user参数:用户名
+ password参数:密码
Connection 是一个接口:数据库连接对象:
功能(方法):
1、获取指定sql语句的对象
Statement createStatement()
2、获取指定SQL语句的预处理对象;
PreparedStatement prepareStatement(String sql)
3、管理事务
//开启事务,调用该方法设置参数为false,即开启事务
void setAutoCommit(boolean autoCommit)
//提交事务
void commit()
//回滚事务
void rollback()
*Statement*(接口):执行sql的对象;
//执行任意的SQL,但是根据返回值判断执行结果比较繁琐,了解即可
int execute(String sql)
//执行DML语句(INSERT/UPDATE/DELETE)。
//执行DDL(CREATE/DROP/ALTER)语句。
int executeUpdate(String sql) //返回的结果:受影响的行数,可以 根据受影响的行数判断SQL语句执行是否成功。
//执行DQL语句(SELECT)返回的结果封装在ResultSet中。
ResultSet executeQuery(String sql)
**Result**(java.sql包下的一个接口):结果集对象,封装查询结果,
常用方法:
boolean next() //游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
getXxx(参数) //获取数据 Xxx代表数据类型: 如:int getInt() String getString() 重载方法,参数:1. int:代表列的编号,从1开始 如: getString(1) String:代表列名称。 如: getDouble("balance") ;
使用步骤:
1. 游标向下移动一行
2. 判断是否有数据
3. 获取数据
4、. 定义要执行的SQL语句,
//定义SQL语句
String sql = "UPDATE account SET balance = 2000 WHERE id = 1";
5. 获取执行SQL语句的对象(statement)
//获取执行SQL的对象
Statement statement = connection.createStatement();
6. 执行SQL语句,获取执行的结果。
//执行SQL
int count = statement.executeUpdate(sql);
7. 处理执行的结果
//打印结果
System.out.println(count);
8. 释放资源
//关闭资源
statement.close();
connection.close();
另:
PreparedStatement:执行预编译sql的对象
- 概述:执行SQL的对象.
- SQL注入
- 在拼接SQL语句的时候,如果有一些SQL的特殊关键字参与了字符串的拼接,会造成安全问题。
- 解决SQL注入的问题
- 使用PreparedStatement对象解决。
- 预编译SQL
- 参数使用占位符?替代的SQL语句。
- 定义SQL的时候使用?代替参数
- 注意:
- 可以防止SQL注入
- 效率更高
public static boolean login2(String username ,String password){
if(username == null || password == null){
return false;
}
//连接数据库判断是否登录成功
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
//1.获取连接
try {
conn = JDBCUtils.getConnection();
//2.定义sql
String sql = "select * from user where username = ? and password = ? ";
//3.获取执行sql的对象
stmt = conn.prepareStatement(sql);
//给?赋值
stmt.setString(1,username);
stmt.setString(2,password);
//4.执行查询,不需要传递sql
rs = stmt.executeQuery();
//5.判断
return rs.next();//如果有下一行,则返回true
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(rs,stmt,conn);
}
return false;
}