java之 JDBC

0x01、JDBC入门

在li处导入jdbc

JDBC的用处,方便与mysql或者oracle数据库之前快速替换

代码实现:

public static void main(String[] args) throws SQLException {
		//注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		String url = "jdbc:mysql://localhost:3306/day10?characterEncoding=utf8";
		String user = "root";
		String password = "123";
		//获得连接
		Connection connection = DriverManager.getConnection(url, user, password);
    
    
		//创建执行sql语句对象
		Statement statement = connection.createStatement();
    
		//执行sql,处理结果
		String sql = "select *from user";
		ResultSet resultSet = statement.executeQuery(sql);
		while (resultSet.next()) {
			System.out.println(resultSet.getObject(1));
			System.out.println(resultSet.getObject(2));
			System.out.println(resultSet.getObject(3));
			System.out.println(resultSet.getObject(4));
			
		}
		//关闭资源
        resultSet.close();
        statement .close();
        connection.close();
	}

0x02、API详解

1、DriverManager类

作用:

  1. 注册驱动
  2. 获得连接

1.registerDriver(Driver driver) ;注册驱动

static {
	try {
		DriverManager.registerDriver(new Driver());
	} catch (SQLException E) {
		throw new RuntimeException("Can't register driver!");
	}
}

翻阅源码发现,通过API的方式注册驱动会让我们的项目在编译期依赖mysql驱动,产生了耦合,所有推荐这种写法:

 //当前就理解成 可以让com.mysql.jdbc.Driver里面的静态代码块执行
 Class.forName("com.mysql.jdbc.Driver"); 

2、getConnection(String url, String user, String password) ;与数据库建立连接

2、Connection接口

作用:

	createStatement() ;创建执行sql语句对象

​	prepareStatement(String sql) ;创建预编译执行sql语句的对象
  1. Connection代表连接对象, 是一个接口, 实现在驱动jar包; 操作数据库都是基于Connection的
  2. 作用:
    • connection.createStatement(); 创建执行sql语句对象
//创建Statement
Statement statement = connection.createStatement();

3、Statement接口

作用:

ResultSet  executeQuery(String sql) 根据查询语句返回结果集。只能执行**select**语句。
int executeUpdate(String sql) 根据执行的DML(insert update delete)语句,返回受影响的行数。

boolean execute(String sql)  此方法可以执行任意sql语句。返回boolean值. 【了解】

true:  执行select有查询的结果
false:  执行insert, delete,update, 执行select没有查询的结果
String sql = "select *from user";
		ResultSet resultSet = statement.executeQuery(sql);
		while (resultSet.next()) {
			System.out.println(resultSet.getObject(1));
			System.out.println(resultSet.getObject(2));
			System.out.println(resultSet.getObject(3));
			System.out.println(resultSet.getObject(4));
			
  1. 执行查询
ResultSet excuteQuery(String sql);    //返回值是结果集
  1. 执行增删改
int excuteUpdate(String sql);  //返回值是受影响的行数

4、ResultSet接口

  1. 封装结果集,查询结果表的对象;

    提供一个游标,默认游标指向结果集第一行之前。

    调用一次next(),游标向下移动一行。

    提供一些get方法。

  2. ResultSet接口常用API

    boolean next();将光标从当前位置向下移动一行
    int getInt(int colIndex)以int形式获取ResultSet结果集当前行指定列号值
    int getInt(String colLabel)以int形式获取ResultSet结果集当前行指定列名值
    float getFloat(int colIndex)以float形式获取ResultSet结果集当前行指定列号值
    float getFloat(String colLabel)以float形式获取ResultSet结果集当前行指定列名值
    String getString(int colIndex)以String 形式获取ResultSet结果集当前行指定列号值
    String getString(String colLabel)以String形式获取ResultSet结果集当前行指定列名值
    Date getDate(int columnIndex);  以Date 形式获取ResultSet结果集当前行指定列号值
    Date getDate(String columnName);以Date形式获取ResultSet结果集当前行指定列名值
    void close()关闭ResultSet 对象
    

0x03、封装数据

  • 定义一个User类
public class User {

    private int id;
    private String username;
    private String password;
    private String nickname;

    //提供get/set方法 Alt+Insert


    public User() {
    }

    public User(int id, String username, String password, String nickname) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.nickname = nickname;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", nickname='" + nickname + '\'' +
                '}';
    }
}
  • 查询封装
List<User> list = new ArrayList<User>();

while (resultSet.next()) {
    //每遍历一次, 就是1条记录, 就封装成一个User对象
    User user = new User(resultSet.getInt("id"),
    resultSet.getString("username"),
    resultSet.getString("password"),
    resultSet.getString("nickname")
);
list.add(user);

}

0x04、预编译

public static void main(String[] args) throws SQLException {
		//注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		String url = "jdbc:mysql://localhost:3306/day10?characterEncoding=utf8";
		String user = "root";
		String password = "123";
		//获得连接
		Connection connection = DriverManager.getConnection(url, user, password);
    
    
		//创建执行sql语句对象
		Statement statement = connection.createStatement();
    
		//执行sql,处理结果
		//String sql = "select *from user";
		//ResultSet resultSet = statement.executeQuery(sql);
    	String sql = "SELECT * FROM user WHERE username  = ? AND password = ?";
		PreparedStatement preparedStatement = connection.prepareStatement(sql);
    	//设置参数
    	preparedStatement.setString(1,username);
		preparedStatement.setString(2,password);
		ResultSet resultSet = preparedStatement.executeQuery();
		
		//关闭资源
        resultSet.close();
        statement .close();
        connection.close();
	}

Connection接口已经提过了,使用PreparedStatement来进行预编译

通过connection对象创建
  • connection.prepareStatement(String sql) ;创建prepareStatement对象

  • sql表示预编译的sql语句,如果sql语句有参数通过?来占位

    SELECT * FROM user WHERE username = ? AND password = ?
    
设置参数
  • prepareStatement.set类型(int i,Object obj);参数1 i 指的就是问号的索引(指第几个问号,从1开始),参数2就是值 eg: setString(1,"zs"); setString(2,"123456");
//创建预编译的SQL语句对象(SQL参数需要使用?占位)
String sql = "SELECT * FROM user WHERE username  = ? AND password = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//c.设置参数, 执行(还是executeQuery()和executeQUpdate(), 但是不需要再传入SQL语句, 上面已经传入了)
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
ResultSet resultSet = preparedStatement.executeQuery();
posted @ 2021-01-25 16:48  0X7e  阅读(95)  评论(0编辑  收藏  举报