一. 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入门程序* */@Testpublic 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.执行sqlString 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;}
@Testpublic 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(); //执行sqlwhile (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) 性能更高