JDBC

Java应用程序 接口 MySQL(Oracle,Redis,

Java
JDBC全称为:Java Data Base Connectivity
【Java数据库连接】
如何操作数据库?
组成JDBC的2个包:

  • java.sql
  • javax.sql

下载驱动

推荐下载地址: https://mvnrepository.com/artifact/mysql/mysql-connector-java

1连接数据库:加载数据库的驱动 连接数据库

  • 通过初始化驱动类com.mysql.jdbc.Driver,该类就在mysql-connector-java-5.1.47.jar中,如果你是用的是oracle数据库那么该驱动类将不同
    常用这种方式:Class.forName(“com.my.jdbc.Driver”);

2数据库的对象:

这里需提供:driver=com.mysql.jabc.Driver

username=root

password=自己设定的

url=jdbc:mysql://localhost:3306/(数据库名字)(用于标识数据的位置,通过URL地址告诉JDBC程序连接那个数据库)

3.获取与数据库的连接

Connection connection=DriverManger.getConnection(url,username,password)

4.编写SQL语句,获取向数据发送的sql语句的statement对象

5.向数据库发sql,并获取代表结果集的resulset

6得到执行的结果

7.释放资源

import java.sql.*;

public class MyTest2 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
       //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");
      //2.获取与数据库的链接
        String username="root";
        String password="123456";
        String url="jdbc:mysql://localhost:3306/jdbcstudy";
        Connection connection= DriverManager.getConnection(url,username,password);
       //3.编写SQL语句
        Statement statement=connection.createStatement();
        String sql="select id,name,password,email from users";

ResultSet resultSet=statement.executeQuery(sql);

while (resultSet.next()){
    System.out.println(resultSet.getObject("id"));
    System.out.println(resultSet.getObject("name"));
    System.out.println(resultSet.getObject("password"));
    System.out.println(resultSet.getObject("email"));

}
     //释放资源
resultSet.close();
statement.close();
connection.close();
    }
}

prepareStstement 和Statement

相同点:都是用来执行sql语句的

不同点:Statement 不安全,不能预编译SQL,不能使用站位符,容易造成SQL语句拼接错误

prepareStatement.setXXX[xxx:对应占位符数据的类型](?索引[从1开始,传入的值])

如何给preparestatement的站位符赋值:

preparedstatemt.set

例如:

String sql = "update t_course set course_name =? where course_id=?";

pstmt = (PreparedStatement) conn.prepareStatement(sql);
pstmt.setString(1, courseName);  //利用Preparedstatement的set方法给占位符赋值
pstmt.setInt(2, courseId);
execute和executeUpdate的区别

相同点:二者都能够执行增加,删除,修改等操作

不同点:1,execute可以执行查询语句,然后通过getResult把结果取出来 。executeUpdate不能执行查询语句

2.execute返回Boolean类型,true表示执行的是查询语句,false表示执行insert,delete,update等。executeUpdate的返回值是int,表示有多少条语句数据受到了影响

JDBC工具类

编写一个工具类简化开发,创建连接数据库都是死代码,每次写及其不方便,还有关闭连接

1.先创建一个.properties文件,把连接的一些固定属性放进去

package demo2;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

//编写一个工具类简化开发,创建连接数据库都是死代码,每次写及其不方便,还有关闭连接
public class JDBCUtils {
    private static String driver = null;
    private static String username = null;
    private static String password = null;
    private static String url = null;

    static {
        try {
            InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");
            Properties properties = new Properties();
            properties.load(is);
            driver=properties.getProperty("driver");
            username=properties.getProperty("username");
            password=properties.getProperty("password");
            url=properties.getProperty("url");

            //加载驱动
            Class.forName(driver);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //获取数据库连接对象
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,username,password);
    }
    //定义一个关闭方法
    public static void closeAll(ResultSet resultSet,Statement statement,  Connection connection){
        if (resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

调用工具类

package demo1;

import demo2.JDBCUtils;
import org.junit.Test;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MyTest1 {
    @Test
    public void insert(){
        Connection connection=null;
        Statement statement=null;

        try {
            connection=JDBCUtils.getConnection();
            statement=connection.createStatement();
            String sql="delete from users where id=5";
            //返回受影响的行数
            int i = statement.executeUpdate(sql);
            if (i>0){
                System.out.println("删除成功");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.closeAll(null,statement,connection);
        }
    }
    @Test
    public void update(){
        Connection connection=null;
        Statement statement=null;
        ResultSet resultSet=null;
        try {
            connection=JDBCUtils.getConnection();
            statement=connection.createStatement();
            String sql="select*from users";
            resultSet=statement.executeQuery(sql);

            while (resultSet.next()){

                System.out.println(resultSet.getInt("id"));

            }


        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}

开启事务:

什么是事务:

事务是逻辑是逻辑上的一组操作,要么都执行,要么都不执行

#MySQl默认提交事务

SET autocommit=0;关闭事务

SET autocommit=1;开启自动提交事务(MySQL默认)

start transaction;

UPDATE account SET money=money-100 WHERE name=‘A’;

一组SQL语句执行完毕后,提交事务,同时执行,如果中间有错误,则提交不成功;

如果想要回到提交之前的样子,则需要回滚

一般作用在并发处理上

开启事务后,如果不提交事务,那么所有的操作在mysql连接断开后,会恢复最开始的样子

开启事务后,更新了数据,不想更新了,可以选择回滚。

关闭数据库的事务自动提交=通知数据库开启事务控制。

1,数据表达的列尽量不要再分,(原子性)
2,每个表只专心于一件事情(一致性)
3.一个尽量保持一个主键()
MySQL中的一些函数
数学函数:
select ceiling(1.2)向上取整;
select floor(1.2)向下取整;
select abs(-10)绝对值;
select rand();随机数,会返回一个0~1之间的随机数
select rand(10);随机种子数;
字符串函数:
select char_length(“西部开源”);统计字符串个数
select replace(“i love you”,’o‘,’西开‘);字符串替换(原始字符串,需要替换的字符串,替换的字符串)
select substr(’i love you‘,0);
select substr(’i love you‘,1,5);
日期函数:
select now();查询当前时间。返回一个date
select YEAR(now());
select MONTH(now());
select day(now());
select sysdate();获取系统时间
select locatime();
系统信息函数
select VERSION();
select USER();
maven:可以下载jar包