JDBC
一、什么是JDBC
JDBC是java数据库连接技术,通用的sql数据库存取与操作的公用接口(一套标准接口)。定义了用来访问数据库的标准JAVA类库,能够快速高效的访问数据库。
二、为什么使用JDBC
1.为访问不同的数据库提供了统一的途径,为开发者屏蔽了一些细节问题。
2.java程序员通过JDBC可以连接到任何提供了JDBD驱动程序的数据库系统,开发者无需对连接的数据库系统有过多的了解,简化和加快了开发的过程。
三、JDBC构成
1.面向应用程序的API:程序开发人员使用(连接数据库、执行sql、获取结果)
2.面向数据库的API:数据库开发驱动时使用
四、JDBC编程步骤
1.加载驱动
2.获取连接
3.创建数据库操作对象
4.执行sql
5.获取结果集(查询时有)
6.释放资源
/**
* JDBC快速入门
*/
public class JDBCDemo {
public static void main(String[] args) throws Exception {
//1. 注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//2. 获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db1";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url, username, password);
//3. 定义sql
String sql = "update account set money = 2000 where id = 1";
//4. 获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//5. 执行sql
ResultSet rs = stmt.executeQuery("SELECT user_name, age FROM imooc_goddess");//返回查询的结果集
//6. 处理结果
while(rs.next()){ //如果有数据,rs.next()返回true
System.out.println(rs.getString("user_name")+" 年龄:"+rs.getInt("age"));
}
//7. 释放资源
rs.close();
stmt.close();
conn.close();
}
}
五、数据库连接池
1.什么是数据库连接池
数据库连接池是个容器,负责分配、管理数据库连接(Connection)。它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
2.基本思想
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
3.好处
资源重用
提升系统响应速度
避免数据库连接遗漏
4.数据库连接池的运行机制:
从连接池获取或创建可用的连接;
使用完毕之后,把连接返还给连接池;
在系统关闭前,断开所有连接并释放连接占用的系统资源;
还能够处理无效连接(原来登记为可用的连接,由于某种原因不再可用,如超时、通讯问题),并能限制连接池中的连接总数不低于某个预定值和不超过某个预定值;
常用连接池: DBCP、C3P0、Druid
与其他数据库连接池相比,Druid在性能、可扩展性、可靠性、安全性和功能方面都有很好的表现,是目前最优秀的数据库连接池之一。
MyBatis
一、什么是mybatis
mybatis是一个半ORM(对象关系映射)的持久层框架,他封装了JDBC,简化了数据库访问的繁琐流程,又保留了对sql的原生态操作。通过xml或注解来映射对象与sql之间的关系,帮助开发者加快了CRUD的操作。
二、mybatis优点和缺点
优点
1.轻量级:配置简单灵活
2.sql控制:编写的sql语句可以直接与数据库进行交互,便于处理复杂的sql查询
3.可插拔性:能够很好的适配spring
4.动态sql:允许动态生成sql
5.缓存支持:支持一级缓存和二级缓存
缺点
1.sql语句的编写工作量大,特别是对一些复杂的查询,需要有一定的sql功底
2.sql语句依赖于数据库,迁移性比较差
三、mybatis基本概念
1.sqlsessionfactory:负责创建sqlsession,通过xml文件配置或者由java配置类构建
2.sqlsession:负责执行sql语句,每次操作数据库都会创建一个新的sqlsession,使用后关闭。
3.mapper接口:定义数据库操作的接口,mybatis自动生成实现类
4.实体类(POJO):与数据库表结构对应的java类,学要有get、set方法
6.mapper文件,mybatise的核心组件,负责映射sql结果与实体类之间的关系
7.mybatis配置文件:是整个框架的核心,定义了数据库连接、事务管理、Mapper映射等
四、mybatis是否支持延迟加载,延迟加载的原理是什么
mybatis中只有association关联对象和collection关联集合支持延迟加载。association是一对一查询,collection是一对多查询。在配置文件中可以配置是否开启延迟加载。
原理:创建目标对象的代理对象,当调用方法时进入拦截器。比如调用a.getB().getName(),拦截器的invoke()方法发现a.getB()是null,会单独发送事先保存好的查询关联B的sql,查询出B并调用a.setB(b)方法。这样b就有值了,再调用a.getB().getName(),这就是延迟加载的基本原理。
五、mybatis的缓存机制
1.一级缓存
为什么使用一级缓存?
在应用运行的过程中,会出现在同一次数据库会话中,多次执行查询同一个sql。为了优化这种情况,将同一个sql查询放入到缓存中,下次命中缓存获取,减少了对数据库的查询,提高性能。
每个sqlsession都持有一个executor,每个executor对应一个localcache,发起查询时,mybatis根据当前执行的sql语句生成mappedstatement,在localcache中查询,如果命中直接获取结果,未命中数据库查询并写入缓存。
一级缓存的生命周期和sqlsession是一致的
一级缓存实际上是一个没有大小限制的hasmap
一级缓存在读个sqlsession或分布式下会出现脏数据
2.二级缓存
二级缓存可以解决一级缓存无法在多个sqlsession使用的问题。开启二级缓存后,会使用cachingexecutor装饰executor。进入一级缓存前先进入二级缓存。开启二级缓存后,同一个namespace下的所有sql语句影响着同一个缓存,即缓存被多个sqlsession共享。
问题
联表查询时会出现脏数据
缓存实现都是在本地的,分布式必然会出现只能数据,不如直接使用分布式缓存。