什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
ORM(Object relational mapping)类型框架的数据库操作发展到如今,我觉得就是两种分支,一种是以Hibernate为首的动态生成sql语句,可以少写代码,可移植性高,一种就是以Mybatis为首的纯sql操作,方言支持性差导致移植性差,但是运行效率高,灵活性高。两种各有优势,今天来看下在SpringBoot中集成Mybatis框架。
创建好一个新项目后,按照以下流程添加代码:
一、pom依赖
<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.xing</groupId><artifactId>springBootMybatis</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>springBootMybatis</name><description>MybatisprojectforSpringBoot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.5.RELEASE</version><relativePath/></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><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>1.3.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.15</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
以上依赖没啥说的,正确导入即可。
二、建立实体,对应表字段
packagecom.xing.entity; ... /*** 实体*/publicclassUserEntity { privateIntegerid; privateStringuserName; privateStringpassWord; privateStringrealName; getsettoString ... }
三、mapper接口
packagecom.xing.mapper; importcom.xing.entity.UserEntity; importorg.apache.ibatis.annotations.*; importorg.springframework.stereotype.Repository; importjava.util.List; /*** 面向接口*/publicinterfaceUserMapper { UserEntitygetOne(intid); "SELECT * FROM user") (List<UserEntity>getAll(); "SELECT * FROM user WHERE id = #{id}") ( ({ property="id", column="id"), (property="userName", column="userName") ( }) UserEntitygetOneById(Integerid); "INSERT INTO user(id, userName, passWord, realName) VALUES(#{id}, #{userName}, #{passWord}, #{realName})") (voidinsert(UserEntityuser); "UPDATE user SET id=#{id},userName=#{userName},passWord=#{passWord},realName=#{realName} WHERE id =#{id}") (voidupdate(UserEntityuser); "DELETE FROM user WHERE id =#{id}") (voiddelete(Integerid); }
此处是新建了一个接口,我们可以使用注解来编写SQL语句,也可以使用xml来映射对应的接口方法,如果不使用注解,比如下面这个方法并没有注解SQL语句,我们把语句写到xml配置中。
UserEntity getOne(int id);
resources包下建UserMapper.xml
<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.xing.mapper.UserMapper"><resultMapid="BaseResultMap"type="com.xing.entity.UserEntity"><resultcolumn="id"jdbcType="INTEGER"property="id"/><resultcolumn="userName"jdbcType="VARCHAR"property="userName"/><resultcolumn="passWord"jdbcType="VARCHAR"property="passWord"/><resultcolumn="realName"jdbcType="VARCHAR"property="realName"/></resultMap><selectid="getOne"resultType="com.xing.entity.UserEntity">select*fromuserwhereid=#{id} </select></mapper>
可以看到id="getOne" 和getOne(int id) 是一样的,通过映射可以建立关联关系。其他的使用了注解的就不需要了。
四、配置文件也贴一下:
server: port: 8080spring: datasource: username: 用户名password: 密码url: jdbc:mysql://localhost:3306/xinghua?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTCdriver-class-name: com.mysql.cj.jdbc.Drivermybatis: mapper-locations: classpath:mapping/*Mapper.xmltype-aliases-package: com.xing.entity#showSqllogging:level:com:example:mapper : debug
五、将mapper扫描成组件
packagecom.xing; importorg.mybatis.spring.annotation.MapperScan; importorg.springframework.boot.SpringApplication; importorg.springframework.boot.autoconfigure.SpringBootApplication; "com.xing.mapper") (publicclassApplication { publicstaticvoidmain(String[] args) { SpringApplication.run(Application.class, args); } }
这里@MapperScan("com.xing.mapper")注解可以把mapper包下所有的接口扫描到,当然也可以设置多个:
@MapperScan({"com.xing.mapper1","com.xing.mapper2"})
我们也可以直接在Mapper接口类上面添加注解@Mapper,这种方式要求每一个mapper接口类都需要添加此注解,所以还是配置扫描的方式最好。
六、写个controller测试下,也可以写单元测试,我还是习惯接口测试
packagecom.xing.controller; importcom.xing.entity.UserEntity; importcom.xing.mapper.UserMapper; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.web.bind.annotation.*; /*** 控制类*/"/user") (publicclassUserController { finalUserMapperuserMapper; publicUserController(UserMapperuserMapper) { this.userMapper=userMapper; } /*** 根据id获取一个user* @param id id* @return user*/"/getOneById/{id}") (publicStringgetOneById(intid){ returnuserMapper.getOne(id).toString(); } /*** 获取全部* @return user list*/"/getAll") (publicStringgetAll(){ returnuserMapper.getAll().toString(); } /*** 新增* @param user user* @return ok*/"/insert") (publicStringinsert(UserEntityuser){ userMapper.insert(user); return"ok"; } /*** 更新* @param user user* @return ok*/"/update") (publicStringupdate(UserEntityuser){ userMapper.update(user); return"update ok"; } /*** 删除* @param id id* @return ok*/"/delete/{id}") (publicStringdelete(intid){ userMapper.delete(id); return"ok"; } }
七、测试效果
新增:
http://127.0.0.1:8080/user/insert{ "id":3, "userName":"苍老师", "passWord":"69", "realName":"苍井空"}
更新下user
查一下:
删一下:
http://127.0.0.1:8080/user/delete/222
总结:
SpringBoot中集成Mybatis并使用简单的增删改查。
源码:
https://github.com/debugxingHua/SpringBootSome.git
END