整合mp
1.依赖
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3</version>
</dependency>
2.配置
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/ssm?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf-8
username: root
password: xxxxxx
hikari:
connection-timeout: 60000
validation-timeout: 3000
idle-timeout: 60000
login-timeout: 5
max-lifetime: 60000
maximum-pool-size: 30
minimum-idle: 10
read-only: false
配置创建时间和更新时间自动插入
@Slf4j
@Component
public class CommonMetaObjectHandler implements MetaObjectHandler {
//原理是后置处理
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
分页插件
@Configuration
public class MyBatisPlusConfig {
// 最新版
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
paginationInnerInterceptor.setOptimizeJoin(true);
paginationInnerInterceptor.setMaxLimit(500L);
paginationInnerInterceptor.setOverflow(false);
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
}
3.注解
@SpringBootApplication
@MapperScan("com.zl.springbootssm.mapper")//整合mybatis
public class SpringbootSsmApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootSsmApplication.class, args);
}
}
1.普通的增删改查
数据库实体
CREATE TABLE `ssm`.`order` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`orders` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`number` int(11) NULL DEFAULT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
mapper接口
//自己写sql语句的话可以不用继承basemapper
public interface OrderMapper extends BaseMapper<Order> {
//保存
int save(Order order);
//查询
Order get(Integer id);
实现类
//namespace对应接口,id对应接口中的方法,parameterType对应参数类型,
//resultType对应sql语句返回结果类型。
//因为ORM映射关系是实体,所以resultType返回结果只能是实体等,不可能是集合之类的。
//使用#{}充当占位符。
<mapper namespace="com.zl.springbootssm.mapper.OrderMapper">
//保存
<insert id="save" parameterType="com.zl.springbootssm.pojo.Order">
INSERT INTO kss_order (id, orders, number)
VALUES (#{id}, #{orders}, #{number});
</insert>
//查询
<select id="get" resultType="com.zl.springbootssm.pojo.Order">
select *
from `kss_order`
where id = #{id};
</select>
业务层
public interface IOrderService {
int saveService(Order order);
Order get(int id);
List<Map<String, Object>> getTwoPojo();
List<OrderVo> findOrderservice(OrderVo orderVo);
}
@Service
@Slf4j
public class OrderService implements IOrderService {
@Autowired
@Resource
private OrderMapper orderMapper;
@Override
public int saveService(Order order) {
int save = orderMapper.save(order);
return save;
}
@Override
public Order get(int id) {
Order order = orderMapper.get(id);
Order order1 = OrderThreadLocal.get();
log.info(order.getOrders());
return order;
}
@Override
public List<Map<String, Object>> getTwoPojo() {
List<Map<String, Object>> orders = orderMapper.findOrders();
return orders;
}
//模糊查询
public List<OrderVo> findOrderservice(OrderVo orderVo){
List<OrderVo> orderList = orderMapper.findOrderList(orderVo);
log.info("===>"+orderList.toString());
return orderList;
}
}
2.模糊查询(带参数)
mapper接口
//自己写sql语句的话可以不用继承basemapper
public interface OrderMapper {
//模糊查询
使用@Param给参数起别名映射
当使用了@Param注解来声明参数的时候,SQL语句取值使用#{},${}取值都可以。
当不使用@Param注解声明参数的时候,必须使用的是#{}来取参数。使用${}方式取值会报错。
不使用@Param注解时,参数只能有一个,并且是Javabean。在SQL语句里可以引用JavaBean的属性,而且只能引用JavaBean的属性。
List<OrderVo> findOrderList(@Param("orderVo") OrderVo orderVo);
实现类
//返回值是sql结果能够映射的实体
<select id="findOrderList" resultType="com.zl.springbootssm.pojo.OrderVo">
<bind name="key" value="'%'+orderVo.keyword+'%'"/>
select * from kss_order
where orders like #{key}
</select>
3.带条件的增删改查
待更
4.动态sql语句
待更
5.分页
待更
7.如何理解Iservice和BaseMapper
当我们写增删改查时常用的一种方式如下
定义接口
public interface IUserService extends IService<User> {
boolean save(User user);
User login(UserVo userVo);
}
实现类
@Service
@Slf4j
public class UserServiceImp extends ServiceImpl<UserMapper, User> implements IUserService {
//不用自己写sql语句实现,使用basemapper自己实现
@Override
public boolean save(User user) {
return this.baseMapper.insert(user)>0?true:false;
}
@Override
public User login(UserVo userVo) {
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getUserName, userVo.getUserName());
User user = this.getOne(lambdaQueryWrapper);
return user;
}
}
其中接口为什么要继承IService,实现类中为什么要继承ServiceImp<UserMapper,User>? 以及basemapper与Iservice的关系是什么?
- 其中basemapper是数据库层面具体的增删改查,而IService是业务层面的增删改查接口。
- 当自己不想写sql语句时可以使用IService中已经封装好的接口去调basemapper中具体的增删改查。
- 其中ServiceImpl实现了IService中的抽象方法所以UserServiceImp不用去实现IService只需要实现IUserService自己接口中的抽象方法。
- 而UserServiceImp和ServiceImpl是父子关系,ServiceImpl起到职责分担的作用普通的增删改查已将帮子类实现了