在src/main/java/包名/路径下新建pojo.entity文件夹,如com.luoyang.small.pojo.entity,并在该文件夹下新增实体类java文件:如相册Album.java
该实体类的属性应与数据表的字段对应
数据表样例如下:
#如果数据表不存在,就删表
DROP TABLE IF EXISTS pms_album;
#创建新的数据表pms_album
CREATE TABLE pms_album
(
id bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '数据id',
name varchar(50) DEFAULT NULL COMMENT '相册名称',
description varchar(255) DEFAULT NULL COMMENT '相册简介',
sort tinyint(3) unsigned DEFAULT '0' COMMENT '排序序号',
gmt_create datetime DEFAULT NULL COMMENT '数据创建时间',
gmt_modified datetime DEFAULT NULL COMMENT '数据最后修改时间',
PRIMARY KEY (id)
) DEFAULT CHARSET = utf8mb4 COMMENT ='相册';
#往pms_album插入数据
INSERT INTO pms_album
VALUES (1, '华为Mate60的相册', '暂无', 99, '2022-07-08 11:30:44', '2023-11-29 11:30:44'),
(2, '华为Mate20的相册', '暂无', 99, '2022-07-08 11:30:44', '2022-07-08 11:30:44'),
(3, '华为Mate30的相册', '暂无', 99, '2022-07-08 11:30:44', '2022-07-08 11:30:44'),
(4, '华为Mate40的相册', '暂无', 99, '2022-07-08 11:30:44', '2022-07-08 11:30:44'),
(5, '华为Mate50的相册', '暂无', 99, '2022-07-08 11:30:44', '2022-07-08 11:30:44'),
(6, '华为P10的相册', '暂无', 99, '2022-07-08 11:30:44', '2022-07-08 11:30:44'),
(7, '华为P20的相册', '暂无', 99, '2022-07-08 11:30:44', '2022-07-08 11:30:44'),
(8, '华为P30的相册', '暂无', 99, '2022-07-08 11:30:44', '2022-07-08 11:30:44'),
(9, '华为P40的相册', '暂无', 99, '2022-07-08 11:30:44', '2022-07-08 11:30:44'),
(10, '华为P50的相册', '暂无', 99, '2022-07-08 11:30:44', '2022-07-08 11:30:44');
配合的实体类如下
public class Album implements Serializable {
/**
* 数据id
*/
private Long id;
/**
* 相册名称
*/
private String name;
/**
* 相册简介
*/
private String description;
/**
* 排序序号
*/
private Integer sort;
/**
* 数据创建时间
*/
private LocalDateTime gmtCreate;
/**
* 数据最后修改时间
*/
private LocalDateTime gmtModified;
}
在src/main/java/包名/路径下新建mapper文件夹,如com.luoyang.small.mapper,并在该文件夹下新增mapper java文件:如AlbumMapper.java
在接口中声明需要的抽象方法。方法的名称和参数应与 SQL 查询语句对应。
//标记当前类是数据访问组件类
@Repository
public interface AlbumMapper {
/**
* 插入相册数据
*
* @param album 相册数据
* @return 受影响的行数
*/
int insert(Album album);
/**
* 批量插入相册数据
*
* @param albums 相册列表
* @return 受影响的行数
*/
int insertBatch(List<Album> albums);
/**
* 根据id删除相册数据
*
* @param id 相册id
* @return 受影响的行数
*/
int deleteById(Long id);
/**
* 根据若干个id批量删除相册数据
*
* @param ids 若干个相册id的数组
* @return 受影响的行数
*/
int deleteByIds(Long[] ids);
/**
* 根据id修改相册数据
*
* @param album 封装了相册id和新数据的对象
* @return 受影响的行数
*/
int update(Album album);
/**
* 统计相册数据的数量
*
* @return 相册数据的数量
*/
int count();
/**
* 根据相册名称统计数据的数量
*
* @param name 相册名称
* @return 匹配名称的相册数据的数量
*/
int countByName(String name);
/**
* 统计非某id但名称匹配的相册数据的数量,用于检查是否存在其它数据使用了相同的名称
* @param id 相册id
* @param name 相册名称
* @return 匹配名称但不匹配id的数据的数量
*/
int countByNameAndNotId(@Param("id") Long id, @Param("name") String name);
}
方式1:使用 @Mapper 注解标识该接口
方式2【推荐】在配置类上使用@MapperScan注解,并指定注解的参数,此参数值就是包名。
在src/main/java/包名/路径下新建config文件夹,如com.luoyang.small.config,并在该文件夹下新增配置java文件:如MybatisConfigurationjava
如下:
//| 添加在类上,仅添加此注解的类才被视为配置类
@Configuration
//以下注释文件夹名跟你创建的mapper接口路径一致
@MapperScan("com.luoyang.small.mapper")
public class MybatisConfiguration {
public MybatisConfiguration() {
log.println("创建配置类对象:MybatisConfiguration");
}
}
在src/main/resources路径下新建mapper文件夹,如下图所示
使用与 Mapper 接口相同的命名,并在 XML 文件中编写 SQL 查询语句,以及对应的映射关系等。
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.luoyang.small.mapper.AlbumMapper">
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
INSERT INTO pms_album (
name, description, sort
) VALUES (
#{name}, #{description}, #{sort}
)
insert>
<insert id="insertBatch" useGeneratedKeys="true" keyProperty="id">
INSERT INTO pms_album (
name, description, sort
) VALUES
<foreach collection="list" item="album" separator=",">
(#{album.name}, #{album.description}, #{album.sort})
foreach>
insert>
<delete id="deleteById">
DELETE FROM pms_album WHERE id=#{id}
delete>
<delete id="deleteByIds">
DELETE FROM pms_album WHERE id IN (
<foreach collection="array" item="id" separator=",">
#{id}
foreach>
)
delete>
<update id="update">
UPDATE pms_album
<set>
<if test="name != null">
name=#{name},
if>
<if test="description != null">
description=#{description},
if>
<if test="sort != null">
sort=#{sort},
if>
set>
WHERE id=#{id}
update>
<select id="count" resultType="int">
SELECT count(*) FROM pms_album
select>
<select id="countByName" resultType="int">
SELECT count(*) FROM pms_album WHERE name=#{name}
select>
<select id="countByNameAndNotId" resultType="int">
SELECT count(*) FROM pms_album WHERE name=#{name} AND id!=#{id}
select>
mapper>
在src/main/resources路径下新建application.yml,如下图所示
# Mybatis相关配置
mybatis:
# 配置SQL语句的XML文件所在的位置
mapper-locations: classpath:mapper/*.xml
之前数据库连接等相关配置
在src/test/java/包名/路径下新建AlbumMapperTests.java文件,添加mapper接口中声明的增删改查方法,如下图所示:新增数据测试
添加测试方法,调用AlbumMapper接口中的方法
@SpringBootTest
public class AlbumMapperTests {
//添加在属性上,使得Spring自动装配此属性的值
@Autowired
AlbumMapper mapper;
@Test
void insert() {
Album album = new Album();
album.setName("测试名称001");
album.setDescription("测试简介001l啦啦啦啦啦");
album.setSort(100); // 注意:由于MySQL中表设计的限制,此值只能是[0,255]区间内的
int rows = mapper.insert(album);
System.out.println("插入数据完成,受影响的行数:" + rows);
}
}
结果: 新增相册数据成功
后续是,项目中数据库真实应用场景:在应用程序中使用 SqlSessionFactory 和 SqlSession 等类来实例化 Mapper 接口的具体实现类,并调用方法进行数据库操作。
创造价值,乐哉分享!