一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情。
一、数据库操作框架的历程
1-1、JDBC
JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序
优点:运行期:快捷、高效
缺点:编辑期:代码量大、繁琐异常处理、不支持数据库跨平台
jdbc核心api
1.DriverManager 连接数据库
2.Connection 连接数据库的抽象
3.Statment 执行SQL
4.ResultSet 数据结果集
1-2、DBUtils
DBUtils是Java编程中的数据库操作实用工具,小巧简单实用。
DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
DBUtils三个核心功能介绍
1、QueryRunner中提供对sql语句操作的API
2、ResultSetHandler接口,用于定义select操作后,怎样封装结果集
3、DBUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法
1-3、Hibernate
Hibernate 是由 Gavin King 于 2001 年创建的开放源代码的对象关系框架(ORM-object relationl mapping)。它强大且高效的构建具有关系对象持久性和查询服务的 Java 应用程序。
ORM:
object java对象
relational 关系型数据(mysql/oracle/sql server)
mapping 映射
Hibernate 将 Java 类映射到数据库表中,从 Java 数据类型中映射到 SQL 数据类型中,并把开发人员从 95% 的公共数据持续性编程工作中解放出来。
Hibernate 是传统 Java 对象和数据库服务器之间的桥梁,用来处理基于 O/R 映射机制和模式的那些对象。
1-3-1、Hibernate 优势
核心优势
1、可以通过pojo直接生成数据库
2、可以不用写sql语句,通过操作对象来实现对数据库的操作
3、跨数据库的,如果修改数据源,只需要修改数据库驱动即可实现
其他:
1、Hibernate 使用 XML 文件来处理映射 Java 类别到数据库表格中,并且不用编写任何代码。
2、为在数据库中直接储存和检索 Java 对象提供简单的 APIs。
3、如果在数据库中或任何其它表格中出现变化,那么仅需要改变 XML文件属性。
4、抽象不熟悉的 SQL 类型,并为我们提供工作中所熟悉的 Java对象。
5、Hibernate 不需要应用程序服务器来操作。
6、操控你数据库中对象复杂的关联。
7、最小化与访问数据库的智能提取策略。
8、提供简单的数据询问。
1-3-2、Hibernate劣势
重要
1、就因为hibernate通过无sql操作,因此给sql优化带来了一些困难
2、在复杂业务的情况下,如果实现一些复杂的sql查询比较复杂
其他:
1、hibernate的完全封装导致无法使用数据的一些功能。
2、Hibernate的缓存问题。
3、Hibernate对于代码的耦合度太高。
4、Hibernate寻找bug困难。
5、Hibernate批量数据操作需要大量的内存空间而且执行过程中需要的对象太多
1-4、JDBCTemplate
JdbcTemplate针对数据查询提供了多个重载的模板方法,你可以根据需要选用不同的模板方法.如果你的查询很简单,仅仅是传入相应SQL或者相关参数,然后取得一个单一的结果,那么你可以选择如下一组便利的模板方法。
优点:运行期:高效、内嵌Spring框架中、支持基于AOP的声明式事务
缺点:必须于Spring框架结合在一起使用、不支持数据库跨平台、默认没有缓存
二、什么是Mybatis
MyBatis 是一款优秀的持久层框架/半自动的ORM,它支持自定义SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
具体大家可以看下mybatis官网 mybatis.org/mybatis-3/z…
2-1、优点
1、与JDBC相比,减少了很多代码量
2、 最简单的持久化框架,简单易学
3、SQL代码从程序代码中彻底分离出来,可以重用
4、提供XML标签,支持编写动态SQL
5、提供映射标签,支持对象与数据库的ORM字段关系映射,支持缓存、连接池、数据库移植....
2-2、缺点
1、SQL语句编写工作量大,熟练度要高
2、数据库移植性比较差,如果需要切换数据库的话,SQL语句会有很大的差异
三、快速搭建Mybatis项目
3-1、在maven项目中引入mybatis 和mysql驱动包
mysql驱动包需要和提供服务的mysql版本匹配,否则无法连接的时候就会发生异常,具体可以参照mysql官网
选择java语言,先点击8.0的view
mysql匹配版本以及jdk版本
我这边使用mysql 5.7,并且jdk 1.8.x。因此驱动也就选择8.0.x版本了,如下:
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
3-2、使用xml配置驱动
上面告诉打击mybatis的官网地址,我们打开官网地址,点击入门就可以看到怎么配置驱动了
3-2-1、创建mybatis.xml配置mysql驱动文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
3-2-1-1、配置mysql驱动信息
如果记不住驱动信息可以按照如下方式查看:
如上可以看到,当前8.0驱动版本,比低版本驱动多了 "cj",因此在配置驱动的时候,最好按照上面截图方式看一下,以免配置错误。
配置数据库连接信息,如果记不住也可以按照一下方式查看:
1、使用idea的DataSource选择mysql
2、填写数据库地址、端口以及数据库生成url
3、填写数据库账号密码
这样mysql数据库的驱动就配置完成了。
3-3、根据数据库表创建pojo
一般来说为了后期维护方便,我们需要创建的pojo名称最好和数据库表对应,并且字段也对应上,这样后面维护就方便多了,如果数据库字段有下划线,在pojo实体类中可以去掉字段的下划线改为驼峰命名法,如数据库中字段:user_name,实体类中可以为userName,在pojo中属性名首字母要小写。
3-4、创建pojo对应的Mapper.xml文件
我们pojo的名称为Emp,因此Mapper就命名为EmpMapper.xml(为了规范,名称要统一)
EmpMapper.xml放在resource中,那里面写那些内容呢,可以看下官网示例:
我们把上面那些拷贝到EmpMapper.xml中,并修改namespace(先临时这样,后面再进行处理),以及修改resultType(改为Emp的完整限定名),以及sql语句中的表名称
3-5、测试
3-5-1、构建SqlSessionFactory
添加一个测试类,并参照官网入门教程,构建SqlSessionFactory,如下:
将以上代码拷贝到测试类,并修改mapper文件路径
3-5-2 通过SqlSessionFactory获得sqlSession
可以看下官网给的示例,有两种如下:
3-5-2-1、基于StatementId的方式去执行SQL
先用第一种拷贝到测试类中
package com.jony.test;
import com.jony.pojo.Emp;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class MyTest {
@Test
public void test01() throws IOException {
//引入类的mapper文件
String resource = "mybatis.xml";
//构建一个输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
//生成sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
Emp emp = (Emp) session.selectOne("com.jony.pojo.EmpMapper.selectEmp", 1);
System.out.println(emp);
}
}
}
3-5-2-1-1、修改mubatis.xml配置要加载的EmpMapper.xml
3-5-2-1-2、执行测试
3-5-2-1-3、小结
基于StatementId的方式去执行SQL
<mapper resource="EmpMapper.xml"/>
3-5-2-2、基于接口绑定的方式
3-5-2-2-1、创建Pojo对应的Mapper接口
新建一个Pojo对应的Mapper接口,并且新建一个方法,方法名称需要和mapper.xml里面的id一致。接口返回类型是Emp,对应mapper.xml中的resultType返回类型就必须是Emp类的完整限定名,如下:
3-5-2-2-2、修改PojoMapper.xml
修改EmpMapper.xml并放到和EmpMapper同一级目录(可以自动扫描到),然后修改EmpMapper.xml的namespace为EmpMapper的完整限定名。
3-5-2-2-3、修改全局mybatis配置文件
在mybatis文件中,添加EmpMapper的映射
3-5-2-2-4、执行测试
3-5-2-2-5、小结
基于接口绑定的方式
1.新建数据访问层的接口: POJOMapper
2.添加mapper中对应的操作的方法
* 2-1.方法名要和mapper中对应的操作的节点的id要一致
* 2-2.返回类型要和mapper中对应的操作的节点的resultType要一致
* 2-3.mapper中对应的操作的节点的参数必须要在方法的参数中声明
3.Mapper.xml 中的namespace必须要和接口的完整限定名要一致
4.修改mybatis全局配置文件中的mappers,采用接口绑定的方式:
<mapper class="cn.tulingxueyuan.mapper.EmpMapper"></mapper>
5.一定要将mapper.xml和接口放在同一级目录中,只需要在resources新建和接口同样结构的文件夹就行了,生成就会合并在一起
3-6、搭建过程小结
Mybatis搭建过程步骤:
1、创建maven项目,并添加mybatis依赖(mybatis的核心jar包和数据库版本对应的驱动jar包)
2、连接数据库和表
3、添加mybatis全局配置文件(可以从官网复制)
4、修改mybatis 全局配置文件中的数据源配置信息
5、添加数据库表对应的POJO对象(相当于值为用的实体类)
6、添加对应的PojoMapper.xml(里面维护所有的sql)
7、修改mybatis全局配置文件,修改mapper。
四、去xml配置,使用注解的方式实现
上面演示了使用了两种方式实现mybatis对数据库的查询操作,但是都使用到了PojoMapper.xml,下面来看一下不使用xml如何实现。
同样打开mybatis官网,可以看到官网给的示例。
4-1、使用注解查询
4-1-1、在EmpMapper.java 新增一个查询方法
4-1-2、在测试方法中调用
使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。
选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的形式,完全取决于你和你的团队。 换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和 XML 的语句映射方式间自由移植和切换。
五、使用mybatis实现CRUD
5-1、通过xml的方式实现
5-1-1、查询
通过xml的方式实现查询上面已经演示。
5-1-2、更新
5-1-2-1、在xml中添加update方法
5-1-2-2、在EmpMapper中添加接口
需要注意的是,xml中的id名称一定要和EmpMapper中的接口名称一致
5-1-2-3、测试执行
可以看到数据已执行成功
需要注意的是这个地方一定要进行事务提交
session.commit()
在使用完成后进行关闭
session.close();
5-1-3、插入
5-1-3-1、在xml中添加insert方法
因为数据库中id为自增的,所有只需要插入name即可
5-1-3-2、在EmpMapper中添加insert方法
5-1-3-3、测试执行
5-1-4、删除
5-1-4-1、在xml中添加删除方法
5-1-4-2、在mapper中添加删除方法
5-1-4-2、测试执行
删除成功、李四已被删除。
5-1-5、小结
在xml中,针对CRUD分别使用不同的标签节点如:
< insert>:插入
< update>:更新
< select>:查询
< delete>:删除\
5-1、使用注解实现CRUD
使用注解主要区别就是EmpMapper中的接口,如下
@Select("select * from emp where id=#{id}")
Emp selectEmpAnnotation(Integer id);
@Update("update emp set ename=#{ename} where id= #{id}")
public int updateEmpAnnotation(Emp emp);
@Delete("delete from emp where id= #{id}")
public int deleteEmpAnnotation(Integer empno);
@Insert("insert into emp(id,user_name) values(#{id},#{username})")
public int insertEmpAnnotation(Emp emp);