springboot2.x 从零到一(3、springboot整合mybatis)

简单聊一下mysql框架选型的生态。

1、还在直接用JDBC的都是挺怀旧的了,或者他们不愿承担技术更新带来的风险和成本,现在的框架整合数据库都旨在简单、便捷,繁琐的配置文件+对象注入的操作越来越少了(谁没事给自己找事干呢),以前ssm项目用过,多创建几次项目、配置几次xml,对底层理解挺深刻的,这里自不细说。
2、现在的分布式项目基本一个微服务配一套数据源(一个微服务需要配多数据源的和架构好好聊聊人生吧,我们有没有做到:专业的事由专业的人(服务)来干!),所以多数据源也不多说了(其实就是不会)。
3、JPA和mybatis,两者都是ORM(Object Relational Mapping 对象关系映射)框架的佼佼者。其实我自己也搭过JPA+springboot练手,开封即用、没有太多概念、对开发者门槛要求低。但问题在于操作数据库归根结底还是要服务于业务需求,有时面对一张表的几个字段需要创建N种Mapper来操作,或者多表联查、复合主键等等复杂的场景,JPA就显的有些吃力了。

1、简要介绍模型概念

在这里插入图片描述
初学springweb时,遇到一系列VO、BO、PO一堆O,其实名词还算好理解,当时看过也算好记,但是过些天再问又忘了。实际没必要硬记这些东西,自己实践过从前台调到后台服务,从服务再把数据写到DB,这一切就了然了。

VO:view object 视图层对象
PO(Entity 实体):Persistant Object 持久层对象
BO:Business Object 业务对象

2、常用BeanUtils和Dozer解决多个O之间的转换(或内外服务中对类赋值转换)

各家BeanUtils拷贝的性能也各有千秋(Dozer没用过不说了),比如cglib的100万次拷贝只需10毫秒。甚至alibaba规范要求禁止使用Apache的BeanUtils进行拷贝(性能主要浪费在日志输出、类型检查、类型转换),性能从下图就可见一斑了。因为常见功能中拷贝次数较小,且springBeanUtils是集成在spring框架中直接可用的,简单点的项目用springBeanUtils就够了,对性能有追求且拷贝数据量大的不妨考虑cglib。
在这里插入图片描述
在这里插入图片描述

3、整合mybatis

如果数据库量极大时,还可以通过引用MybatisPlus+PageHelper.startPage(1, 2) 实现数据库分页查询,不过不用插件也可以时间,不必强用插件反倒拉低性能。

3.1 引maven依赖

  <!--连接数据库mysql-->
    <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>
    </dependency>

这里看上去只是添加了mybatis-spring-boot-starter依赖。实则spring和mybatis整合及jdbc等都已经加进来了。在这里插入图片描述

3.2 配置数据源[3.3.3的配置文件中定义代码更美观]

注意 3.1中引用的mysql-connector-java版本和这里的驱动driver-class-name是对应的。
另外 mapper-locations配置xml文件的位置,放在代码里就太丑了(或者放在xml文件中定义)。
在这里插入图片描述

com.mysql.jdbc.Driver 是 mysql-connector-java 5中的,
com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6中的

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/socket?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&characterEncoding=utf-8&useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver

mybatis:
  mapper-locations: classpath:mybatis/*.xml

3.3 将mapper注入到spring容器中

//TODO 详细研究注解注入的实现

1、直接在mapper接口上添加注解@Mapper
在这里插入图片描述
2、当mapper接口较多时,直接在启动时扫描整个目录或类 @MapperScan
在这里插入图片描述
3、通过xml文件将bean注入(代码美观)
https://mybatis.org/spring/zh/mappers.html
//TODO 看官网mybatis的注入介绍

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
       xsi:schemaLocation="
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">

    <!-- mybatis -->
    <!--<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" value="classpath:mybatis/*.xml" />
        <property name="configLocation" value="classpath:mybatis/mybitas-config.xml" />
    </bean>-->

    <mybatis:scan base-package="com.asky.servicesDemo.mapper"/>

</beans>

3.4 写mapper接口和xml

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.asky.servicesDemo.mapper.SocketMapper">
    <insert id="insertSocket" parameterType="com.asky.servicesDemo.model.Socket">
        insert into socket (codeId, codeName, appearance,
        territory)
        values (#{codeId,jdbcType=VARCHAR}, #{codeName,jdbcType=VARCHAR}, #{appearance,jdbcType=INTEGER},
        #{territory,jdbcType=VARCHAR})
    </insert>
</mapper>

3.5 mapper对象的使用

得益于3.3节中所述,已经将对象注入到spring容器中,所以在使用的时候直接@Autowired即可。但是使用socketManager时如果没有通过注解@Component将类注入到容器,启动时会报错找不到bean。这样应该就更好理解依赖注入了!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4 事务

操作数据是服务中极关键的一步,没有事务的保证,数据库会存在大量脏数据,必须专门拉出来练一练。
//TODO 事务实现

5 收工

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旧梦昂志

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值