1. 关于实体类
实体类是POJO的其中一种。
用于表示项目中需要处理的数据
与java的对应关系
MySQL中的数据类型 | Java中的数据类型 |
---|---|
tinyint / smallint / int | Integer |
bigint | Long |
char / varchar / text 系列 | String |
datetime | LocalDateTime |
decimal |
|
编写规范
private 都有setter getter方法
必须重写equals 和hashcode
必须实现serializable接口
建议重写tostring方法 输出个属性的值
使用lombok框架添加注解 可以自动生成代码 添加
@Data
注解,可以在编译期生成:
- 规范的Setter & Getter
- 规范的
hashCode()
与equals()
- 包含各属性与值的
toString()
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> <scope>provided</scope> </dependency>
注意:当使用了Lombok后,由于源代码中并没有Setter & Getter方法,所以,当编写代码时,IntelliJ IDEA不会提示相关方法,并且,即使强行输入调用这些方法的代码,还会报错,但是,并不影响项目的运行!为了解决此问题,强烈推荐安装Lombok插件
2. 通过Mybatis实现数据库编程
2.1. 关于Mybatis框架
mybatis主流解决数据库编程相关问题的框架 简化数据库编程
基础依赖项 artifactId: mybatis
独自使用比较麻烦 需要添加的依赖项的artifactId
是:mybatis-spring
。
在Spring Boot项目中,直接添加mybatis-spring-boot-starter
将包含以上依赖项,和其它必要的、常用的依赖项。
Mybatis框架简化数据库编程的表现为:
只需要定义访问数据的2.2抽象方法,并配置此抽象方法映射的SQL语句即可!
2.2. 关于抽象方法
能明确这个接口是数据访问接口,可以采取的做法有:
- 【不推荐】在接口上添加
@Mapper
注解- 每个数据访问接口上都需要此注解
- 【推荐】在配置类上添加
@MapperScan
注解,并配置数据访问接口所在的包- 在根包(含子孙包)下的任何添加了
@Configuration
注解的类都是配置类 - 只需要一次配置,各数据访问接口不必添加
@Mapper
注解 -
package cn.tedu.csmall.product.config; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Configuration; /** * Mybatis的配置类 * * @author java@tedu.cn * @version 0.0.1 */ @Configuration @MapperScan("cn.tedu.csmall.product.mapper") public class MybatisConfiguration { public MybatisConfiguration() { System.out.println("创建配置类:MybatisConfiguration"); } }
- 在根包(含子孙包)下的任何添加了
抽象方法必须定义在接口中 :Mybatis框架是通过“接口代理”的设计模式,生成了接口的实现对象!
抽象方法所在的接口,通常使用Mapper
作为名称的最后一个单词!
- 返回值类型:SQL操作是增、删、改类型的,使用
int
作为返回值类型,SQL操作是查询类型,只需要保证返回值类型可以封装必要的结果 - 方法名称:自定义的,但推荐遵循规范,不要使用重载
- 参数列表:取决于需要执行的SQL语句需要哪些参数,在抽象方法中,可以将这些参数一一列举出来,也可以将这些参数封装到自定义类中,使用自定义类作为抽象方法的参数
- 抛出异常:无
关于抽象方法命名参考(来自《阿里巴巴Java开发手册》):
- 获取单个对象的方法用 get 做前缀 get对象
- 获取多个对象的方法用 list 做前缀 list对象
- 获取统计值的方法用 count 做前缀 count值
- 插入的方法用 save / insert 做前缀 insert方法名
- 删除的方法用 remove / delete 做前缀 delete方法名
- 修改的方法用 update 做前缀。
2.3. 关于配置SQL语句
在spring boot中整合了mybatis框架后 在数据访问接口的抽象方法上使用@Insert
等注解来配置SQL语句,这种做法是不推荐的!在不是Spring Boot项目中,需要额外的配置,否则,将不识别抽象方法上的@Insert
注解。
主要原因:
- 长篇的SQL语句不易于阅读
- 不便于实现特殊的配置
- 部分配置不易于复用
- 不便于实现与DBA(Database Administrator)协作
这个时候使用xml文件来配置sql语句 这类xml文件需要固定的、特殊的声明部分
步骤:
在src/main/resources
下创建mapper
文件夹在此创建 xml文件
开始配置
- 根标签必须是
<mapper>
- 在
<mapper>
标签上必须配置namespace
属性,此属性的值是接口的全限定名(包名与类名) - 在
<mapper>
标签内部,使用<insert>
/<delete>
/<update>
/<select>
标签来配置增 / 删 / 改 / 查的SQL语句 - 各配置SQL语句的标签必须配置
id
属性,取值为对应的抽象方法的名称 - 各配置SQL语句的标签内部是配置SQL语句的
- SQL语句不需要使用分号表示结束
- 不可以随意添加注释
- 在配置
<select>
标签时,必须配置resultType
或resultMap
这2个属性中的其中1个 - 另外,还需要在
application.properties
中配置XML文件所在的位置:
2.4. 测试
在Spring Boot项目中,当需要编写测试时,可以在src/test/java
下的根包下创建测试类,并在类中编写测试方法。
则在测试的根包下创建mapper.AlbumMapperTests
测试类:
package cn.tedu.csmall.product.mapper;
import cn.tedu.csmall.product.pojo.entity.Album;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class AlbumMapperTests {
@Autowired
AlbumMapper mapper;
@Test
void testInsert() {
Album album = new Album();
album.setName("测试相册001");
album.setDescription("测试简介001");
album.setSort(99); // 注意:取值必须是 [0, 255]
int rows = mapper.insert(album);
System.out.println("插入数据完成,受影响的行数=" + rows);
}
}
如果此前没有正确的配置@MapperScan
,在执行测试时,将出现以下错误:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'cn.tedu.csmall.product.mapper.AlbumMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
如果出现以下原因的操作错误:
- 在XML文件中,根标签
<mapper>
的namespace
属性值配置有误 - 在XML文件中,配置SQL语句的
<insert>
或类似标签的id
属性值配置有误 - 在
application.properties
配置文件中,没有正确的配置XML文件的位置
将出现以下错误:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.tedu.csmall.product.mapper.AlbumMapper.insert
zz