什么是JDBC
JDBC就是Java 连接数据库
因为数据库的厂商很多,每个厂家的数据库都需要与JAVA进行连接,但是JAVA作为大厂不可能去迁就与每个数据库厂商,所以JAVA遍提供了一套和数据库建立连接的规范(接口),让各个厂家实现这个接口,我们把厂商写的实现类称之为“数据库驱动”
JDBC快速入门
- 导入数据库的驱动jar包
2. 加载驱动jar包(依赖)
进行增删改 的操作(DML):
用 statement.executeUpdate(sql);
public class MyJDBC {
public static void main(String[] args) throws Exception {
3. 获取连接对象
Class.forName("com.mysql.jdbc.Driver");
//输入数据库的的相关信息:URL 用户名 密码
String url= "jdbc:mysql://localhost:3306/program_together_qa";
String username="root";
String password="root";
Connection conn = DriverManager.getConnection(url, username, password);
4.获取操作对象
Statement statement = conn.createStatement();
5.执行SQL语句
String sql="insert into tb_pl values('7','77')";
//进行增删改 的操作(DML)
statement.executeUpdate(sql);
6.释放资源
conn.close();
statement.close();
}
}
进行查询的操作(DQL):
用 statement.execute()
public class Mydome2 {
public static void main(String[] args) throws Exception {
建立一个list集合来储存对象
ArrayList<User> list = new ArrayList<>();
3. 获取连接对象
Class.forName("com.mysql.jdbc.Driver");
//输入数据库的的相关信息:URL 用户名 密码
String url = "jdbc:mysql://localhost:3306/user";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
4.获取操作对象
Statement statement = conn.createStatement();
5.执行SQL语句
String sql = "select * from user";
//进行 查询 的操作(DQL)
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
int user_id = resultSet.getInt(1);
String user_name = resultSet.getString(2);
int user_age = resultSet.getInt(3);
User user = new User(user_id, user_name, user_age);
list.add(user);
}
System.out.println(list);
6.释放资源
conn.close();
statement.close();
resultSet.close();
}
}
public class User {
private int user_id;
private String user_name;
private int user_age;
public User() {
}
public User(int user_id, String user_name, int user_age) {
this.user_id = user_id;
this.user_name = user_name;
this.user_age = user_age;
}
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public int getUser_age() {
return user_age;
}
public void setUser_age(int user_age) {
this.user_age = user_age;
}
@Override
public String toString() {
return "User{" +
"user_id=" + user_id +
", user_name='" + user_name + '\'' +
", user_age=" + user_age +
'}';
}
}
一个查询数据库进行登陆的小Demo:
public class LoginDemo {
public static void main(String[] args) throws Exception {
//进行用户名密码的输入
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名");
String username = sc.nextLine().trim();
System.out.println("请输入密码");
String password = sc.nextLine().trim();
//获取连接对象
Class.forName("com.mysql.jdbc.Driver");
//输入数据库的的相关信息:URL 用户名 密码 + 获取操作对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/user", "root", "root");
//编写sql
不将具体查询内容放入sql语句中,用?占位
String sql = "select * from login where username=? and password=?";
//获取预编译操作对象preparedStatement
PreparedStatement preparedStatement = conn.prepareStatement(sql);
//给SQL中的?赋值
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
//执行SQL语句
ResultSet resultSet = preparedStatement.executeQuery();
boolean b = resultSet.next();
if (b){
System.out.println("登陆成功");
}else {
System.out.println("登陆失败");
}
}
}
PreparedStatement:
在这个登陆Demo中,我们使用了一个 PreparedStatement 的东西,它是一个预编译操作对象
PreparedStatement的产生原因:
在一开始对SQL进行操作的时候,是没有PreparedStatement,但是随着技术的发展,老的技术面对精通SQL语言的技术人员没有一点秘密而言,所以诞生了预编译操作对象PreparedStatement,在写SQL的时候用?占位, 然后根据数据类型使用preparedStatement.setString 来给SQL赋值,防止SQL注入
PreparedStatement的使用步骤:
1.conn.prepareStatement(sql);
2.sql语句中的字段的值用?问号占位
3.给sql语句中的问号赋值
//SQL语句中的值 全部用 ? 问号占位
String sql="SELECT * FROM users WHERE username=? AND PASSWORD=?";
//获取一个预编译操作对象 PreparedStatement
PreparedStatement preparedStatement = conn.prepareStatement(sql); //把SQL语句给给这个预编译操作对象
//下来给问号赋值 参1.问号的顺序,从1开始数 参数2 问号的值
preparedStatement.setString(1,uname);
preparedStatement.setString(2,pwd);
ResultSet resultSet = preparedStatement.executeQuery(); //这里就不要再传入SQL语句
抽取工具类
1.0版本工具类:
public class MyJDBC {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url= "jdbc:mysql://localhost:3306/program_together_qa";
String username="root";
String password="root";
Connection conn = DriverManager.getConnection(url, username, password);
Statement statement = conn.createStatement();
String sql="insert into tb_pl values('7','77')";
statement.executeUpdate(sql);
conn.close();
statement.close();
}
}
2.0版本工具类:
在1.0版本的工具类中,只是单纯的将JDBC常用的操作抽取出来,但是里头的配置还是写死的,导致每次更换用户或者数据库的时候需要对代买进行修改,复用性不高,因此使用properties配置文件和Properties流进行升级操作。
public class JDBCUtils {
//ctrl+alt+F 快速抽取成员变量
private static String url;
private static String username;
private static String password;
private JDBCUtils() {
}
static {
try {
Properties properties = new Properties();
properties.load(new FileReader("src/jdbcProperties.properties"));
//注册启动
Class<?> aClass = Class.forName(properties.getProperty("className"));
url =properties.getProperty("url");
username =properties.getProperty("username");
password =properties.getProperty("password");
} catch (Exception e) {
e.printStackTrace();
}
}
//获取连接对象的方法
public static Connection getConnection() throws Exception {
Connection connection = DriverManager.getConnection(url, username, password);
return connection;
}
//释放资源的方法
public static void colse(Connection conn, Statement statement, ResultSet resultSet) throws SQLException {
if (conn != null) {
conn.close();
}
if (statement != null) {
statement.close();
}
if (resultSet != null) {
resultSet.close();
}
}
public static void colse(Connection conn, Statement statement) throws SQLException {
if (conn != null) {
conn.close();
}
if (statement != null) {
statement.close();
}
}
}