1. JDBC简介
1. JDBC基本概念
Java DataBase Connectivity简称JDBC是Java数据库连接, Java语言操作数据库。JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
2. JDBC快速入门
- 步骤:
1. 导入驱动jar包
2. 注册驱动
3. 获取数据库连接对象 Connection
4. 定义sql
5. 获取执行sql语句的对象 Statement
6. 执行sql,接受返回结果
7. 处理结果
8. 释放资源
导入驱动jar包
首先:在项目下创建libs目录,然后把jar报辅助到该目录下
然后:右键–>Add As Library;将jar包解压:效果如下
代码实现
public class Demo01 {
public static void main(String[] args) throws Exception {
// 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
// 定义sql语句
String sql = "SELECT * FROM USER";
// 获取执行sql语句的对象 Statement
Statement stmt = conn.createStatement();
//6.执行sql
ResultSet set = stmt.executeQuery(sql);
//7.遍历结果集合
int i=1;
while (set.next()) {
String id = set.getString("id");
String username = set.getString("username");
String birthday = set.getString("birthday");
String sex = set.getString("sex");
String address = set.getString("address");
System.out.println(id+":"+username+":"+birthday+":"+sex+":"+address);
}
//8.释放资源
stmt.close();
conn.close();
}
}
Class.forName
是什么?这是反射的东西,可以简单理解为将该字符串路径下的类加载到内存中
遍历Set集合中的getString是通过数据库中的数据名称来一一对应实现的
2. JDBC各个功能
逻辑框架图
1. DriverManager(驱动管理对象)
功能
1.注册驱动,通过静态代码块实现(因为驱动只注册一次)
使用反射机制,直接将类加载到内存中去
Class.forName("com.mysql.jdbc.Driver");
注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。
2.获取数据库连接
public static Connection getConnection(String url, String user, String password)
方法
参数
- url:指定连接的路径(格式:jdbc:mysql://ip地址(域名):端口号/数据库名称 )
- user:用户名
- password:密码
2. Connection(数据库连接对象)
功能
1.获取执行sql的对象
Statement createStatement()
该方法返回一个Statement对象。(没有防止SQL注入功能)PreparedStatement prepareStatement(String sql)
该方法返回预编译的Statement对象,即将SQL语句提交到数据库进行预编译。(有防止SQL注入功能)
2.管理事务
- 开启事务:
void setAutoCommit(boolean autoCommit) :
调用该方法设置参数为false,即开启事务 - 提交事务:
void commit()
- 回滚事务:
void rollback()
3.Statement(执行sql的对象)
执行sql
boolean execute(String sql)
:该方法可以执行任何SQL语句,如果执行后第一个结果是ResultSet对象,则返回true;如果执行后第一个结果为受影响的行数或没有任何结果,则返回false;一般不用这个方法。int executeUpdate(String sql)
:执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。ResultSet executeQuery(String sql)
:执行DQL(select)语句
boolean execute(String sql);需要特别注意,当我使用该方法查询不存在的数据是,它依旧返回true,这是因为,查询返回的结果集合是一个ResultSet对象,但是ResultSet是从表头开始的,而表头一定存在,所以结果一定为true,不管是否真的存在该数据,所以一般情况下不要用这个方法
4.PreparedStatement(执行sql的对象)
- SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,是逻辑本身出现错误,导致整个SQL语句逻辑改变
- 输入用户随便,输入密码:sd’ or ‘sd’ = 'sd
- sql:select * from user where username = ‘fhdsjkf’ and password = ‘a’ or ‘a’ = ‘a’ 后面的
or ‘a’ = ‘a’
始终都为true
因此密码逻辑始终正确,导致不需要正确用户名和密码都可以实现登录
举例:用户输入用户名和密码 ,如果数据库中有,则显示登录成功,如果没有,则显示登录失败
public class Demo01 {
public static void main(String[] args) throws Exception {
// 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
// 定义sql语句
System.out.println("请输入用户名");
String user = new Scanner(System.in).next();
System.out.println("请输入密码");
String password = new Scanner(System.in).next();
String sql = "select * from s1 where user = '"+user+"' and passord = '"+password+"' ";
// 获取执行sql语句的对象 Statement
Statement stmt = conn.createStatement();
//6.执行sql
boolean execute = stmt.execute(sql);
if(execute==true){
System.out.println("密码输入正确");
}else {
System.out.println(