JDBC基础应用

JDBC是Java连接数据库的一套接口,可以让我们方便的在Java中使用数据库。掌握JDBC的使用是Java开发的基本功。

预备工作

  • 导入jar包。根据使用的数据库软件导入相应的jar包。idea相应设置中添加。

代码部分(MySQL为例)

//	1.加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.从驱动管理器获取JDBC连接对象
Connection conn = DriverManager.getConnection("数据库连接地址","帐号","密码");
/********************************************************************
* 连接地址基本格式--> 主协议:子协议://ip地址:端口号/数据库名称 *
* mysql的连接地址--> jdbc:mysql://localhost:3306/mydatabase *
* oracle的连接地址--> jdbc:oracle:thin:@localhost:1521:ORCL *
********************************************************************/
// 3.从连接对象获取SQL执行环境
Statement state = conn.createStatement();
// 4.执行SQL语句
state.execute("SQL语句");
// 5.释放资源
state.close();
conn.close();
  • JDBC中的方法说明
Statement
//此方法将会执行SQL语句,如果是查询语句返回ture否则返回false
boolean execute(String sql);
//此方法执行DML和DDL语句,int返回值代表影响行数(准确的说,是筛选条件选中的行数)
int executeUpdate(String sql);
//执行查询语句,查询结果以集合形式返回
ResultSet executeQuery(String sql); /*ResultSet的行为相当于带头节点的链表,最开始指针指向头节点,而不是第一行数据*/
ResultSet
//调用一次,指针向下一行移动,如果下一行不存在函数返回false
boolean next();
//其他移动方式
boolean privious();
boolean absolute(int row);
boolean beforeFirst();
boolean afterLast();
//获取行字段,XXX是字段的类型
XXX getXXX(String columnLabel); //columnLabel是字段名
XXX getXXX(int columnIndex); //columnIndex是字段索引,从1开始

SQL参数问题--注入问题

在实际项目中,SQL的参数一定是以变量形式传入,将变量放入SQL语句中最直接的方法就是字符串拼接。

public void setName(String id,String newName){
...
state.executeUpdate("update students set s_name='" + newName + "' where s_id='" + id + "'");
}

<!>请注意

-- 上面的代码看上去没有任何问题,比如传入参数23和"张飞",就能把id为23的同学名字改为"张飞"
-- 对应生成的SQL语句为
update students set name='张飞' where sid='23' -- 当id == "1' or '1'='1"时,拼接的语句会是什么?
update students set name='张飞' where sid='1' or '1'='1'
-- 这句SQL的顾虑条件变成了恒为true的表达式!执行这句SQL将会把所有学生名字改为'张飞'
-- 这不是我们想要的结果,拼接后改变了原本的语义。这就是注入问题

预编译解决SQL注入问题

//参数用?代替
PreparedStatement state = conn.prepareStatement("update students set name=? where sid=?");
//设置参数,参数索引从1开始
state.setString(1,"张飞");
state.setString(2,"1' or '1'='1");
//预编译的SQL不会被改变语义,"1' or '1'='1"仅作为参数被传递
state.execute();

使用事务

当我们遇到类似于转账业务时,需要使用业务保障转账的安全性。资金从一个账户转移到另一个账户,两个账户数据的改变必须同时成功或失败,否则可能出现资金凭空消失或凭空增加的情况!

//conn是获得的数据库连接对象
conn.setAutoCommit(false); //开启事务
conn.rollback(); //回滚事务
conn.commit(); //提交事务 /*在try-catch块中,出现异常时应回滚事务,并在finally中释放资源*/

JDBC进阶--DAO设计模式

DAO(Data Access Object)是数据访问接口。DAO模式就是将数据库操作于业务逻辑解耦合,提高程序的扩展性。

典型的DAO实现具备四个部件

  • DAO接口。业务逻辑所面向的接口,与具体实现无关。
  • DAO接口的实现类,定义了具体与如何操作数据库。
  • 数据传递对象。业务代码从DAO拿到的数据不应该是ResultSet对象,而是根据业务重新封装的合适对象。
  • DAO的工厂类。业务从工厂获得DAO实例,实现了业务与数据库操作的进一步解耦合。

JDBC进阶--连接池

连接池和多线程中的线程池相似。使用了动态代理和装饰者模式,使得极大减少了数据库的重复连接,提高了数据库使用性能。此外连接池顺便把类加载、连接地址登录的步骤和连接参数设定封装起来,参数从代码中分离到properties文件当中。

知识点补充:使用 .properties 文件作为配置文件

properties文件是以键值对文本方式存储数据。Java中有对应的Properties类专门用于读取properties文件的内容。Properties是Map集合的一个具体实现。具体操作方式如下:

//将配置文件druid.properties放到src文件夹下
public class Demo{
public static void main(String[] args) throws Exception {
Properties ppt = new Properties();
//将properties文件作为输入流,通过.load()方法从流中将数据读入集合中。
InputStream is = Demo.class.getClassLoader().getResourceAsStream("druid.properties");
ppt.load(is);
}
}

连接池使用

  • 准备工作,导入jar包。

  • 将 properties配置文件 放到src文件夹下

  • 获得连接池对象

//读取druid.properties文件步骤见上面代码。最终得到Properties对象:ppt

//获取连接池和配置参数一步完成(代码以Druid池为例,若使用其他连接池,此处工厂类要做相应的改变)
DataSource dataSource = DruidDataSourceFactory.createDataSource(ppt);
  • 使用连接池
//	1.从连接池获取数据库连接
Connection conn = dataSource.getConnection();
// 2.使用使用步骤与前面完全相同,最后一样要释放连接资源
Statement state = conn.createStatement();
state.execute("insert into person values('zhangsan','lisi')");
state.close();
conn.close(); /*从池中获取的连接关闭只是把连接放回池中,实际的连接是否关闭由连接池动态管理*/

总结

  • JDBC是什么?
  • JDBC使用步骤?加载驱动>>获取连接>>获取SQL执行环境>>执行SQL>>处理执行结果>>释放资源
  • 解决注入问题?预编译的使用...
  • DAO设计模式?解耦合、典型四个DAO部件
  • properties配置文件的使用
  • 连接池?原理、配置、使用、区别、优点

JDBC概要的更多相关文章

  1. Java JDBC概要总结一(基本操作和SQL注入问题)

    JDBC定义: JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API.JDBC是Java访问数据库的标准规范,可以为不同的关系 ...

  2. 程序员与数据库打交道的JDBC知识概要

    1.JDBC全称:Java database connectivity,Java数据库连接. (1)           JDBC是一种用于执行SQL语句的Java API,为多种关系数据库提供多种统 ...

  3. 不知道数据库中表的列类型的前提下,使用JDBC正确的取出数据

    概要: 使用jdbc 如果在不知道表结构的情况下,如何读出表信息? 使用ResultSetMetaData; 然后使用getColumnType 获取column 类型 使用getColumnName ...

  4. jdbc-connect-oracle12c-pdb/cdb(jdbc连接oracle12c的pdb和cdb)

      1       本文简介: 通过特意引发问题,聚焦问题,解决问题,并循序渐进 最后总结jdbc连接oracle12c中cdb和pdb的条件. 软件环境:Redhat7.1+orcacle12c 2 ...

  5. JDBC batch批处理Statement executeBatch 具体解释

    JDBC提供了数据库batch处理的能力,在数据大批量操作(新增.删除等)的情况下能够大幅度提升系统的性能.我曾经接触的一个项目,在没有採用batch处理时,删除5万条数据大概要半个小时左右,后来对系 ...

  6. JDBC batch批量Statement executeBatch 详细解释

    JDBC提供了数据库batch处理的能力,在数据大批量操作(新增.删除等)的情况下能够大幅度提升系统的性能.我曾经接触的一个项目,在没有採用batch处理时,删除5万条数据大概要半个小时左右,后来对系 ...

  7. Hibernate进化史-------Hibernate概要

    一个.Hibernate概要 什么是Hibernate呢?首先,Hibernate是数据持久层的一个轻量级框架.实现了ORMapping原理(Object Relational Mapping). 在 ...

  8. jdbc学习笔记

    知识概要: 1.JDBC简介 2.JDBC的编码步骤 3.JDBC中常用接口或类详解 4.JDBC中释放资源 5.JDBC进行CRUD 1.JDBC简介 JDBC:Java DataBase Conn ...

  9. JavaWeb核心技术学习 - 1.从JDBC说起

    作者:java1to3链接:http://www.cnblogs.com/java1to3/著作权归作者所有.未经作者本人同意,禁止一切转载.商业或非商业转载请联系作者获得授权并请注明出处. ・JDB ...

随机推荐

  1. poj2926Requirements (曼哈顿距离)

    Description An undergraduate student, realizing that he needs to do research to improve his chances ...

  2. Educational Codeforces Round 96 (Rated for Div. 2) E. String Reversal (思维,逆序对)

    题意:给你一个字符串,每次可以调换现字符串的相邻两个字符,问最少操作多少次使得这个字符串等于其反转过来的字符串. 题解:先考虑字符串中没有相同字符的情况,那么我们每次将目前字符串的最后一个字符一直调换 ...

  3. HDU 3416 Marriage Match IV (最短路径&&最大流)

    /*题意: 有 n 个城市,知道了起点和终点,有 m 条有向边,问从起点到终点的最短路一共有多少条.这是一个有向图,建边的时候要注意!!解题思路:这题的关键就是找到哪些边可以构成最短路,其实之前做最短 ...

  4. HDU-6608 Fansblog(威尔逊定理+素数间隔+逆元)

    参考博客:https://blog.csdn.net/birdmanqin/article/details/97750844 题目链接:链接:http://acm.hdu.edu.cn/showpro ...

  5. 字典树 && 例题 Xor Sum HDU - 4825 (板子)

    一.字典树描述:Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优 ...

  6. C++构造函数、复制函数易错点

    C++中复制函数在三种情况下自动调用: 用一个对象初始化另一个对象 函数的参数为对象 函数的返回值为对象 下面用几个代码片段解释复制函数的调用中的一些常见"坑": 一:默认复制函数 ...

  7. 按层次顺序创建二叉树;判断BST

    https://github.com/TouwaErioH/subjects/tree/master/C%2B%2B/PA2 BST 假设已经给定树节点的结构不可修改. 然后输入是按照层次顺序 怎样创 ...

  8. HDU 4675 GCD of Sequence(莫比乌斯反演 + 打表注意事项)题解

    题意: 给出\(M\)和\(a数组\),询问每一个\(d\in[1,M]\),有多少组数组满足:正好修改\(k\)个\(a\)数组里的数使得和原来不同,并且要\(\leq M\),并且\(gcd(a_ ...

  9. mybaits(十)mybatis常见面试

      面试题总结 1.MyBatis 解决了什么问题? 或:为什么要用 MyBatis? 或:MyBatis 的核心特性? 1)资源管理(底层对象封装和支持数据源) 2)结果集自动映射 3)SQL 与代 ...

  10. mybatis(二)全局配置mybatis-config.xml

    转载:https://www.cnblogs.com/wuzhenzhao/p/11092526.html 大部分时候,我们都是在Spring 里面去集成MyBatis.因为Spring 对MyBat ...