1. 前言
ORM 框架的目的是简化编程中的数据库操作,经过这么多年的发展,基本上活到现在的就剩下两家了,一个是宣称可以不用写 SQL 的 Hibernate ,一个是对 SQL 非常友好的 Mybaties ,,两者各有特点,在企业级系统开发中可以根据需求灵活使用。发现一个有趣的现象:传统企业大都喜欢使用 Hibernate ,互联网行业通常使用 Mybatis 。
Hibernate 特点就是所有的 SQL 都用 Java 代码来生成,不用跳出程序去写(看) SQL ,有着编程的完整性,发展到最顶端就是 Spring Data Jpa 这种模式了,基本上根据方法名就可以生成对应的 SQL 了。
Mybatis 初期使用比较麻烦,需要各种配置文件、实体类、Dao 层映射关联、还有一大推其它配置。当然 Mybatis 也发现了这种弊端,初期开发了 generator 可以根据表结果自动生产实体类、配置文件和 Dao 层代码,可以减轻一部分开发量;后期也进行了大量的优化可以使用注解了,自动管理 Dao 层和配置文件等,发展到最顶端就是今天要讲的这种模式了,mybatis-spring-boot-starter 就是 Spring Boot + Mybatis 可以完全注解不用配置文件,也可以简单配置轻松上手。
2. 工程实战
首先创建父工程 spring-boot-mybatis
,引入全局依赖包,如下:
代码清单:spring-boot-mybatis/pom.xml
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
- mybatis-spring-boot-starter :目前最新版本为 2.1.0
2.1 极简 xml 版
创建子工程 spring-boot-mybatis-xml
2.1.1 配置文件
application.yml 配置文件如下:
代码清单:spring-boot-mybatis/spring-boot-mybatis-xml/src/main/resources/application.yml
server: port: 8080 spring: application: name: spring-boot-mybatis-xml datasource: url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver type: com.zaxxer.hikari.HikariDataSource hikari: auto-commit: true minimum-idle: 2 idle-timeout: 60000 connection-timeout: 30000 max-lifetime: 1800000 pool-name: DatebookHikariCP maximum-pool-size: 5 mybatis: type-aliases-package: com.springboot.springbootmybatisxml.model config-location: classpath:mybatis/mybatis-config.xml mapper-locations: classpath:mybatis/mapper/*.xml
- 这里使用 hikari 作为数据库连接池
- Spring Boot 会自动加载
spring.datasource.*
相关配置,数据源会自动注入到sqlSessionFactory
中,sqlSessionFactory
会自动注入到 Mapper 中。 - 这里需要指定基础配置文件和实体类映射文件的地址
mybatis-config.xml 配置文件如下:
代码清单:spring-boot-mybatis/spring-boot-mybatis-xml/src/main/resources/mybatis/mybatis-config.xml
<configuration> <typeAliases> <typeAlias alias="Integer" type="java.lang.Integer" /> <typeAlias alias="Long" type="java.lang.Long" /> <typeAlias alias="HashMap" type="java.util.HashMap" /> <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" /> <typeAlias alias="ArrayList" type="java.util.ArrayList" /> <typeAlias alias="LinkedList" type="java.util.LinkedList" /> </typeAliases> </configuration>
2.1.2 Mapper 映射文件
代码清单:spring-boot-mybatis/spring-boot-mybatis-xml/src/main/resources/mybatis/mapper/UserMapper.xml
<mapper namespace="com.springboot.springbootmybatisxml.mapper.UserMapper" > <resultMap id="BaseResultMap" type="com.springboot.springbootmybatisxml.model.User" > <id column="id" property="id" jdbcType="VARCHAR" /> <result column="nick_name" property="nickName" jdbcType="VARCHAR" /> <result column="age" property="age" jdbcType="INTEGER" /> <result column="create_date" property="createDate" jdbcType="TIME"/> </resultMap> <sql id="Base_Column_List" > id, nick_name, age, create_date </sql> <select id="getAll" resultMap="BaseResultMap" > SELECT <include refid="Base_Column_List" /> FROM user </select> <select id="getUser" parameterType="java.lang.String" resultMap="BaseResultMap" > SELECT <include refid="Base_Column_List" /> FROM user WHERE id = #{id} </select> <insert id="insertUser" parameterType="com.springboot.springbootmybatisxml.model.User"> <selectKey keyProperty="id" resultType="java.lang.String" order="BEFORE"> select uuid() as id from dual </selectKey> INSERT INTO user (id, nick_name, age, create_date) VALUES (#{id}, #{nickName}, #{age}, #{createDate}) </insert> <update id="updateUser" parameterType="com.springboot.springbootmybatisxml.model.User"> UPDATE user SET <if test="nickName != null">nick_name = #{nickName},</if> <if test="age != null">age = #{age},</if> <if test="createDate != null">create_date = #{createDate}</if> WHERE id = #{id} </update> <delete id="deleteUser" parameterType="java.lang.String"> DELETE FROM user WHERE id = #{id} </delete> </mapper>
- namespace :需配置对应的接口
- 实现了简单的 CRUD 操作
- 新增数据时选用 UUID 作为主键
- 动态条件可使用
<if>
标签作判断
2.1.3 Mapper 层代码
代码清单:spring-boot-mybatis/spring-boot-mybatis-xml/src/main/java/com/springboot/springbootmybatisxml/mapper/UserMapper.java
public interface UserMapper { List<User> getAll(); User getUser(String id); Long insertUser(User user); Long updateUser(User user); Long deleteUser(String id); }
- 这里仅需定义接口方法, mybaties 会自动帮我们调用 xml 映射文件中的代码。
2.1.4 启动主类
代码清单:spring-boot-mybatis/spring-boot-mybatis-xml/src/main/java/com/springboot/springbootmybatisxml/SpringBootMybatisXmlApplication.java
@SpringBootApplication @MapperScan("com.springboot.springbootmybatisxml.mapper") public class SpringBootMybatisXmlApplication { public static void main(String[] args) { SpringApplication.run(SpringBootMybatisXmlApplication.class, args); } }
- 在启动主类上配置
@MapperScan
或者直接在 Mapper 类上增加注解@Mapper
,两种方法起到的结果是一样的。不过建议选择在启动主类上配置@MapperScan
,不然在每个 Mapper 类上加注解也麻烦,还容易漏加。
2.2 无配置文件注解版
2.2.1 配置
配置文件 application.yml 如下:
代码清单:
mybatis: type-aliases-package: com.springboot.springbootmybatisannotation.model
- 剩余部分和上面一致, mybatis 的配置仅需配置这一条足够
2.2.2 Mapper 类
注解版的核心就是这个类,所有的 SQL 都在这个类里面,代码如下:
代码清单:
public interface UserMapper { @Select("select * from user") @Results({ @Result(property = "id", column = "id"), @Result(property = "nickName", column = "nick_name"), @Result(property = "age", column = "age"), @Result(property = "createDate", column = "create_date") }) List<User> getAll(); @Select("SELECT * FROM user WHERE id = #{id}") @Results({ @Result(property = "nickName", column = "nick_name") }) User getUser(String id); @Insert("INSERT INTO user(id, nick_name, age, create_date) VALUES(#{id}, #{nickName}, #{age}, #{createDate})") @SelectKey(keyProperty = "id", resultType = String.class, before = true, statement = "select uuid() as id from dual") Long insertUser(User user); @Update("UPDATE user SET nick_name = #{nickName}, age = #{age} WHERE create_date = #{createDate}") Long updateUser(User user); @Delete("DELETE FROM user WHERE id = #{id}") Long deleteUser(String id); }
- @Select 是查询类的注解,所有的查询均使用这个
- @Result 修饰返回的结果集,关联实体类属性和数据库字段一一对应,如果实体类属性和数据库属性名保持一致,就不需要这个属性来修饰。
- @Insert 插入数据库使用,直接传入实体类会自动解析属性到对应的值
- @Update 负责修改,也可以直接传入对象
- @delete 负责删除
注意:使用 # 符号和 $ 符号是不同的
#{}
使用 #{}
意味着使用的预编译的语句,即在使用 jdbc 时的 preparedStatement , sql 语句中如果存在参数则会使用 ? 作占位符。
${}
使用 ${}
时的sql不会当做字符串处理,是什么就是什么,如上边的语句:select from table1 where id=${id} 在调用这个语句时控制台打印的为:select from table1 where id=2 ,假设传的参数值为2
从上边的介绍可以看出这两种方式的区别,最好是能用 #{}
则用它,可以防止 sql 注入,且是预编译的,在需要原样输出时才使用 ${}
。
3. 小结
两种模式各有特点,注解版适合简单快速的模式,其实像现在流行的这种微服务模式,一个微服务就会对应一个自已的数据库,多表连接查询的需求会大大的降低,会越来越适合这种模式。另外插一句, Hibernate 对单表的支持是非常好的,为什么不选用 Spring Boot JPA + QueryDSL呢?
Xml 配置模式比较适合大型项目,可以酣畅淋漓的写 SQL ,可以灵活的动态生成 SQL ,方便调整 SQL 。
相关推荐
Spring Boot是由Pivotal团队提供的全新框架,它旨在简化Spring应用的初始搭建以及开发过程,而MyBatis Plus则是一个基于MyBatis的极简、强大的工具,它提供了丰富的数据库操作API,减少了大量重复的SQL代码。...
在这个项目中,Spring Boot作为基础框架,负责管理应用的生命周期和组件,提供了极简的配置方式。 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动...
Spring Boot,作为Java领域内的一款微框架,自诞生以来就以其便捷的启动方式、极简的配置以及强大的功能赢得了广大开发者的心。而Spring Boot 2.0.0.M1,则是这一系列中的一个重要里程碑,它标志着Spring Boot向更...
基于注解的sql写法,零XML,极简配置,一键前后台代码生成功能简介 1. 用户管理 2. 角色管理 3. 部门管理 4. 菜单管理 5. 系统日志 6. 代码生成 7.内容管理 所用框架 前端 1. Bootstrap 2. jQuery 3. bootstrap-...
项目描述 springboot极简物业管理系统示例,包括业主...spring+springboot+mybatis+pagehelper+jquery+layui 数据库文件 位于项目sql文件夹中 依赖包文件 项目采用maven管理jar包依赖,编译项目自动下载相关依赖jar包
使用官方推荐的thymeleaf做为模板引擎,shiro作为安全框架,主流技术 几乎零XML,极简配置 两套UI实现(bootstrap+layer ui),可以自由切换 报表后端采用技术: SpringBoot整合SSM(Spring+Mybatis-plus+ SpringMvc),...
SpringBlade微服务开发平台 采用前后端分离的模式,前端开源两个框架: (基于 React、Ant Design)、 (基于 Vue、Element-UI) 后端采用SpringCloud全家桶,并同时对其基础组件做了高度的封装,单独开源出一个框架: ...
几乎零XML,极简配置 两套UI实现(bootstrap+layer ui),可以自由切换 报表后端采用技术: SpringBoot整合SSM(Spring+Mybatis-plus+ SpringMvc),spring security 全注解式的权限管理和JWT方式禁用Session,采用redis...
Java EE(J2EE)快速开发框架jeexjj,基于主流技术(Springboot、Spring MVC、MyBatis、Bootstrap、ACE),是XJJ框架的springboot版本。系统的代码生动生成、极简权限框架、通用service和dao设计、后台页面设计…....
微服务系列课程是以Java语言为基础,以SpringCloud+SpringBoot为核心,结合Spring、SpringMVC及MyBatis,通过游戏案例、电商案例,以极简的方式,带领入门的朋友们快速上手微服务开发。全部案例源码分享给学习的朋友...
SpringBlade微服务开发平台采用前后端分离的模式,前端开源两个框架: (基于 React、Ant Design)、 (基于 Vue、Element-UI)后端采用SpringCloud全家桶,并同时对其基础组件做了高度的封装,单独开源出一个框架:已推...
第8_章:Spring Boot集成Groovy混合Java开发 数据库使用mysql,ORM层使用mybatis,模板引擎使用freemarker,内置工具使用Gradle。本章我们使用SpringBoot集成Groovy混合Java开发一个极简的RestAPI。 关于Groovy语言...
shiro作为安全框架,主流技术 几乎零XML,极简配置 两套UI实现(bootstrap+layer ui),可以自由切换 报表后端采用技术: SpringBoot整合SSM(Spring+Mybatis-plus+ SpringMvc),spring security 全注解式的权限管理和...
首先,你需要在Spring Boot的配置文件(application.yml或application.properties)中引入MyBatis-Plus的依赖,并进行基础配置,如数据库连接信息、实体扫描路径等。 3. **创建实体类(Entity)** 在项目中,每个...
SpringBlade 是一个基于 Java8 的微服务架构,采用 Spring Boot 2、Spring Cloud Greenwich、Mybatis 等核心技术。它致力于创造新颖的开发模式,将开发中遇到的痛点、生产中所踩的坑整理归纳,并将解决方案都融合到...
该项目利用了基于springboot + vue + mysql的开发...Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
3. **框架集成**:基于Java的开发环境可能内置了Spring Boot、MyBatis等流行框架,简化了服务端的架构配置和数据库交互。 4. **前后端分离**:支持现代的前后端分离开发模式,前端可能采用了React、Vue或Angular等...
应用的入口点,一般包含@SpringBootApplication注解,这将启用Spring Boot的自动配置功能。 6. **自动配置** SpringBoot会根据项目中的依赖来尝试自动配置相应的组件,如发现web依赖,就会自动配置Spring MVC。 ...