JDBC知识总结

JDBC个人复习资料

https://how2j.cn/

JDBC是什么?

JDBC(Java Data Base Connectivity),通过Java编程语言来对数据库进行访问.

Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。

JDBC怎么用?

JDBC的基本使用

要想使用JDBC,实现要导入相应jar包或者相应的maven坐标.
具体流程:
1. 注册驱动
2. 获取数据库连接对象
3. 获取SQL语句操作对象
4. 执行SQL语句

         	//1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.建立与数据库的连接
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis", "root", "root");
            //3.创建Statement
            Statement statement = connection.createStatement();
             //4.定义SQL语句
            String sql="delete from user where id = 52";
            //执行SQL语句
            statement.execute(sql);

JDBC的删除,增加,修改

在JDBC中,增加,删除,修改操作相同,只是操作的SQL语句不同.
删除:

			String sql="delete from user where id = 52";
            //执行SQL语句
            statement.execute(sql);

增加:

			String sql="INSERT INTO USER (username,sex,address)VALUES('赵','女','唐山')";
            //执行sql语句
            boolean execute = statement.execute(sql);

修改:

			String sql=" update user set sex = '男' where id = 51";
            //执行SQL语句
            statement.execute(sql);

JDBC查询

			//定义SQL语句
            String sql=" select * from user ";
            //执行SQL语句
            ResultSet resultSet = statement.executeQuery(sql);
            while (resultSet.next()) {
                int id = resultSet.getInt("id");// 可以使用字段名
                String username = resultSet.getString(2);// 也可以使用字段的顺序
                Date birthday = resultSet.getDate("birthday");
                String sex = resultSet.getString(4);
                String address = resultSet.getString(5);
                System.out.println(id+username+birthday+sex+address);
            }

注意:
在取第二列的数据的时候,用的是rs.get(2) ,而不是get(1). 这个是整个Java自带的api里唯二的地方,使用基1的,即2就代表第二个。

Statement和PreparedStatement区别

和 Statement一样,PreparedStatement也是用来执行sql语句的
与创建Statement不同的是,需要根据sql语句创建PreparedStatement
除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接

	//3.定义SQL语句
            String sql=" INSERT INTO USER (username,sex,address)VALUES(?,?,?)";
            //4.创建PreparedStatement
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1,"张三");
            preparedStatement.setString(2,"男");
            preparedStatement.setString(3,"北京");
            //执行SQL语句
            preparedStatement.execute();
            preparedStatement.close();
            connection.close();

使用PreparedStatement的优点:
* Statement 需要进行字符串拼接,可读性和维护性比较差,而PreparedStatement 使用参数设置,可读性好,不易犯错.
* PreparedStatement有预编译机制,性能比Statement更快
* 防止SQL注入式攻击

execute与executeUpdate的区别

相同点:
都可以执行增加,删除,修改
不同点:

1. execute可以执行查询语句,然后通过getResultSet,把结果集取出来,而executeUpdate不能执行查询语句
 		s.execute(sqlSelect);
         ResultSet rs = s.getResultSet();
2. execute返回boolean类型,true表示执行的是查询语句,false表示执行的是insert,delete,update等操作,executeUpdate返回的是int,表示有多少条数据受到了影响.

JDBC特殊操作

  • 获取自增长ID
    在Statement通过execute或者executeUpdate执行完插入语句后,MySQL会为新插入的数据分配一个自增长id,但是无论是execute还是executeUpdate都不会返回这个自增长id是多少。需要通过Statement的getGeneratedKeys获取该id.
			preparedStatement.execute();
            ResultSet generatedKeys = preparedStatement.getGeneratedKeys();
            if (generatedKeys.next()) {
                int id = generatedKeys.getInt(1);
                System.out.println(id);
            }
  • 获取元数据
    元数据概念:
    和数据库服务器相关的数据,比如数据库版本,有哪些表,表有哪些字段,字段类型是什么等等。
			 //1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.建立与数据库的连接
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis", "root", "root");
            // 查看数据库层面的元数据
            // 即数据库服务器版本,驱动版本,都有哪些数据库等等

            DatabaseMetaData dbmd = connection.getMetaData();

            // 获取数据库服务器产品名称
            System.out.println("数据库产品名称:\t"+dbmd.getDatabaseProductName());
            // 获取数据库服务器产品版本号
            System.out.println("数据库产品版本:\t"+dbmd.getDatabaseProductVersion());
            // 获取数据库服务器用作类别和表名之间的分隔符 如test.user
            System.out.println("数据库和表分隔符:\t"+dbmd.getCatalogSeparator());
            // 获取驱动版本
            System.out.println("驱动版本:\t"+dbmd.getDriverVersion());

            System.out.println("可用的数据库列表:");
            // 获取数据库名称
            ResultSet rs = dbmd.getCatalogs();

            while (rs.next()) {
                System.out.println("数据库名称:\t"+rs.getString(1));

JDBC事务

在事务中的多个操作,要么都成功,要么都失败
通过 setAutoCommit(false);关闭自动提交
使用 commit();进行手动提交
在事务中,及时第一条SQL语句是可以执行的,但是第二条SQL语句有错误,其结果就是两条SQL语句都没有被提交。 除非两条SQL语句都是正确的。

			// 有事务的前提下
            // 在事务中的多个操作,要么都成功,要么都失败
  
            c.setAutoCommit(false);
  
            // 加血的SQL
            String sql1 = "update hero set hp = hp +1 where id = 22";
            s.execute(sql1);
  
            // 减血的SQL
            // 不小心写错写成了 updata(而非update)
  
            String sql2 = "updata hero set hp = hp -1 where id = 22";
            s.execute(sql2);
  
            // 手动提交
            c.commit();

注意: MYSQL 表的类型必须是INNODB才支持事务

JDBC ORM思想

ORM(Object Relationship Database Mapping) 就是实现对象和关系数据库的映射关系.数据库中每一个表都对应一个类.每行数据对应一个对象.

JDBC Dao

DAO(DataAccess Object),数据访问对象
实现将对数据库的操作封装在一个类中.其他类需要对数据库进行访问只需要调用该类即可.

JDBC数据库连接池

连接池的概念
与传统方式不同,连接池在使用之前,就会创建好一定数量的连接。
如果有任何线程需要使用连接,那么就从连接池里面借用,而不是自己重新创建.
使用完毕后,又把这个连接归还给连接池供下一次或者其他线程使用。
倘若发生多线程并发情况,连接池里的连接被借用光了,那么其他线程就会临时等待,直到有连接被归还回来,再继续使用。
整个过程,这些连接都不会被关闭,而是不断的被循环使用,从而节约了启动和关闭连接的时间。
常用连接池:

  • DBCP
  • c3p0
  • druid
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值