Java-JDBC入门程序、预编译SQL
一. JDBC
JDBC:Java DataBase Connectivity 就是使用Java语言操作关系型数据库的一套API
本质:sun公司官方定义一套操作所有关系型数据库的规范,即接口;各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行代码的是驱动jar包中的实现类。
二.JDBC入门程序
DML语句
1. 创建一个Maven项目,引入依赖;并准备数据库表(emp)
//pom.xml引入依赖
<dependencies>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
</dependencies>
2.代码实现:编写jdbc程序,操作数据库
import org.junit.jupiter.api.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class JdbcTest {
/*
* JDBD入门程序
* */
@Test
public void testUpdate() throws Exception {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/db01";//数据库地址
String username = "root";//用户名
String password = "root";//密码
Connection conn = DriverManager.getConnection(url,username,password);
//3.获取执行sql的对象
Statement stmt = conn.createStatement();
//4.执行sql
String sql = "update emp set phone = '15935748521' where username = 'taitan'";
int count = stmt.executeUpdate(sql);//返回受影响的行数
if (count > 0) {
System.out.println("修改成功");
} else {
System.out.println("修改失败");
}
//5.释放资源
stmt.close();
}
}
DQL语句
ResultSet(结果集对象) :ResultSet rs = statement.executeQuery()
(1) next():将光标从当前位置向前移动一行,并判断当前行是否有效行,返回值为boolean;
true:有效行。当前行有数据;
false:无效行,当前行没有数据
(2) getXxx(...):获取数据,可以根据列的编号获取,也可以根据列名获取(推荐)
package com.wyyzs;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data //getter setter toString
@AllArgsConstructor //全参构造
@NoArgsConstructor //无参构造
public class Emp {
Integer id;
String username;
String password;
String name;
Integer gender;
char phone;
Integer job;
Integer salary;
Date entry_date;
String image;
Date create_time;
Date update_time;
}
@Test
public void testSelete() throws Exception {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/db01";//数据库地址
String username = "root";//用户名
String password = "root";//密码
Connection conn = DriverManager.getConnection(url,username,password);
//3执行sql ? 占位符
String sql = "select id, username, password, name, gender, phone, job, salary, entry_date, image, create_time, update_time from emp where username = ?";
PreparedStatement stmt = conn.prepareStatement(sql); //预编译sql,减少sql执行
stmt.setString(1,"taitan");
//ResultSet 结果集对象
ResultSet rs = stmt.executeQuery(); //执行sql
while (rs.next()) {
Emp emp = new Emp(rs.getInt("id"),
rs.getString("username"),
rs.getString("password"),
rs.getString("name"),
rs.getInt("gender"),
rs.getString("phone").charAt(0),
rs.getInt("job"),
rs.getInt("salary"),
rs.getDate("entry_date"),
rs.getString("image"),
rs.getDate("create_time"),
rs.getDate("update_time"));
System.out.println(emp);
}
rs.close(); //释放资源
conn.close(); //释放资源
stmt.close();//释放资源
}
三. 预编译SQL
1. 静态SQL(参数硬编码):直接将参数写到SQL语句中,直接使用Statement对象执行
String sql = "select id, username, password, name, gender, phone, job, salary, entry_date, image, create_time, update_time from emp where username = 'taitan'";
2. 预编译SQL(参数动态传递):使用?(占位符),需要获取PreparedStatement对象为预编译SQL中的占位符赋值
String sql = "select id, username, password, name, gender, phone, job, salary, entry_date, image, create_time, update_time from emp where username = ?";
3. 预编译SQL优势:
(1) 可以防止SQL注入,更安全;(SQL注入:通过控制输入来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。)
(2) 性能更高