JDBC连接数据库总结


今天来看下使用JDBC连接mysql的各种方法,以及对数据的各种操作。

JDBC概述

JDBC( Java DataBaseConnectivity java数据库连接)是java提供的一套用来操作数据库的接口,是用Java编写的类和接口组成的,如下图。

获取数据库的连接

获取连接的必要条件

  1. 保证mysql是可以正常使用的(服务是否开启)。
  2. 保证账号密码正确。
  3. 导入mysql驱动包(一定要注意版本),maven项目要加入相应版本的依赖。

导包步骤:建立java工程,在工程下建libs目录,将mysql驱动包jar包放入libs,将jar设为依赖(右键选Add as Library…)。

获取数据库连接

方式一:Driver

代码示例:

public class JDBCDemo{
    public static void main(String[] args) throws Exception{
		//获取Driver类的对象,此处用的是jdbc依赖中的Driver而不是Java API中的Driver,因为jdbc的Driver已经实现了Java API的Driver,直接用即可,当然也可自己实现Java API的Driver,不过较复杂
		Driver driver = new com.mysql.jdbc.Driver();
		//获取Connection连接对象
		/*
		connect(String url, java.util.Properties info)
		url:是mysql连接地址,数据库协议://数据库ip:数据库端口/数据库库名
		jdbc:mysql://ip:3306/database_name
		info:用来存放连接mysql的数据(账号和密码)
		*/
		String url = "jdbc:mysql://localhost:3306/db";
		Properties properties = new Properties();
		//设置账号和密码,用put和setProperty皆可
		//properties.put("user","root"); //key值不能随便写只能是user
		//properties.put("password","123456"); //key值不能随便写只能是password
		properties.setProperty("user","root");
		properties.setProperty("password","123456");
		Connection connect = driver.connect(url, properties);
		System.out.println(connect);
    }
}

方式二:DriverManager

代码示例:

public class JDBCDemo{
    public static void main(String[] args) throws Exception{
		Driver driver = new com.mysql.jdbc.Driver();
		//将driver注册到DriverManager中
		DriverManager.registerDriver(driver);
		//通过DriverManager获取数据库连接对象
		Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db","root", "123456");
System.out.println(connection);
    }
}

或者

public class JDBCDemo{
    public static void main(String[] args) throws Exception{
		//com.mysql.jdbc.Driver中的static静态代码块中写有将Driver注册到DriverManager中,故只要让com.mysql.jdbc.Driver进行类加载就可以直接通过DriverManager获取到连接对象,所以可以像下面这样写
		Class.forName("com.mysql.jdbc.Driver"); //加载参数中传的类
		//获取数据库连接对象
		Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db","root", "123456");
		System.out.println(connection);
    }
}

方式三:DriverManager+配置文件

配置文件jdbc.properties:

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db
username=root
password=123456

读取配置文件示例:

/*
Properties是Hashtable类的子类
Properties中key和value都是String类型
可以通过Properties去读取配置文件中的内容
*/
public class PropertiesDemon{
    public static void main(String[] args) throws Exception{
        //读取配置文件中的内容:在项目的根目录下创建一个 xxx.properties文件
        //创建Properties对象
        Properties p = new Properties();
        //加载流
        FileInputStream fis = new FileInputStream("jdbc.properties");
        p.load(fis);
        //读取配置文件中的内容
        String username = p.getProperty("username");
        String password = p.getProperty("password");
        System.out.println(username + " " + password);
        //关资源
        fis.close();
    }
}

获取数据库连接:

public class JDBCDemo{
    public static void main(String[] args) throws Exception{
        String driverClass = "";
        String url = "";
        String username = "";
        String password = "";
        //通过Properties读取内容
        //创建Properties对象
        Properties p = new Properties();
        //加载流
        FileInputStream fis = new FileInputStream("jdbc.properties");
        p.load(fis);
        driverClass = p.getProperty("driverClass");
        url = p.getProperty("url");
        username = p.getProperty("username");
        password = p.getProperty("password");
        //关资源
        fis.close();
        //类加载
        Class.forName(driverClass);
        //获取数据库连接对象
        Connection connection = DriverManager.getConnection(url,username,password);
        System.out.println(connection);
    }
}

封装JDBCUtils工具类

配置文件:

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db?rewriteBatchedStatements=true
username=root
password=123456

代码示例:

public class JDBCUtils {
    //属性有默认值,方法内没有默认值需要赋值
    private static String driverClass;
    private static String url;
    private static String username;
    private static String password;

    static{
        FileInputStream fis = null;
        try {
            //获取数据库连接对象
            //通过Properties读取内容
            //创建Properties对象
            Properties p = new Properties();
            //加载流
            fis = new FileInputStream("jdbc.properties");
            p.load(fis);
            driverClass = p.getProperty("driverClass");
            url = p.getProperty("url");
            username = p.getProperty("username");
            password = p.getProperty("password");
        }catch (Exception e){
            //终止程序的运行
            e.printStackTrace();
            //将编译时异常转换成运行时异常,从而终止程序的运行
            throw new RuntimeException("xxxxxxxx");
        }finally {
            if (fis != null){
                //关资源
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //获取连接对象
    public static Connection getConnection(){
        try {
            Class.forName(driverClass);
            //获取数据库连接对象
            Connection connection = DriverManager.getConnection(url, username, password);
            return connection;
        }catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException("获取连接失败");
        }
    }

    //关闭资源
    public static void close(PreparedStatement ps, Connection connection) {
        if (ps != null){
            try {
                ps.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (connection != null){
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }

    
    public static void close(PreparedStatement ps, Connection connection, ResultSet resultSet) {
        close(ps,connection);
        if (resultSet != null){
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

对数据库的增删改查

示例:

/*表结构如下
CREATE TABLE student(
sid INT,
sname VARCHAR(20),
sage INT
)
*/
public class CRUDDemo {
    //添加一条数据
    @Test
    public void test() throws SQLException {
        //获取数据库连接对象
        Connection connection = JDBCUtils.getConnection();
        //预编译
        //?:占位符(只能是设置数据的地方可以写成占位符)
        String sql = "insert into student(sid,sname,sage) values(?,?,?)";
        PreparedStatement ps = connection.prepareStatement(sql);
        //给占位符赋值
        /*
        setInt(int parameterIndex, int x)
        parameterIndex : 参数索引(第几个占位符)
        x : 数据
        */
        ps.setInt(1,100);
        //数据可不可以设置成中文取决于表的编码集
        ps.setString(2,"robofly");
        ps.setInt(3,20);
        //执行sql
        //返回值 : 有几条数据受到影响
        int result = ps.executeUpdate(); //增,删,改的语句使用该方法
        System.out.println("有"+result+"条数据受到影响");
        //关资源
        JDBCUtils.close(ps,connection);
    }

    //修改数据
    @Test
    public void test2() throws SQLException {
        //获取数据库连接对象
        Connection connection = JDBCUtils.getConnection();
        //预编译
        String sql = "update student set sid=? where sid=?";
        PreparedStatement ps = connection.prepareStatement(sql);
        //给占位符赋值
        ps.setInt(1,10);
        ps.setInt(2,100);
        //执行sql语句
        int result = ps.executeUpdate();
        System.out.println("有"+result+"条数据受到影响");
        //关闭资源
        JDBCUtils.close(ps,connection);
    }

    //删除数据
    @Test
    public void test3() throws SQLException {
        //获取数据库连接对象
        Connection connection = JDBCUtils.getConnection();
        //预编译
        String sql = "delete from student where sid=?";
        PreparedStatement ps = connection.prepareStatement(sql);
        //给占位符赋值
        ps.setInt(1,10);
        //执行sql语句
        int i = ps.executeUpdate();
        System.out.println("有"+i+"条数据受到影响");
        //关闭资源
        JDBCUtils.close(ps,connection);
    }

    //查询数据
    @Test
    public void test4() throws Exception {
        List<Student> students = getStudent();
        for (Student s : students) {
            System.out.println(s);
        }
    }

    public List<Student> getStudent() throws Exception {
        //获取数据库连接对象
        Connection connection = JDBCUtils.getConnection();
        //预编译
        PreparedStatement ps = connection.prepareStatement("select sid,sname,sage from student");
        //执行sql语句
        ResultSet resultSet = ps.executeQuery(); //查询语必须执行此方法
        List<Student> list =  new ArrayList<>();
        //遍历ResultSet
        while(resultSet.next()){ //是否有数据
            /*
            getInt(String columnLabel):根据字段名获取对应的数据
            getInt(int columnIndex):根据列的索引获取对应的数据
            */
            int sid = resultSet.getInt("sid");
            String sname = resultSet.getString("sname");
            int sage = resultSet.getInt("sage");
            //System.out.println(sid + " " + sname + " " + sage);
            list.add(new Student(sid,sname,sage));
        }
        //关闭资源
        JDBCUtils.close(ps,connection,resultSet);
        return list;
    }
}

JavaBean:用来装数据对象的类叫JavaBean,此处的Student类可称为JavaBean。

数据库事务

事务概述

事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。

案例

/*
AA给CC转账1000
	AA 2000
	CC 2000
	try{
		开启事务
		AA -= 1000
		System.out.println(1/0); //遇到异常
		CC += 1000
		提交(一旦提交数据不能再回滚(撤销))
	}catch(Exception e){
		事务回滚(撤销)
	}
*/
//表结构如下
CREATE TABLE account(
NAME VARCHAR(20),
balance INT
)

代码实现

public class AccountDemo {
    public static void main(String[] args) throws SQLException {
        //获取数据库连接对象
        Connection connection = JDBCUtils.getConnection();
        PreparedStatement ps = null;
        try {
            //开启事务:禁止自动提交
            connection.setAutoCommit(false);
            //做具体的操作:执行sql语句
            //预编译
            String sql = "update account set balance=? where name=?";
            ps = connection.prepareStatement(sql);
            //给占位符赋值
            ps.setInt(1, 1000);
            ps.setString(2, "aa");
            //执行sql
            ps.executeUpdate();
            System.out.println(1 / 0); //遇到异常
            //给占位符赋值
            ps.setInt(1, 3000);
            ps.setString(2, "cc");
            //执行sql
            ps.executeUpdate();
            //事务提交
            connection.commit();
        }catch (Exception e){
            e.printStackTrace();
            //事务回滚
            connection.rollback();
        }finally {
            //允许自动提交
            connection.setAutoCommit(true);
            //关闭资源:最后关闭资源
            JDBCUtils.close(ps,connection);
        }
    }
}

数据库连接池

什么是数据库连接池

连接对象的缓冲区,负责申请,分配管理,释放连接的操作。

线程池核心类库有可直接用,但数据库连接池核心类库没有,自己写或者用别人写好的。

为什么要用数据库连接池

通过DriverManager获取新连接,用完直接抛弃断开,连接的利用率太低,过于浪费,对于数据库服务器来说压力太大。

阿里的德鲁伊连接池(DRUID)

  1. 导包:同jdbc.jar
  2. 代码:

方式一:

public class DruidDemo{
    public static void main(String[] args){
        //创建Druid的DataSource对象
        DruidDataSource source = new DruidDataSource();
        //配置
        source.setDriverClassName("com.mysql.jdbc.Driver");
        source.setUrl("jdbc:mysql://localhost:3306/db");
        source.setUsername("root");
        source.setPassword("123456");
        //获取连接对象
        Connection connection = source.getConnection();
        System.out.println(connection);
    }
}

方式二:
配置文件:key的值不可修改

url=jdbc:mysql://localhost:3306/db
username=root
password=123456
driverClassName=com.mysql.jdbc.Driver

代码:

public class DruidDemo{
    public static void main(String[] args){
        //创建Properties对象
        Properties pro = new Properties();
        //创建文件输入流
        FileInputStream fis = new FileInputStream("druid.properties"); //配置文件的名字可以随便写
        //加载流
        pro.load(fis);
        //通过DruidDataSourceFactory创建连接池对象
        DataSource source = DruidDataSourceFactory.createDataSource(pro);
        //获取连接对象
        Connection connection = source.getConnection();
        System.out.println(connection);
        //关闭资源
        //...
    }
}

DBUtils工具类

DBUtils也是一个小的框架

  1. 导包:同上
  2. 代码:
//通过使用DBUtils工具类实现增删改查的操作
public class DruidDemo{
    @Test
    public void test() throws SQLException {
        //创建操作对象
        QueryRunner queryRunner = new QueryRunner();
        //增,删,改是一个方法
        /*
        update(Connection conn, String sql, Object param)
        conn:连接对象
        sql:sql语句
        param:给占位符赋值的内容
        */
        String sql = "insert into student(sid,sname,sage) values(?,?,?)";
        //返回值:有几条数据受到影响
        int i = queryRunner.update(JDBCUtils.getConnection(),sql, 10, "kongkong", 18);
        System.out.println("有" + i + "条数据受到影响");
    }

    @Test
    public void test2() throws SQLException {
         QueryRunner queryRunner = new QueryRunner();
         /*
         query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
         conn:连接对象
         sql:sql语句
         */
		//String sql = "select sid a,sname,sage from student where sid=?";
		//注意:类中的属性名一定要和字段名相同。如果不相同则需要在sql语句中使用别名
		//Student student = queryRunner.query(JDBCUtils.getConnection(), sql, new BeanHandler<Student>(Student.class), 10);
		String sql = "select sid a,sname,sage from student";
         //通过反射拿到所有的属性,通过sql拿到所有的数据(是通过属性名找到对应的字段数据)
         List<Student> list = queryRunner.query(JDBCUtils.getConnection(), sql, new BeanListHandler<Student>(Student.class));
         for (Student s : list) {
			 System.out.println(s);
         }
	}
}

批处理操作

使用批处理注意

  1. mysql驱动包的版本必须为5.1.3x 才支持批处理
  2. 在url连接中添加如下参数
    jdbc:mysql://localhost:3306/db?rewriteBatchedStatements=true

调用方法

//添加到批处理中
addBatch();
//执行批处理
executeBatch();
//清空批处理
clearBatch();

代码实现

public class DruidDemo{
    @Test
    public void test2() throws SQLException {
        //获取数据库连接
        Connection connection = JDBCUtils.getConnection();
        //预编译
        PreparedStatement ps = connection.prepareStatement("insert into student(sid,sname,sage) values(?,?,?)");
        //给占位符赋值
        for (int i = 1; i <= 100000 ; i++) {
            ps.setInt(1,i);
            ps.setString(2,"aaa"+i);
            ps.setInt(3,i);
            //添加到批处理中
            ps.addBatch();
            if (i % 1000 == 0){
                //执行sql
                ps.executeBatch(); //执行批处理
                //清空批处理
                ps.clearBatch();
            }
        }
        //关闭资源
        JDBCUtils.close(ps,connection);
    }
}

最后,今天的内容就到这里,Java系列更新中,喜欢的话点个关注吧,下篇见!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农高飞

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值