持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情
MyBatis简介
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
原来的名字叫iBais
本来代码在Apache放着,后来又放到Google Code上了。然后就改名为Mybatis了~
优点
- 很容易学,很小巧,没有第三方依赖,装两个jar包+几个sql映射文件即可
- 灵活,因为我是学完动态sql之后才回来写的笔记,月学到后面越发现这玩意是真灵活能有很多组合呀,判断啊。然后呢,sql写在xml文件里,能方便的进行统一管理和优化。
- 提供映射标签,支持对象与数据库的字段关系映射
- 提供xml标签,支持动态sql就是编写一些判断语句根据实时发生的情况进行改变这就叫动态
缺点
- 写sql 的时候工作量很大,对于很多字段的,关联了很多表的更是这样,学着学着我就有感觉这玩意也没多容易啊不想前面学的spring和springMVC这么简单,这还是要写这么多。
- sql语句依赖于数据库,移植性差
- 二级缓冲机制不太行
JDBC
JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据。JDBC代表Java数据库连接
JDBC操作数据库的流程
面试可能会问,背!
下面这些就很固定的步骤
- 导入数据库驱动
- 注册驱动
- 获取数据库连接对象
- 写sql
- 预编译
- 执行sql
- 封装对象
JDBC连接池
获取数据库连接对象的时候太消耗资源,所以呢就出现连接池技术
我将数据库连接对象多放几个在一个池子里,你用的时候直接从池子里取不用的话在放回来。这样就不用一直连数据库了,提高了效率节省了资源
常用的连接池有Druid,C3P0
它优化后的JDBC流程为:
- 导入Druid的jar包
- 定义配置文件
- 通过工厂类获取数据库连接池对象
- 写sql
- 预编译
- 执行sql
- 封装结果
/**
* 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回
*/
public class JdbcDemo06 {
public static void main(String[]args){
List<Emp> list = new JdbcDemo06().findall();
System.out.println(list);
}
public List<Emp> findall() {
Connection conn = null;
Statement stmt = null;
ResultSet res = null;
ArrayList<Emp> list = null;
try {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
conn = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root");
//3.定义sql
String sql = "select * from emp";
//4.获取执行sql对象
stmt = conn.createStatement();
//5.执行sql
res = stmt.executeQuery(sql);
//6.处理结果
Emp emp = null;
list = new ArrayList<>();
while (res.next()) {
int id = res.getInt("id");
String ename = res.getString("ename");
int job_id = res.getInt("job_id");
//创建emp对象,并赋值
emp = new Emp();
emp.setId(id);
emp.setEname(ename);
emp.setJob_id(job_id);
//装载集合
list.add(emp);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (res != null) {
try {
res.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
return list;
}
}
输出结果为:
[Emp{id=1001, ename='孙悟空', job_id=4}, Emp{id=1002, ename='卢俊义', job_id=3}, Emp{id=1003, ename='林冲', job_id=3}, Emp{id=1004, ename='唐僧', job_id=2}, Emp{id=1005, ename='李逵', job_id=4}, Emp{id=1006, ename='宋江', job_id=2}, Emp{id=1007, ename='刘备', job_id=2}, Emp{id=1008, ename='猪八戒', job_id=4}, Emp{id=1009, ename='罗贯中', job_id=1}, Emp{id=1010, ename='吴用', job_id=3}, Emp{id=1011, ename='沙僧', job_id=4}, Emp{id=1012, ename='李逵', job_id=4}, Emp{id=1013, ename='小白龙', job_id=4}, Emp{id=1014, ename='关羽', job_id=4}]
Spring JdbcTemplate
用原生的jdbc API进行开发太繁琐了,例如我们要手动控制数据库连接的开启,异常处理,事务处理,最后还要关闭连接释放资源。
Spring帮我们提供了一个JDBC模块,它对Jdbc API进行了封装,目的就是为了更简洁的使用JDBC API。
使用SpringJDBC,开发人员只需要定义必要的参数、指定需要执行的sql语句,即可对数据库进行访问。
至于驱动的加载、数据库连接的开启与关闭、SQL 语句的创建与执行、异常处理以及事务处理等繁杂乏味的工作,则都是由 Spring JDBC 完成的。
简单的说就是,Spring框架对JDBC进行封装,使用JdbcTemplate方便实现对数据库操作。
为什么不用Spring JdbcTemplate
功能简单;
sql语句编写在java代码里;
硬编码高耦合
Hibernate?
全自动ORM框架,将jdbc的操作再次封装
只需要将一个javaBean交给它,它就能自己从数据库中取数据,全自动映射,不用自己写sql
如果要自己写sql,需要专门学习HQL
Mybatis?!
解决了Hibernate的问题,把编写sql这一步提取出来,把sql写在配置文件中
让程序员自己写sql
这节主要是简单了解下mybatis和jdbc,jdbctemplate他们的概念和他们之间的联系