代码编写平台:IDEA
MySQL版本:5.7
数据库操作工具:SQLyog
数据库(表)的创建
1.右键已创建的连接,选择创建数据库
2.创建新的数据库,这里创建名为“test"的数据库
3.在MyBatis-Plus官网上复制示例代码,复制到查询编辑器窗口,鼠标选中全部内容,然后点击导航栏的执行查询按钮。F5刷新一下,数据库中就会出现user表
4.user表创建完成
需要添加的依赖
项目连接的数据库是MySQL5.7版本的,所以这里从Maven Repository拿的mysql connector依赖版本是5.1.49版本,默认是最新的8.0版本
lombok依赖用来简化实体类的getXX setXX toString等一系列的方法
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2<!--Latest Version--></version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</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>
application.yml中配置
url: jdbc:mysql://localhost:3306/数据库名?characterEncoding=utf-8&useSSL=false
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useSSL=false
username: root
password: 123321
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
项目结构
创建各层对应类
pojo/User
@Data注解自动生成关于该类的getXX setXX toString Constructor()方法
@TableName(String value),value要和数据库中创建的表名完全一致
类中的属性名也要和连接数据库中的表的列名完全一致才行
@Data
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造
@TableName("user") //user对应数据库中的表
public class User {
private Integer id;
private String name;
private Integer age;
private String email;
}
当然,属性名也可以与表列名不一致,只是需要添加注解@TableField(String value)
@TableField("email") //设置emal映射到user表中email列
private String emal;
dao/UserDao
BaseMapper<>中的泛型对象为映射数据库对应表的实体类
/*
* BaseMapper类用来完成对对象的操作方法(增删查改),它会映射到对应的表中,
* 这个接口会在spring容器里,动态创建这个接口的实现类,同时产生这个类的对象
*
*/
public interface UserDao extends BaseMapper<User> {
}
biz/UserBiz
IService类对CRUD【(Create(增)、Retrieve(查)、Update(改)和Delete(删)】进行进一步封装
IService<>中的泛型对象同样为映射数据库对应表的实体类
public interface UserBiz extends IService<User> {
}
biz/impl/UserBizImpl
ServiceImpl<M extends BaseMapper<T>, T>。M是继承了BaseMapper的一个接口类型,T是实体类类型。即可简化为ServiceImpl<M, T>。如有这个ServiceImpl不满足当前的需求,我们可以自己定义新方法
ServiceImpl是IService接口的一个实现类
@Service //表示spring容器帮我们产生这个类的对像,同时,完成自动注入,将UserDao接口的实现类对像注入进来
public class UserBizImpl extends ServiceImpl<UserDao, User> implements UserBiz {
//
}
MybatisPlusDemo01Application主类)
@MapperScan
作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
添加位置:Springboot启动类
参考文献:https://blog.csdn.net/manchengpiaoxue/article/details/84937257
@SpringBootApplication
@MapperScan("com.igeekhome.dao")
public class MybatisPlusDemo01Application {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusDemo01Application.class, args);
}
}
数据库内置CRUD操作测试
测试结构
数据库原表
数据库层
框架代码:@SpringBootTest开启spring boot测试功能 ,@Autowired开启自动注入,这里userDao可能会被红线标记,但没关系
@SpringBootTest
public class UserDaoTest {
@Autowired
private UserDao userDao;
}
查看mybatis-plus官网的参考文档或者查看BaseMapper<T>源码,根据参数类型提示对内置操作进行测试
public interface BaseMapper<T> extends Mapper<T> {
int insert(T entity);
int deleteById(Serializable id);
int deleteByMap(@Param("cm") Map<String, Object> columnMap);
int delete(@Param("ew") Wrapper<T> queryWrapper);
int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
int updateById(@Param("et") T entity);
int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
T selectById(Serializable id);
List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
T selectOne(@Param("ew") Wrapper<T> queryWrapper);
Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);
List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
<E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);
<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper);
}
编写测试方法时,方法前必须加注解@Test,方法的返回类型和参数均可为空
int insert(T entity);
T表示任意类型(泛型写法),entity表明这是一个实体对象
那这里我们就新建一个实体对象user,然后通过userDao对象调用insert()方法
@Test
void insert(){
User user=new User(7,"wangweifeng",18,"wagnwei_fen@163.com");
userDao.insert(user)
}
鼠标光标放在在测试方法中,右键选择Run 'insert()'(Run 'method')
通过控制台可以看到数据插入成功的信息
对应数据库表点击刷新按钮 ,发现数据表中已经更新了插入信息
int deleteById(Serializable id);
Serializable类型可以简单理解为任意类型。
@Test
void deleteById()
{
int i= userDao.deleteById(7);//i值,表示影响的行数
}
int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
简化为int delete(Wrapper<T> queryWrapper),通过查看源码可知Wrapper是一个带有泛型的抽象类。点击其左侧的继承图标,可以发现有一个子类为QueryWrapper,那么我们就顺应文档参数名提示,将具体参数类型设为QueryWrapper<>,并将泛型对象设为User(映射到数据库目标表的映射实体类)
@Test
void delete()
{
QueryWrapper<User> qw=new QueryWrapper<>();
userDao.delete(qw);
}
如果QueryWrapper对象不设置任何条件,那么就会删除表中所有的信息
这里可以参考:条件构造器
eq表示等于,le表示小于等于。这里设定的条件之间的关系是AND,即都要满足。从控制台的运行结果也可以看出来
@Test
void delete()
{
QueryWrapper<User> qw=new QueryWrapper<>();
qw.eq("name","Tom");//条件①,name="Tom"
qw.le("age", 30);//条件②,age<=30
userDao.delete(qw);
}