数据库开发 🌐
Feat Cloud 已同 Mybatis 做了一定程度的集成,你可以直接使用 Mybatis 提供的 Mapper 接口来进行数据库的操作。本章将介绍如何在 Feat Cloud 中使用 Mybatis 进行数据库开发。
配置 mybatis-config.xml
在 src/main/resources
目录下创建 mybatis-config.xml
, 文件内容如下:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <!-- 可选:配置MyBatis的全局行为 --> <settings> <!-- 开启驼峰命名自动映射 --> <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 开启二级缓存 --> <setting name="cacheEnabled" value="true"/> </settings>
<!-- 可选:类型别名配置 --> <typeAliases> <package name="org.smartboot.feat.demo.model"/> </typeAliases>
<!-- 可选:插件配置 --> <plugins> <!-- 分页插件示例 --> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="helperDialect" value="mysql"/> </plugin> </plugins>
<!-- 必选:环境配置 --> <environments default="mysql"> <environment id="mysql"> <!-- 使用JDBC事务管理器 --> <transactionManager type="JDBC"/> <!-- 数据源配置 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments>
<!-- 必选:Mapper接口扫描配置 --> <mappers> <package name="org.smartboot.feat.demo.dao.mapper"/> </mappers></configuration>
实例化 SqlSessionFactory
Feat Cloud 提供了两种方式来实例化 SqlSessionFactory:
@Beanpublic class MybatisSessionFactory { @Bean("sessionFactory") public SqlSessionFactory sessionFactory() throws IOException { return new SqlSessionFactoryBuilder().build( Resources.getResourceAsStream("mybatis/mybatis-config.xml") ); }}
@Controllerpublic class ControllerDemo { @Bean("sessionFactory") public SqlSessionFactory sessionFactory() throws IOException { return new SqlSessionFactoryBuilder().build( Resources.getResourceAsStream("mybatis/mybatis-config.xml") ); }}
定义@Mapper接口
@Mapper 接口的定义方式与 Spring 基本一致。以下是一个完整的示例,展示了常用的 SQL 操作和动态 SQL 的使用:
@Mapperpublic interface UserMapper { // 动态SQL查询示例 @Select({"<script>", "SELECT * FROM user_info", "<where>", " <if test='username != null'>AND username LIKE CONCAT('%', #{username}, '%')</if>", " <if test='role != null'>AND role = #{role}</if>", "</where>", "ORDER BY username", "</script>"}) @ResultType(UserDO.class) List<UserDO> getUserList(UserQuery query);
// 基本查询示例 @Select("SELECT * FROM user_info WHERE username=#{username} AND password=#{password}") @ResultType(UserDO.class) UserDO getUser(@Param("username") String username, @Param("password") String password);
// 插入示例 @Insert("INSERT INTO user_info(username,password,role,`desc`) " + "VALUES(#{username},#{password},#{role},#{desc})") @Options(useGeneratedKeys = true, keyProperty = "id") void insert(UserDO userDO);
// 批量删除示例 @Delete("<script>" + "DELETE FROM user_info WHERE username IN" + "<foreach collection='users' item='username' open='(' close=')' separator=','>" + " #{username}" + "</foreach>" + "</script>") int deleteUsers(@Param("users") List<String> usernames);
// 更新示例 @Update("UPDATE user_info SET password=#{password}, role=#{role} " + "WHERE username=#{username}") int updateUser(UserDO user);}
使用@Mapper和事务管理
Mapper 接口可以通过 @Autowired
注解注入到其他 Bean 中使用。同时,Feat Cloud 也支持使用 @Transactional
注解进行事务管理:
@Servicepublic class UserService { @Autowired private UserMapper userMapper;
// 使用事务注解 @Transactional public void createUser(UserDO user) { // 检查用户是否存在 UserDO existingUser = userMapper.getUser(user.getUsername(), null); if (existingUser != null) { throw new RuntimeException("用户已存在"); } // 创建新用户 userMapper.insert(user); }
// 批量操作示例 @Transactional public void batchUpdateUsers(List<UserDO> users) { for (UserDO user : users) { userMapper.updateUser(user); } }}