简单聊一下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 事务实现