传统JDBC
在JSP/Servlet时代,进行数据持久化的方式采用JDBC,这是一种比较原生的数据库连接方式,我深深记得,在本科的Android课程设计中,还使用JDBC来连接数据库,JDBC使用起来还算方便,引入jar包后,立马就可以编写代码了,但它也有很多缺点:
- 大量的模版代码
- MySQL语句硬编码,直接写在了Java代码中(需要更改SQL语句时,整个项目都得重新编译打包)
- 每次操作数据库,都要建立连接,操作数据,然后断开连接,开销很大
JDBC Template
解决了大量的模版代码问题,将模版代码进行了封装,使得后期维护代码更加方便了,但因为还是基于JDBC,所以仍然没有解决SQL语句硬编码和性能的问题.
MyBatis时代
MyBatis采用XML或注解的方式进行显式配置,XML可以解决JDBC的SQL语句硬编码的问题. 并且MyBatis支持生命时数据缓存,可以将数据库中获得的数据存储在高速缓存中,当下次再进行查询时,就可以直接从缓存中获取,这样也在一定程度上优化了JDBC的性能问题.MyBatis已经成为Web开发中ORM的经典.
动态代理
通过接口调用相应的方法,不需要实现接口,也不需要在实现类中使用SqlSession间接调用.动态代理的方式被广泛使用,因此我主要记录一下这个方式,在此之后还诞生了更为方便的MyBatis Generator,但掌握了较为基础的动态代理方式,学习MyBatis Generator也自然不在话下.
以下记录动态代理的使用:
项目构建
使用Spring Initializr构建一个Spring Boot项目,并添加以下依赖:
运行以下SQL语句以测试:
1 | SET NAMES utf8mb4; |
编辑application.yml配置文件:
1 | spring: |
代码编写
实体类:
1 | package com.example.country.entity; |
Dao层:
1 | package com.example.country.dao; |
Dao层对应的XML文件(放在resources/mapper文件夹中)
1 |
|
可以发现select语句的id属性值与Mapper接口中的方法名是一致的,它们就是靠这种方式将接口方法与XML中的SQL语句关联到一起的;resultType属性值指定的是查询结果的返回值类型,这里返回的是一个List,属性值country表明这个List中的元素都为country bean
Service接口:
1 | package com.example.country.service; |
Service接口实现类
1 | package com.example.country.service.impl; |
Controller:
1 | package com.example.country.controller; |
这样就可以在浏览器中访问到该资源了:
注解方式
注解方式的使用更为简单,只需要在Dao的接口方法中添加相应的注解,就免去了配置XML的麻烦,但我并不推荐,因为这种方式也把SQL语句硬编码在了代码中,比较适合个人开发.以下为示例:
1 | package com.example.country.dao; |
添加注解后就不需要Mapper.xml文件了,不得不说确实方便.