本文提到的内容,都只是最基础的应用,个人学习的同时,记录下来,忘记之后还可查看此文档快速回忆。
参看:
环境:
JDK1.8+,MAVEN,IDEA,internet,… …
在SpringBoot中,使用各种持久层工具都非常的方便,这是基于它的 自动装配原理 而实现。
SpringBoot中实现持久化的步骤:
先约定一下SQL,之后所有的操作都是基于此SQL执行后的表:
DROP TABLE IF EXISTS `user_db`;
CREATE TABLE `user_db` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1;
INSERT INTO `user_db`(id,username) values
(1,'张三'),
(2,'李四'),
(3,'王二'),
(4,'麻子'),
(5,'王三'),
(6,'李三');
配置文件都使用YAML文件。并且Mybatus的是很多公司都在用的框架,虽然需要配置XML文件的CURD。
目录结构图(提供此图后,对应的文件应该放在对应的包目录下,可千万别放错了哟~)
SpringBoot官方并没有提供Mybatis的启动器,所以得引入启动器:
如果连接数据库,当然还得引入MySQL的依赖。
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>1.3.2version>
dependency>
之后就是在application.yml配置文件中编写简单的配置即可
server:
port: 8080
spring:
# 标注项目现在环境 dev-开发 test-测试 pro-上线
profiles:
active: dev
# 配置数据源
datasource:
username: root
password:
url: jdbc:mysql://localhost:3306/test # 我的库是test
#mybatis配置
mybatis:
type-aliases-package: com.pdh.entity
mapper-locations: classpath:/mybatis/*.xml # mapper位置,默认扫描这里
之后就是创建实体类User
实体类需要与数据表对应,如果有不对应的字段,需要在mybatis.xml文件中指定表示出来。(映射文件是mybatis.xml)
public class User {
private int id;
private String username;
// 生成getter,setter,构造等方法
}
编写Mapper接口,并加入一个方法find()
方法
可以加上@Mapper注解加载Mpper类,但是能够直接在启动类上加@MapperScan(“com.pdh.mapper”)注解扫描指定的包,后者更加简约。
public interface UserMapper {
/**
* 查询
* @param user condition
* @return
*/
public List<User> find(User user);
}
编写映射文件UserMapper.xml
还可使用注解直接注入到Mapper类中对应的方法上,但是并不灵活,这种方式就低耦合一些,还可以实现动态SQL
DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pdh.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.pdh.entity.User">
<result column="id" jdbcType="INTEGER" property="id" />
<result column="username" jdbcType="VARCHAR" property="username" />
resultMap>
<select id="find" resultType="com.pdh.entity.User" resultMap="BaseResultMap">
SELECT * FROM user_db
select>
mapper>
此时,各项正常的话就会出现一个 绿色的箭头 ,mybatis.xml里的sql和UserMapper里的方法对应。
要在启动类上加上注解:@MapperScan(“com.pdh.mapper”)。
之后引入Springboot的测试依赖(有就不用引入)
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
测试:在UserMapper类下按快捷键 Alt+Insert 选择新建Test,JUnit4,之后测试类上加上@RunWith(SpringRunner.class)和@SpringBootTest 两个注解:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper mapper;
@Test
void findAll() {
List<User> list = mapper.find(new User());
list.forEach(System.out::println); // User类加上toString()方法这里才能看见数据
}
}
结果:
User{id=1, username=‘张三’}
User{id=2, username=‘李四’}
User{id=3, username=‘王二’}
User{id=4, username=‘麻子’}
User{id=5, username=‘王三’}
User{id=6, username=‘李三’}
测试成功,之后就可以按照步骤搭建Service,Controller了这些模块。
在SpringBoot整个Mybatis能运行起来之后,实现动态SQL要怎么做?那你可看好了
前面我们的UserMapper接口中的find()
方法需要传入一个User类,就是为了实现动态SQL。实现动态SQL的UserMapper.xml如下:
DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pdh.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.pdh.entity.User">
<result column="id" jdbcType="INTEGER" property="id" />
<result column="username" jdbcType="VARCHAR" property="username" />
resultMap>
<sql id="selectSql">
SELECT
*
FROM
user_db
sql>
<select id="find" resultType="com.pdh.entity.User" resultMap="BaseResultMap">
<include refid="selectSql"/>
<where>
<if test="username != null">
username like '%${username}%'
if>
where>
select>
mapper>
当我们在UserMapper中在此调用find()
方法时,在传递的User类中,传递对应的参数即可实现条件查询,不传递参数就查询全部。
测试:
@Test
public void findCondition() {
//条件查询 username中有 ‘三’ 的
mapper.find(new User("三")).forEach(System.out::println);
}
测试结果
User{id=1, username=‘张三’}
User{id=5, username=‘王三’}
User{id=6, username=‘李三’}
Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能,Mybatis提供了9种动态sql标签 trim|where|set|foreach|if|choose|when|otherwise|bind。
在使用Mybatis的时候要编写大量简单的SQL语句在XML文档中,且数据表结构更改时间,对应的SQL以及实体类都需要更改,对开发人员非常的不友好。为了减轻开发人员的负担,就出现了tkmybatis(通用mybatis)和mybatis plus。
通用Mapper解决了单表增删改查,基于Mybatis的插件。开发人员不需要编写SQL,不需要在DAO中增加方法,只要写好实体类,就能支持相应的增删改查方法。
还是创建一个含mysql启动器的SpringBoot项目,再开始之后的整合操作。
引入通用mapper之后,就不需要再手动引入mybaits,通用mapper里面已经包含了mybatis的依赖
<dependency>
<groupId>tk.mybatisgroupId>
<artifactId>mapper-spring-boot-starterartifactId>
<version>2.0.3version>
dependency>
之后就是在application.yml配置文件中编写简单的配置即可
server:
port: 8080
spring:
# 标注项目现在环境 dev-开发 test-测试 pro-上线
profiles:
active: dev
# 配置数据源
datasource:
username: root
password:
url: jdbc:mysql://localhost:3306/test # 我的库是test
#mybatis配置
mybatis:
type-aliases-package: com.pdh.entity
mapper-locations: classpath:/mybatis/*.xml # mapper位置,默认扫描这里
之后就是创建实体类User
实体类与数据库表对应策略:
tkmybatis注解使用JPA注解,这里针对@GeneratedValue注解会简单提及到用法
默认表名=类名,字段名=属性名(支持下划线转驼峰)
@Table(name = "tableName")
指定表名
@Column(name = "fieldName")
指定属性名
@Transient
表示此字段不进行映射
@Id
标注主键
@GeneratedValue
指定主键策略
@GeneratedValue(strategy = GenerationType.IDENTITY)注解中,GenerationType是枚举类,它有四种类型(以及解释):
- TABLE:使用一个特定的数据库表格来保存主键。
- SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
- IDENTITY:主键由数据库自动生成(主要是自动增长型)
- AUTO(默认):主键由程序控制。
还是使用上面约定的数据表进行实体类的创建
@Table(name = "user_db")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 主键策略使用IDENTITY
private int id;
@Column(name = "username")
private String username;
// 生成getter,setter,构造等方法
}
在启动类上添加Mapper扫描
@MapperScan("com.pdh.mapper")
注解的时候,添加的应该是tk.mybatis的MapperScan。不要误添加mybatis的MapperScan。会出现Error invoking SqlProvider method。
一旦继承了Mapper,继承的Mapper就拥有了Mapper所有的通用方法:
public interface UserMapper extends Mapper<User> {
// Mapper接口继承Mapper后,可以调用它的诸多方法
}
Mapper方法一览:
之后就不编写任何映射文件,就能进行使用,但是针对于复杂的SQL还是需要开发人员自行实现的。
这里就直接先不添加映射文件,直接先进行一次接口测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
@Resource
private UserMapper mapper;
@Test
public void findAll() {
mapper.selectAll().forEach(System.out::println);
}
@Test
public void findById(){
// 查询id=2的数据(只有一个约束)
User user = mapper.selectByPrimaryKey(2);
System.out.println(user.toString());
}
@Test
public void findDynamic(){
// 动态查询 字段有数据就加入条件,没有就不加入条件
mapper.select(new User("张三")).forEach(System.out::println);
}
@Test
public void findByExample() {
// 测试一下这种操作 实现reg查询
Example example = new Example(User.class);
// example.createCriteria() 有诸多条件实现,这里暂且使用and like条件
// 可实现链式添加条件
example.createCriteria().andLike("username","%三%");
mapper.selectByExample(example).forEach(System.out::println);
}
}
findAll()得到的结果是:
User{id=1, username=‘张三’}
User{id=2, username=‘李四’}
User{id=3, username=‘王二’}
User{id=4, username=‘麻子’}
User{id=5, username=‘王三’}
User{id=6, username=‘李三’}
findById()得到的结果是:
User{id=2, username=‘李四’}
… …
可选,不定义也能使用Mapper提供的方法。如果有复杂的SQL需求,就必须自定义。这里我添加一个动态的条件查询SQL。注意,简单的动态SQL,Mapper里面有对于的select
方法就能实现,但是我不满足于此,我要实现的是 动态SQL+查询username中带有我指定的字符 的数据,这样的SQL相对复杂些,如果直接使用Mapper的方法的话,使用selectByExample()
也可以实现,但是非常的麻烦,使用XML配置文件就简单很多:
映射复杂方法 resources/mappers/UserMapper.xml
DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pdh.mapper.UserMapper">
<sql id="selectSql">
SELECT
*
FROM
user_db
sql>
<select id="find" resultType="com.pdh.entity.User">
<include refid="selectSql"/>
<where>
<if test="username != null">
username like '%${username}%'
if>
where>
select>
mapper>
之后,需要在UserMapper接口中添加此方法find()
(此方法必须与xml映射文件中的对应上)
/**
* 条件查询
* @param user condition
* @return
*/
public List<User> find(User user);
测试
@Test
public void find(){
// 查找username中含有`四`的数据
mapper.find(new User("四")).forEach(System.out::println);
}
结果
User{id=2, username=‘李四’}
官方使用的是H2数据库进行演示,我这里提供了H2数据库
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
与整合tkmybatis步骤一样,不同的点是 依赖、继承BaseMapper
,mapper对应的方法名不同。
创建一个含mysql启动器的SpringBoot项目,再开始之后的整合操作。
mp启动器
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.3.2version>
dependency>
application.yml编写配置文件(数据库,端口号,mapper映射文件,… …),诸多配置信息还可由xml文件进行配置。
创建实体类User,在创建实体类的时候,也与tkmybatis有类是的注解(下面是常见注解):
@TableName()
:表名注解,value指定表名。@TableId()
:主键注解,value绑定主键字段名。@TableField()
:字段注解(非主键),value指定数据库字段名,数据表中不存在的字段使用@TableField(exist = false)
修饰。编写Mapper接口。是继承BaseMapper
有需要就编写Mapper.xml映射文件,绑定自定义方法的SQL。
编写测试类,进行测试即可(具体的方法API移步官网)。
Mybatis-Plus
是Mybatis
的增强工具包,Mybatis Plus具有的功能有:
在之后的学习中,我会总结一下mybatis-plus的这些外挂式的功能,多多益善!
SpringBoot持久层操作有很多方式,就目前而言,mybatis plus是使用最多的,自己手里面的项目到底适合那一种,当然的根据自己项目的情况来决定采用谁。关于mp和tkmybatis比较:点击我跳转。