JDBC 连接数据库

JDBC的主要API:DriverManager类 Connection接口 Statement接口
PrepareStatement接口 ResultSet接口
JDBC连接数据库的步骤:1. 导入驱动Jar包 2.加载与注册驱动 3.创建数据库连接
JDBC 连接数据库_第1张图片
2.Class.forName(driver)主动加载类
3.DriverManager(url,username,password);
driver = com.mysql.jdbc.Driver 这是mysql的驱动
url= jdbc:mysql://127.0.0.1:3306/qwe?serverTimezone=UTC
jdbc:mysql://这是mysql的协议
127.0.0.1:3306这是本地的 默认的 可以省
qwe是数据库名
?serverTimezone=UTC这是因为时区问题要加,没有则可不写
简写为 jdbc:mysql:///qwe?serverTimezone=UTC
username:数据库账号 password:数据库密码

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql:///java?serverTimezone=GMT","root","root");

Statement接口 主要是3个方法 execute() executeUpdate() executeQuery()
Statement作用 代表一条语句对象,用于发送SQL语句给服务器,执行静态SQL语句并返回它所生成的结果对象
在使用之前要创建 Statement接口对象

Statement stmt = conn.createStatement();
String sql = "create table stu(id int primary key auto_increment, name varcahr(32) unique not null)";
boolean flag = stmt.execute(sql);//execute() 能执行DDL DML DQL 返回值为true或false 意思是有无返回值 但主要用来执行DDL(不常用 一般都在数据库中建表)
sql = "insert into stu values(null,'lucy')";
int count = stmt.executeUpdate(sql);//executeUpdate() 能执行DDL DML 但通常用来执行DML 返回值是被改变的条数
sql = "select * from stu";
ResultSet rs = stmt.executeQuery(sql);//executeQuery()只能执行DQL 返回值是结果集
//ResultSet像迭代器iterator() 一开始指针都指向第一个元素前面 主要方法是next()
boolean flag = rs.next();//先到下一个元素,在判断是否存在,存在返回true 不存在返回false
rs.getString(1);//这是得到内容 get类型(字段名或字段序列号从1开始)

但Statement容易被SQL注入即在拼接SQL语句时改变了SQL原来的意义

rose' or 'a' = 'a//输入 name
String sql = "select * from  stu where name ='"+name+"'";
这句话最终变成select * from  stu where name = 'rose' or 'a' = 'a';

这是就用到了PrepareStatement接口 表示预编译的SQL语句对象即在创建对象时就把SQL语句传递进去
Statement: 直接通过连接获得
要执行sql语句时, 才需要将sql发送给数据库execute(sql)
PreparedStatement: 获得对象时, 已经确定要执行的sql语句了 -> 已经将sql发送给数据库
conn.prepareStatement(sql)
需要给占位符传递真实的参数值 setXX()
execute(): 只负责执行, 不负责发送sql
不需要拼接sql语句, 有不确定的数据, 用占位符 ? 来代替
在多次执行相同的sql语句时,
Statement 每次都要将sql发送给数据库
PreparedStatement 只需要发送一次, 效率更高, 绝对更安全

String sql = "select * from users where username=? and password = ?";
// 获得预编译的 语句块 : 就将sql语句发送给数据库
PreparedStatement stmt = conn.prepareStatement(sql);
// 执行sql语句之前, 需要确定 ? 的具体内容: 设置参数
stmt.setString(1, username);
stmt.setString(2, password);
// 执行sql语句, 不需要再次发送sql语句给数据库
ResultSet rs = stmt.executeQuery();

你可能感兴趣的:(数据库,sql,java)