JDBC概要
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概要的更多相关文章
- Java JDBC概要总结一(基本操作和SQL注入问题)
JDBC定义: JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API.JDBC是Java访问数据库的标准规范,可以为不同的关系 ...
- 程序员与数据库打交道的JDBC知识概要
1.JDBC全称:Java database connectivity,Java数据库连接. (1) JDBC是一种用于执行SQL语句的Java API,为多种关系数据库提供多种统 ...
- 不知道数据库中表的列类型的前提下,使用JDBC正确的取出数据
概要: 使用jdbc 如果在不知道表结构的情况下,如何读出表信息? 使用ResultSetMetaData; 然后使用getColumnType 获取column 类型 使用getColumnName ...
- jdbc-connect-oracle12c-pdb/cdb(jdbc连接oracle12c的pdb和cdb)
1 本文简介: 通过特意引发问题,聚焦问题,解决问题,并循序渐进 最后总结jdbc连接oracle12c中cdb和pdb的条件. 软件环境:Redhat7.1+orcacle12c 2 ...
- JDBC batch批处理Statement executeBatch 具体解释
JDBC提供了数据库batch处理的能力,在数据大批量操作(新增.删除等)的情况下能够大幅度提升系统的性能.我曾经接触的一个项目,在没有採用batch处理时,删除5万条数据大概要半个小时左右,后来对系 ...
- JDBC batch批量Statement executeBatch 详细解释
JDBC提供了数据库batch处理的能力,在数据大批量操作(新增.删除等)的情况下能够大幅度提升系统的性能.我曾经接触的一个项目,在没有採用batch处理时,删除5万条数据大概要半个小时左右,后来对系 ...
- Hibernate进化史-------Hibernate概要
一个.Hibernate概要 什么是Hibernate呢?首先,Hibernate是数据持久层的一个轻量级框架.实现了ORMapping原理(Object Relational Mapping). 在 ...
- jdbc学习笔记
知识概要: 1.JDBC简介 2.JDBC的编码步骤 3.JDBC中常用接口或类详解 4.JDBC中释放资源 5.JDBC进行CRUD 1.JDBC简介 JDBC:Java DataBase Conn ...
- JavaWeb核心技术学习 - 1.从JDBC说起
作者:java1to3链接:http://www.cnblogs.com/java1to3/著作权归作者所有.未经作者本人同意,禁止一切转载.商业或非商业转载请联系作者获得授权并请注明出处. ・JDB ...
随机推荐
- poj2926Requirements (曼哈顿距离)
Description An undergraduate student, realizing that he needs to do research to improve his chances ...
- Educational Codeforces Round 96 (Rated for Div. 2) E. String Reversal (思维,逆序对)
题意:给你一个字符串,每次可以调换现字符串的相邻两个字符,问最少操作多少次使得这个字符串等于其反转过来的字符串. 题解:先考虑字符串中没有相同字符的情况,那么我们每次将目前字符串的最后一个字符一直调换 ...
- HDU 3416 Marriage Match IV (最短路径&&最大流)
/*题意: 有 n 个城市,知道了起点和终点,有 m 条有向边,问从起点到终点的最短路一共有多少条.这是一个有向图,建边的时候要注意!!解题思路:这题的关键就是找到哪些边可以构成最短路,其实之前做最短 ...
- HDU-6608 Fansblog(威尔逊定理+素数间隔+逆元)
参考博客:https://blog.csdn.net/birdmanqin/article/details/97750844 题目链接:链接:http://acm.hdu.edu.cn/showpro ...
- 字典树 && 例题 Xor Sum HDU - 4825 (板子)
一.字典树描述:Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优 ...
- C++构造函数、复制函数易错点
C++中复制函数在三种情况下自动调用: 用一个对象初始化另一个对象 函数的参数为对象 函数的返回值为对象 下面用几个代码片段解释复制函数的调用中的一些常见"坑": 一:默认复制函数 ...
- 按层次顺序创建二叉树;判断BST
https://github.com/TouwaErioH/subjects/tree/master/C%2B%2B/PA2 BST 假设已经给定树节点的结构不可修改. 然后输入是按照层次顺序 怎样创 ...
- HDU 4675 GCD of Sequence(莫比乌斯反演 + 打表注意事项)题解
题意: 给出\(M\)和\(a数组\),询问每一个\(d\in[1,M]\),有多少组数组满足:正好修改\(k\)个\(a\)数组里的数使得和原来不同,并且要\(\leq M\),并且\(gcd(a_ ...
- mybaits(十)mybatis常见面试
面试题总结 1.MyBatis 解决了什么问题? 或:为什么要用 MyBatis? 或:MyBatis 的核心特性? 1)资源管理(底层对象封装和支持数据源) 2)结果集自动映射 3)SQL 与代 ...
- mybatis(二)全局配置mybatis-config.xml
转载:https://www.cnblogs.com/wuzhenzhao/p/11092526.html 大部分时候,我们都是在Spring 里面去集成MyBatis.因为Spring 对MyBat ...