JDBC IDEA 连接使用
JDBC简介
@小猴子monkey1024,JDBC简介源自小猴子的博客,感谢
什么是JDBC
JDBC是java database connectivity的缩写,是SUN公司提供的一套操作数据库的标准规范。JDBC提供一些操作数据的API,开发者可以在java中使用这些API操作数据库,实现对表中数据的增删改查操作,JDBC相当于java和数据库之间的一座桥梁。
SUN公司制定了JDBC标准,各大数据库厂商会提供数据库驱动现这个标准,这样java才可以通过JDBC来操作实现了这个标准的数据库。如果将JDBC看做是接口的话,数据库厂商提供的数据库驱动就是这个接口的实现类。各个数据库厂商会将各自的数据库驱动打成jar包对外发布,开发者在使用时需要下载与当前数据库匹配的数据库驱动jar包。
JDBC规范让Java程序和数据库驱动实现了松耦合,使切换不同的数据库变得更加简单。
JDBC规范
JDBC的四个核心接口
DriverManager:用于注册驱动并创建符合该驱动的数据库的连接。
Connection: 表示与数据库创建的连接对象,即一个connection对应着一个会话,相当于在mysql workbench中打开了一个连接。
Statement: 操作数据库sql语句的对象,有个两个实现类:Statement和PreparedStatement(常用)。
ResultSet: 从数据库中查询的结果集。
基本上通过使用上面4个接口就能使用java实现对数据库的增删改查了。
JDBC四个核心对象
IDEA 实现 jdbc 连接mysql
在setting --plugins–加载 junit generator,
在需要使用junit测试的 方法,加上 @Test ,或者右键,go to --test ;
1.注册驱动 Class.forName(“com.mysql.jdbc.Driver”);
2.建立连接 Connection conn = DriverManager.getConnection(url,user,password);
Connection conn = DriverManager.getConnection(“jdbc:mysql://localhost:3306/testcopy”, “root”, “root”);
3. 建立操作对象 Statement stmt = conn. createStatement();
4.对象执行sql语句 stmt.update(" sql")
结果接收 ResultSet rs = stmt.executeQuery(“查询语句”);
ResultSet rs = stmt.executeQuery("select id,name,password,email,birthday from t_user");
int flag = stmt.executeUpdate("update t_user set name='cat1' where id=1;");
if(flag>0){
System.out.println("update succeeded");
}
int flag = stmt.executeUpdate("delete from t_user where id=4;");
if(flag>0){
System.out.println("delete succeeded");
}
int flag = stmt.executeUpdate("insert into t_user(name,password,email,birthday) values\n" +
"('long','1234222','[email protected]','1989-12-02')");
if(flag>0){
System.out.println("insert succeeded");
}
如果前面发生异常,就不会执行到关闭资源语句,所以要保证关闭,用try,catch,finally
/**
* 新特性,自动关闭,将需要关闭的 放入try()中,后面就不用关闭了
* @throws SQLException
*/
@Test
public void testSelect() throws SQLException {
//注册驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//将需要关闭的 放入try()中,后面就不用关闭了
try(
//获取连接Connection
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testcopy", "root", "root");
//得到 执行sql语句的对象statement
Statement stmt = conn.createStatement();
//执行sql语句,并得到返回结果 (update,返回一个flag)
ResultSet rs = stmt.executeQuery("select id,name,password,email,birthday from t_user");
){
//处理结果
List<User> userList = new ArrayList<>();
while (rs.next()){
User u = new User();
//创建User对象的语句,一定要写在里面,否则出现问题,所有返回值都写到一个数组的元素里了
u.setId(rs.getInt("id"));
u.setName(rs.getString("name"));
u.setPassword(rs.getString("password"));
u.setEmail(rs.getString("email"));
u.setBirthday(rs.getDate("birthday"));
userList.add(u);
}
System.out.println(userList);
}
把参数配置,记录到db.properties中,文件放在classpath,src/main/resources下面
//配置文件不能有多余空格
driverClass=com.mysql.jdbc.Driver
//错误:driverClass,必须和调用的地方名字写对,写错了找了半天bug
url=jdbc:mysql://localhost:3306/testcopy
username=root
password=root
建个包util——java类DBUtil——封装驱动
1.静态块,统一定好参数,通过 ResourceBundle调取 配置文件db.properties内参数属性
2.ResourceBundle.getBundle(“db”),要求在classpath中找到db.properties,要移动到main/resources目录
3.注册驱动 参数写入
4.获得连接方法 参数写入
package com.king.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ResourceBundle;
public class DBUtil {
//统一定好参数,通过 ResourceBundle调取 配置文件db.properties内参数属性
private static String driverClass;
private static String url;
private static String username;
private static String password;
//ResourceBundle.getBundle("db"),要求在classpath中找到db.properties,要移动到main/resources目录
static{
ResourceBundle rb = ResourceBundle.getBundle("db");
driverClass = rb.getString("driverClass");
url = rb.getString("url");
username = rb.getString("username");
password = rb.getString("password");
//1.注册驱动 参数写入
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//2.获得连接 参数写入
public static Connection getConnection() throws SQLException {
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
}
}
package com.king;
import com.king.util.DBUtil;
import org.junit.Test;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* 使用配置参数,优化重构
*/
public class CRUD_Test03 {
@Test
public void testSelect() throws SQLException {
try(
//获取连接Connection
Connection conn = DBUtil.getConnection();
//得到 执行sql语句的对象statement
Statement stmt = conn.createStatement();
//执行sql语句,并得到返回结果 (update,返回一个flag)
ResultSet rs = stmt.executeQuery("select id,name,password,email,birthday from t_user");
){
//处理结果
List userList = new ArrayList<>();
while (rs.next()){
User u = new User();
//创建User对象的语句,一定要写在里面,否则出现问题,所有返回值都写到一个数组的元素里了
u.setId(rs.getInt("id"));
u.setName(rs.getString("name"));
u.setPassword(rs.getString("password"));
u.setEmail(rs.getString("email"));
u.setBirthday(rs.getDate("birthday"));
userList.add(u);
}
System.out.println(userList);
}
}
//配置文件不能有多余空格
driverClass=com.mysql.jdbc.Driver
//错误:driverClass,必须和调用的地方名字写对,写错了找了半天bug
url=jdbc:mysql://localhost:3306/testcopy
username=root
password=root
package com.king.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ResourceBundle;
public class DBUtil {
//统一定好参数,通过 ResourceBundle调取 配置文件db.properties内参数属性
private static String driverClass;
private static String url;
private static String username;
private static String password;
//ResourceBundle.getBundle("db"),要求在classpath中找到db.properties,要移动到main/resources目录
static{
ResourceBundle rb = ResourceBundle.getBundle("db");
driverClass = rb.getString("driverClass");
url = rb.getString("url");
username = rb.getString("username");
password = rb.getString("password");
//1.注册驱动 参数写入
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//2.获得连接 参数写入
public static Connection getConnection() throws SQLException {
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
}
有这个用户属性表,就在创建User对象的时候,可以调用set,get方法来,写入User对象。
package com.king;
/**
* 用户表
* 属性,getset,tostring方法
*/
import java.util.Date;
public class User {
private int id;
private String name;
private String password;
private String email;
private Date birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
", birthday=" + birthday +
'}';
}
}
/**
* sql语句单独用变量保存,顺便打印出来,可以调试看到,自己sql语句对不对,
* select id,name,password,email,birthday from t_user where name=tiger and password=123456
* 可以看到 name和password 的值没有加单引号
*/
//sql语句进行拼接查询, 通过+号,可以连起来
String sql =“select id,name,password,email,birthday from t_user where name=’”
+ name +"’ and password=’" + password+ “’”;
package com.king.service;
import com.king.User;
import com.king.util.DBUtil;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class LoginService {
public User findUserByUsernameAndPsaaword(String name,String password) throws SQLException {
User u = null;
Connection conn = DBUtil.getConnection();
Statement stmt = conn.createStatement();
/**
* sql语句单独用变量保存,顺便打印出来,可以调试看到,自己sql语句对不对,
* select id,name,password,email,birthday from t_user where name=tiger and password=123456
* 可以看到 name和password 的值没有加单引号
*/
String sql ="select id,name,password,email,birthday from t_user where name='"
+ name +"' and password='" + password+ "'";
System.out.println(sql);
ResultSet rs = stmt.executeQuery(sql);
//sql语句进行拼接查询
while (rs.next()){
//这while里面的 user新对象,必不可少
u = new User();
u.setId(rs.getInt("id"));
u.setName(rs.getString("name"));
u.setEmail(rs.getString("email"));
u.setPassword(rs.getString("password"));
u.setBirthday(rs.getDate("birthday"));
}
return u;
}
}
具体实现的地方:
控制台输入:Scanner input = new Scanner(System.in);
System.out.println(“请输入用户名:”);
String name = input.nextLine();
System.out.println(“请输入密码:”);
String password = input.nextLine();
新建 LoginService对象,调用方法,将返回值赋给, 新建User对象,
if判断,空,则数据库没查询到匹配的记录,无返回;
非空,则数据库中有这个记录,返回了
package com.king.controller;
import com.king.User;
import com.king.service.LoginService;
import java.sql.SQLException;
import java.util.Scanner;
/**
* 实现用户登录功能
*/
public class Login {
public static void main(String[] args) throws SQLException {
Scanner input = new Scanner(System.in);
System.out.println("请输入用户名:");
String name = input.nextLine();
System.out.println("请输入密码:");
String password = input.nextLine();
LoginService ls=new LoginService();
User u = ls.findUserByUsernameAndPsaaword(name,password);
if(u == null){
System.out.println("用户名或密码错误");
}else{
System.out.println("登陆成功");
}
}
}