SpringBoot系列记录(十四)——SpringBoot用Restful风格实现增删改查并使用MyBatis逆向工程

 一、MyBatis逆向工程的使用

因为比较简单,就不另写一篇记录了,在这里正好使用上。可以针对单表自动生成mybatis执行所需要的代码(mapper.java、mapper.xml、pojo…),提高工作效率。

数据表还是用上一篇的,这里依然贴一下SQL

DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info` (
  `id` int(64) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  `password` varchar(64) DEFAULT NULL,
  `salt` varchar(64) DEFAULT NULL,
  `state` varchar(8) DEFAULT NULL,
  `username` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

INSERT INTO `user_info` VALUES ('1', '管理员', '565111f370e4dd497aa4eeb985efa6a3', '7mrNoL/keN6rbqZDx+PKyg==', '1', 'admin');

1.1 POM.xml

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- thymeleaf -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>

        <!-- Spring Boot Mybatis 依赖 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>

        <!-- Mybatis逆向工程 -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.7</version>
        </dependency>
        <!-- MySQL 连接驱动依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.7</version>
                <configuration>
                    <configurationFile>src/main/resources/generator/generatorConfig.xml</configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
            </plugin>
        </plugins>
    </build>

1.2 目录结构

 1.3 generator.xml

注释已经非常详细了,就不赘述了;如果包名不一致,记得修改对应位置的包名

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!-- 数据库驱动:选择你的本地硬盘上面的数据库驱动包-->
    <classPathEntry location="D:\software\repository\mysql\mysql-connector-java\5.1.30\mysql-connector-java-5.1.30.jar"/>
    <!-- 表设计时有联合主键时, 不需要单独主键实体类时 把defaultModelType设置为flat -->
    <context id="DB2Tables" targetRuntime="MyBatis3" defaultModelType="flat">
        <!-- JavaBean 实现 序列化 接口 -->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
        <!-- 生成toString -->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
        <!-- optional,旨在创建class时,对注释进行控制 -->
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <!-- <property name="suppressAllComments" value="true"/>-->
        </commentGenerator>
        <!--数据库链接URL,用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3306/demo"
                        userId="root"
                        password="1234">
        </jdbcConnection>
        <!-- 类型转换 -->
        <javaTypeResolver >
            <!-- 是否使用bigDecimal,
                false: 把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer(默认)
                true:  把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal
            -->
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
        <!-- 生成模型的包名和位置-->
        <javaModelGenerator targetPackage="com.example.restfuldemo.domain" targetProject="src/main/java">
            <!-- 默认false 是否允许子包 -->
            <property name="enableSubPackages" value="true" />
            <!-- 默认false 是否对model添加 构造函数 -->
            <property name="constructorBased" value="false"/>
            <!-- 默认false 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 -->
            <property name="immutable" value="false"/>
            <!-- 默认false 是否对类CHAR类型的列的数据进行trim操作 -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- 生成映射文件的包名和位置-->
        <sqlMapGenerator targetPackage="mappers" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- 生成DAO的包名和位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.restfuldemo.dao" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->
        <table tableName="user_info"></table>
    </context>
</generatorConfiguration>

 1.4 右键 run mybatis-generator即可

    BUILD SUCCESS之后可以看到,它自动生成了下图这些东西,那是相当省事了。

二、 Restful风格增删改查

2.1 application.properties

#数据源配置
spring.datasource.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username = root
spring.datasource.password = 1234

## Mybatis 配置
# 配置为 com.example.restfuldemo.domain 指向实体类包路径。
mybatis.typeAliasesPackage=com.example.restfuldemo.domain
# 配置为 classpath 路径下 mapper 包下,* 代表会扫描所有 xml 文件。
mybatis.mapperLocations=classpath:/mappers/*.xml

2.2  UserInfoService与Impl

public interface UserInfoService {

    /**
     * 新增用户
     * @param userInfo
     * @return
     */
    int addUser(UserInfo userInfo);

    /**
     * 修改用户
     * @param userInfo
     * @return
     */
    int updateUser(UserInfo userInfo);

    /**
     * 删除用户
     * @param id
     * @return
     */
    int delUser(int id);

    /**
     * 根据用户名查找
     * @param username
     * @return
     */
    UserInfo getUserByName(String username);

    /**
     * 查询所有用户
     * @return
     */
    List<UserInfo> findAll();
}

实现类:

@Service("userInfoService")
public class UserInfoServiceImpl implements UserInfoService {

    @Autowired
    UserInfoMapper userInfoMapper;

    @Override
    public int addUser(UserInfo userInfo) {
        int result = 0;
        result = userInfoMapper.insert(userInfo);
        return result;
    }

    @Override
    public int updateUser(UserInfo userInfo) {
        int result = 0;
        result = userInfoMapper.updateByPrimaryKey(userInfo);
        return result;
    }

    @Override
    public int delUser(int id) {
        int result = 0;
        result = userInfoMapper.deleteByPrimaryKey(id);
        return result;
    }

    @Override
    public UserInfo getUserByName(String username) {
        return null;
    }

    @Override
    public List<UserInfo> findAll() {
        UserInfoExample example = new UserInfoExample();
        //有查询条件框时这样写
       // UserInfoExample.Criteria criteria = example.createCriteria();
        //criteria.andUsernameLike("%"+username+"%");
        List<UserInfo> userInfos = userInfoMapper.selectByExample(example);
        return userInfos;
    }
}

2.3 Controller

@RestController
@RequestMapping("/api/user")
public class UserInfoController {

    @Autowired
    UserInfoService userInfoService;

    @PostMapping
    public int addUser(UserInfo userInfo){
        return  userInfoService.addUser(userInfo);
    }

    @PutMapping
    public int updateUser(UserInfo userInfo){
        return  userInfoService.updateUser(userInfo);
    }

    @DeleteMapping
    public int delUser(int id){
        return userInfoService.delUser(id);
    }

    @GetMapping("/userAll")
    public List<UserInfo> findAll(){
        return userInfoService.findAll();
    }

}

 2.4 测试

这里直接使用postman来测试了。 展示新增与查询的结果

查询:

三、扩展

3.1 HTTP 动词

  • GET(SELECT):从服务器取出资源(一项或多项)。
  • POST(CREATE):在服务器新建一个资源。
  • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
  • DELETE(DELETE):从服务器删除资源。

3.2 实际情况

  •    在实际的项目中简单查询尽量用GET,好处是可以直接带查询参数;
  •    复杂查询和更新用POST,用的最多

其实我觉得这种并不好用,还没我在路径上使用动词表示的简单明了,当然了,个人看法。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章