- 浏览: 63929 次
文章分类
最新评论
22.从零开始学springboot-通用mapper的使用
前言
通过作者《从零开始学springboot》前面大概20几个独立的小demo以及最后的两个大汇总案例,相信大家和作者一样,对于使用springboot来开发已经得心应手了。作者在写《从零开始学springboot》这个专题时,也还是个phper,在写完前二十几章时,作者已经完成了从一名phper到javer的转型之路,项目也已安全上线。说这个,只是希望,这个系列能够对希望转型java开发的同学门一点心得和帮助。
讲真,《从零开始学springboot》这个系列到此已经基本完成了它的使命(ps:记录作者转型之路),不过出于深入学习的需要,我认为该系列还只完成了第一步,仅仅能够帮助大家完成“任务”,而对于springboot的原理知识还差的远呢。所以,该系列还会继续下去,接下来的文章重点将会讲解原理类的知识,可能比较抽象,当然,也会穿插一下作者在实际开发过程中碰到的各种问题,以及分享一下实用的工具。
mybatis进阶-通用mapper
使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQL。而且,当数据库表结构改动时,对应的所有SQL以及实体类都需要更改。这工作量和效率的影响或许就是区别增删改查程序员和真正程序员的屏障。这时,通用Mapper便应运而生。 通用Mapper就是为了解决单表增删改查,基于Mybatis的插件。开发人员不需要编写SQL,不需要在DAO中增加方法,只要写好实体类,就能支持相应的增删改查方法。
通用mapper详解
使用通用mapper,默认继承了如下方法
Select 方法:List<T> select(T record); 说明:根据实体中的属性值进行查询,查询条件使用等号
方法:T selectByPrimaryKey(Object key); 说明:根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号
方法:List<T> selectAll(); 说明:查询全部结果,select(null)方法能达到同样的效果
方法:T selectOne(T record); 说明:根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号
方法:int selectCount(T record); 说明:根据实体中的属性查询总数,查询条件使用等号
Insert 方法:int insert(T record); 说明:保存一个实体,null的属性也会保存,不会使用数据库默认值
方法:int insertSelective(T record); 说明:保存一个实体,null的属性不会保存,会使用数据库默认值
Update 方法:int updateByPrimaryKey(T record); 说明:根据主键更新实体全部字段,null值会被更新
方法:int updateByPrimaryKeySelective(T record); 说明:根据主键更新属性不为null的值
Delete 方法:int delete(T record); 说明:根据实体属性作为条件进行删除,查询条件使用等号
方法:int deleteByPrimaryKey(Object key); 说明:根据主键字段进行删除,方法参数必须包含完整的主键属性
Example方法 方法:List<T> selectByExample(Object example); 说明:根据Example条件进行查询 重点:这个查询支持通过Example类指定查询列,通过selectProperties方法指定查询列
方法:int selectCountByExample(Object example); 说明:根据Example条件进行查询总数
方法:int updateByExample(@Param("record") T record, @Param("example") Object example); 说明:根据Example条件更新实体record包含的全部属性,null值会被更新
方法:int updateByExampleSelective(@Param("record") T record, @Param("example") Object example); 说明:根据Example条件更新实体record包含的不是null的属性值
方法:int deleteByExample(Object example); 说明:根据Example条件删除数据
总体来说,在实际开发过程中,通用mapper的使用能帮助我们节约大量的时间~ 下面我们就来实际体验下~
目录结构
手动创建 controller mapper model 等package
添加依赖
pom.xml:
<dependencies>
<!-- web依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- mysql依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<!-- SpringBoot通用Mapper依赖 -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
</dependencies>
添加mybatis自动生成插件
关于mybatis自动生成代码插件不多讲了,在前几章讲过多次了。 pom.xml:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<!-- 对应generator配置文件的路径 -->
<configurationFile>src/main/resources/generator.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
</plugin>
</plugins>
</build>
mybatis自动生成插件配置
generator.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC
"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
<!-- 本地数据库驱动程序jar包的全路径 -->
<classPathEntry location="/Users/mrcoder/Documents/mavenRepository/mysql/mysql-connector-java/8.0.15/mysql-connector-java-8.0.15.jar"/>
<context id="context" targetRuntime="MyBatis3">
<!-- optional,旨在创建class时,对注释进行控制 -->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
</commentGenerator>
<!-- 数据库的相关配置 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/test"
userId="root" password="123456"/>
<!-- 非必需,类型处理器,在数据库类型和java类型之间的转换控制-->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- Model实体类生成的位置 -->
<javaModelGenerator targetPackage="com.mrcoder.sbmcommonmapper.model" targetProject="src/main/java">
<!-- 是否对model添加 构造函数 -->
<property name="constructorBased" value="false"/>
<!-- 是否允许子包,即targetPackage.schemaName.tableName -->
<property name="enableSubPackages" value="true"/>
<!-- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 -->
<property name="immutable" value="false"/>
<!-- 给Model添加一个父类 -->
<!--<property name="rootClass" value="com.foo.louis.Hello"/>-->
<!-- 是否对类CHAR类型的列的数据进行trim操作 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- *Mapper.xml 文件的位置 -->
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- Mapper 接口文件的位置 -->
<javaClientGenerator targetPackage="com.mrcoder.sbmcommonmapper.mapper" targetProject="src/main/java"
type="XMLMAPPER">
<property name="enableSubPackages" value="true"/>
<!--
定义Maper.java 源代码中的ByExample() 方法的可视性,可选的值有:
public;
private;
protected;
default
注意:如果 targetRuntime="MyBatis3",此参数被忽略
-->
<property name="exampleMethodVisibility" value=""/>
<!--方法名计数器Important note: this property is ignored if the target runtime is MyBatis3.-->
<property name="methodNameCalculator" value=""/>
<!--为生成的接口添加父接口-->
<property name="rootInterface" value=""/>
</javaClientGenerator>
<!-- 相关表的配置 -->
<table tableName="person" enableCountByExample="false" enableDeleteByExample="false"
enableSelectByExample="false"
enableUpdateByExample="false"/>
</context>
</generatorConfiguration>
添加配置
application.yml:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
建库
创建test数据库
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for person
-- ----------------------------
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS = 1;
运行mybatis-generator
如果generator.xml配置正确(内容需要更改mysql连接地址和driver包所在路径以及需要生成的表名称)则会在mapper和model目录下生成person对应的文件。
通用mapper的使用
我们需要将mapper/PersonMapper改为:
package com.mrcoder.sbmcommonmapper.mapper;
import com.mrcoder.sbmcommonmapper.model.Person;
import tk.mybatis.mapper.additional.insert.InsertListMapper;
import tk.mybatis.mapper.common.ExampleMapper;
import tk.mybatis.mapper.common.Mapper;
//继承通用mapper
public interface PersonMapper extends Mapper<Person>, InsertListMapper<Person>, ExampleMapper<Person> {
}
model/Person增加主键的注解@Id 说明:如果不在主键上加此注解,则使用通用mapper的更新方法时会出现更新失败的问题。
package com.mrcoder.sbmcommonmapper.model;
import javax.persistence.Id;
public class Person {
@Id
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
最后我们在入口类中增加mapper类的扫描注解 SbmCommonMapperApplication:
package com.mrcoder.sbmcommonmapper;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan;
//扫描mapper类--注意引入的是(tk.mybatis.spring.annotation.MapperScan)这个包
@MapperScan("com.mrcoder.sbmcommonmapper.mapper")
@SpringBootApplication
public class SbmCommonMapperApplication {
public static void main(String[] args) {
SpringApplication.run(SbmCommonMapperApplication.class, args);
}
}
完善controller
基本完成,我们来编写 CommonMapperController:
package com.mrcoder.sbmcommonmapper.controller;
import com.mrcoder.sbmcommonmapper.mapper.PersonMapper;
import com.mrcoder.sbmcommonmapper.model.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import tk.mybatis.mapper.entity.Example;
import java.util.ArrayList;
import java.util.List;
@RestController
public class CommonMapperController {
@Autowired
private PersonMapper personMapper;
@GetMapping("/getList")
public List<Person> getList() {
//通用mapper的获取列表方法
return personMapper.selectAll();
}
@GetMapping("/getById/{id}")
public Person getById(@PathVariable("id") Integer id) {
//通用mapper的根据主键获取指定记录方法
return personMapper.selectByPrimaryKey(id);
}
@GetMapping("/insert")
public int insert() {
Person person = new Person();
person.setAge(10);
person.setName("p1");
//插入方法
return personMapper.insert(person);
}
@GetMapping("/update")
public int update() {
Person person = new Person();
person.setId(1);
person.setAge(10);
person.setName("p1-update");
//更新方法
return personMapper.updateByPrimaryKeySelective(person);
}
@GetMapping("/batchInsert")
public int batchInsert() {
Person p1 = new Person();
p1.setAge(10);
p1.setName("p2");
Person p2 = new Person();
p2.setAge(10);
p2.setName("p3");
List<Person> personList = new ArrayList<Person>();
personList.add(p1);
personList.add(p2);
//批量插入方法
return personMapper.insertList(personList);
}
@GetMapping("/query")
public List<Person> query() {
Example con = new Example(Person.class);
Example.Criteria criteria = con.createCriteria();
criteria.andEqualTo("age", 10);
//复杂条件查询方法
return personMapper.selectByExample(con);
}
}
项目地址
https://github.com/MrCoderStack/SpringBootDemo/tree/master/sbm-common-mapper
请关注我的订阅号
转载于:https://my.oschina.net/u/3066875/blog/3056515
相关推荐
《SpringBoot整合Mybatis实践详解》 在现代Java开发领域,SpringBoot框架因其简洁的配置、快速的启动和丰富的生态而备受青睐。本项目“springboot-mybatis(1).rar”是一个典型的应用示例,它将SpringBoot与Mybatis...
com.springsource.org.codehaus.jackson.mapper-1.0.0.jar
* [SpringBoot+tkmapper](./springboot-tkmapper/README.md) * [SpringBoot+rabbitmq](./springboot-rabbitmq/README.md) * [SpringBoot+kafka](./springboot-kafka) * [SpringBoot+shiro(REAMDME.md RBAC 参考链接...
这个`boot-mybatis-mapper-demo`项目就是一个完整的示例,展示了如何在Spring Boot中配置MyBatis的`mapper.xml`文件,并通过Web接口进行数据操作。通过学习和理解这个例子,你将能够熟练掌握Spring Boot集成MyBatis...
如果更改mapper,此处应该是:-//mybatis.org//DTD Mapper 3.0//EN) ; 执行完上面后clean项目(Project->clean); 如果继续报错则更改出错的头文件 将 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0/...
在MyBatis中,`mybatis-3-config.dtd` 和 `mybatis-3-mapper.dtd` 是两个至关重要的DTD(Document Type Definition)文件,它们定义了MyBatis配置文件和映射文件的结构和规则。 首先,让我们深入了解一下`mybatis-3...
在开始整合之前,我们需要确保已经安装了JDK,并在项目中引入了SpringBoot和MyBatisPlus的依赖。在pom.xml文件中,添加以下依赖: ```xml <!-- SpringBoot Starter Web --> <groupId>org.springframework.boot...
在处理`mybatis-3-mapper.dtd`这个问题时,我们需要深入理解MyBatis的Mapper体系以及DTD的作用。 首先,`mybatis-3-mapper.dtd`是MyBatis中用于验证XML映射文件的文档类型定义(Document Type Definition)。在XML...
SpringBoot-Mapper集合是一个关于如何在Spring Boot应用中有效地整合和使用Mapper框架的资源集合。这个集合可能包含了一系列示例代码、配置文件以及相关的文档,旨在帮助开发者理解并掌握Spring Boot与Mapper框架的...
module-init-tools-3.2.tar.gz mkinitrd-4.1.18-2.i386.rpm device-mapper-1.00.19-2.i386.rpm lvm2-2.00.25-1.01.i386.rpm 有以上四个包打包到一起方便大家下载,由于只有15M的空间有限,内核包就不打包在一起了,
mybatis-3-mapper.dtd
device-mapper-multipath-0.4.9-123.el7.x86_64.rpm device-mapper-multipath-0.4.9-123.el7.x86_64.rpm device-mapper-multipath-0.4.9-123.el7.x86_64.rpm
jackson-core-asl-1.9.13.jar jackson-mapper-asl-1.9.13.ja spring mvc时,ajax传输json格式,@ResponseBody, 会出现错误,导入jackson-core-asl-1.9.13+jackson-mapper-asl-1.9.13jar
mybatis.mapper-locations=classpath:mapper/*.xml ``` - **创建实体类**:根据数据库表结构创建对应的Java POJO类,例如User类。 ```java public class User { private int id; private String name; ...
- 使用@MapperScan注解:在Spring Boot的配置类上使用`@MapperScan`,指定Mapper接口所在的包,以便Spring Boot自动扫描并注册这些接口为Bean。 4. **示例项目结构** - `springboot-learning-example-master`可能...
jar包,官方版本,自测可用
可用于Spring MVC框架,spring MVC中返回使用@ResponseBody注解返回时,后台没报错,就控制台显示406 Not Acceptable 原因是缺少jackson的包:jackson-core-asl-1.9.2.jar和jackson-mapper-asl-1.9.2.jar
001-springboot-pre 002-springboot-first 003-springboot-second 004-springboot-three 005-springboot-mvc ...017-springboot-mapper 018-springboot-mapperscan 019-springboot-transactional .......