一、创建一个数据表对应的实体类
在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;
}
二、创建一个 Mapper 接口(手动方式)
在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);
}
三、配置Mapper接口所在的包
方式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");}
}
四、创建一个与 Mapper 接口相对应的 XML 文件
在src/main/resources路径下新建mapper文件夹,如下图所示
使用与 Mapper 接口相同的命名,并在 XML 文件中编写 SQL 查询语句,以及对应的映射关系等。
<?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.luoyang.small.mapper.AlbumMapper"><!-- int insert(Album album); --><insert id="insert" useGeneratedKeys="true" keyProperty="id">INSERT INTO pms_album (name, description, sort) VALUES (#{name}, #{description}, #{sort})</insert><!-- int insertBatch(List<Album> albumList); --><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><!-- int deleteById(Long id); --><delete id="deleteById">DELETE FROM pms_album WHERE id=#{id}</delete><!-- int deleteByIds(Long[] ids); --><delete id="deleteByIds">DELETE FROM pms_album WHERE id IN (<foreach collection="array" item="id" separator=",">#{id}</foreach>)</delete><!-- int update(Album album); --><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><!-- int count(); --><select id="count" resultType="int">SELECT count(*) FROM pms_album</select><!-- int countByName(String name); --><select id="countByName" resultType="int">SELECT count(*) FROM pms_album WHERE name=#{name}</select><!-- int countByNameAndNotId(@Param("id") Long id, @Param("name") String name); --><select id="countByNameAndNotId" resultType="int">SELECT count(*) FROM pms_album WHERE name=#{name} AND id!=#{id}</select></mapper>
五、在配置文件中指定 Mapper 接口和 XML 文件的路径
在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自动装配此属性的值@AutowiredAlbumMapper mapper;@Testvoid 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 接口的具体实现类,并调用方法进行数据库操作。
创造价值,乐哉分享!