JavaEE开发 - 写个后台接口服务

别人推荐的两篇blog,
Springboot 整合 Mybatis 的完整 Web 案例
社区 Spring Boot 从入门到进阶系列教程


创建项目

使用Intellij直接new一个新项目


project

1、项目结构介绍

image.png
com.zuo.controller - Controller 层
com.zuo.dao - 数据操作层 DAO
com.zuo.domain - 实体类
com.zuo.service - 业务逻辑层
DemoApplication - 应用启动类
application.properties - 应用配置文件,应用启动会自动读取配置
  • 整个工程的pom.xml
    新建项目生成都pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zuo</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <!-- Spring Boot 启动父依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <!--项目描述-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <!--依赖-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- Spring Boot Test 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <!--插件-->
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

我们还可以根据需要引入下面都依赖

<!-- Spring Boot web依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- Junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

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

<!-- MySQL 连接驱动依赖 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql-connector}</version>
</dependency>

<!--alibaba fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.32</version>
</dependency>


2、改数据库配置

打开 application.properties 文件, 修改相应的数据源配置,比如数据源地址、账号、密码等。(如果不是用 MySQL,自行添加连接驱动 pom,然后修改驱动名配置。)
比如我们在移动端常用端SQLite数据库的连接

<!-- sqlite 连接驱动依赖 -->
<dependency>
    <groupId>org.xerial</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.21.0.1</version>
</dependency>

3、写个Controller

Spring4可以使用 @RestController
在Spring4之前都版本需要@Controller @ResponseBody结合使用

@RestController和@RequestMapping注解是来自SpringMVC的注解,它们不是SpringBoot的特定部分。

  1. @RestController:提供实现了REST API,可以服务JSON,XML或者其他。这里是以String的形式渲染出结果。
  2. @RequestMapping:提供路由信息,"/“路径的HTTP Request都会被映射到sayHello方法进行处理。
  • 写一个测试都请求类
/**
 * Spring Boot demo案例
 *
 * @author zuo
 * @date 2018/7/29 12:56
 */
@Controller
@ResponseBody
public class TestController {
    @RequestMapping("/login")
    public String login() {
        return "{\"userid\":1,\"userName\":\"lihua\"}";
    }
}

4、模拟请求

运行DemoApplication
待控制台出现如下信息,即表示程序启动成功了,我们就可以 http://localhost:8080/login进行访问

完成启动

模拟请求

连接数据库

SpringBoot连接SQLite数据库(基于Spring-Data-Jpa和Gradle配置)
Spring整合Hibernate详细步骤

由于我之前把数据存在移动端的sqlite数据库中,所以这里我就连接了Sqlite数据库了。

1、加上sqlite依赖

    <!-- sqlite 连接驱动依赖 -->
        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
            <version>3.21.0.1</version>
        </dependency>

2、配置application.properties

#配置sqlite数据库连接方式
spring.datasource.url=jdbc:sqlite:D://zuoDbFile//task.db
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=org.sqlite.JDBC

#mybatis配置信息
mybatis.typeAliasesPackage=com.zuo.bean
mybatis.mapperLocations=classpath:mappers/*.xml

#sqlite自己配置Hibernate连接
spring.jpa.database-platform=com.zuo.sqlite.SQLiteDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

Spring-Data-Jpa采用Hibernate来关联数据库,而Hibernate想要支持SQLite,需要自己配置连接,代码如上


3、SQLiteDialect

SQLiteDialect
/**
 * $desc$
 *
 * @author zuo
 * @date 2018/7/29 20:44
 */
public class SQLiteDialect extends Dialect {
    public SQLiteDialect() {
        registerColumnType(Types.BIT, "integer");
        registerColumnType(Types.TINYINT, "tinyint");
        registerColumnType(Types.SMALLINT, "smallint");
        registerColumnType(Types.INTEGER, "integer");
        registerColumnType(Types.BIGINT, "bigint");
        registerColumnType(Types.FLOAT, "float");
        registerColumnType(Types.REAL, "real");
        registerColumnType(Types.DOUBLE, "double");
        registerColumnType(Types.NUMERIC, "numeric");
        registerColumnType(Types.DECIMAL, "decimal");
        registerColumnType(Types.CHAR, "char");
        registerColumnType(Types.VARCHAR, "varchar");
        registerColumnType(Types.LONGVARCHAR, "longvarchar");
        registerColumnType(Types.DATE, "date");
        registerColumnType(Types.TIME, "time");
        registerColumnType(Types.TIMESTAMP, "timestamp");
        registerColumnType(Types.BINARY, "blob");
        registerColumnType(Types.VARBINARY, "blob");
        registerColumnType(Types.LONGVARBINARY, "blob");
        // registerColumnType(Types.NULL, "null");
        registerColumnType(Types.BLOB, "blob");
        registerColumnType(Types.CLOB, "clob");
        registerColumnType(Types.BOOLEAN, "integer");

        registerFunction( "concat", new VarArgsSQLFunction(StringType.INSTANCE, "", "||", "") );
        registerFunction( "mod", new SQLFunctionTemplate( StringType.INSTANCE, "?1 % ?2" ) );
        registerFunction( "substr", new StandardSQLFunction("substr", StringType.INSTANCE) );
        registerFunction( "substring", new StandardSQLFunction( "substr", StringType.INSTANCE) );
    }

    public boolean supportsIdentityColumns() {
        return true;
    }

  /*
  public boolean supportsInsertSelectIdentity() {
    return true; // As specify in NHibernate dialect
  }
  */

    public boolean hasDataTypeInIdentityColumn() {
        return false; // As specify in NHibernate dialect
    }

  /*
  public String appendIdentitySelectToInsert(String insertString) {
    return new StringBuffer(insertString.length()+30). // As specify in NHibernate dialect
      append(insertString).
      append("; ").append(getIdentitySelectString()).
      toString();
  }
  */

    public String getIdentityColumnString() {
        // return "integer primary key autoincrement";
        return "integer";
    }

    public String getIdentitySelectString() {
        return "select last_insert_rowid()";
    }

    public boolean supportsLimit() {
        return true;
    }

    protected String getLimitString(String query, boolean hasOffset) {
        return new StringBuffer(query.length()+20).
                append(query).
                append(hasOffset ? " limit ? offset ?" : " limit ?").
                toString();
    }

    public boolean supportsTemporaryTables() {
        return true;
    }

    public String getCreateTemporaryTableString() {
        return "create temporary table if not exists";
    }

    public boolean dropTemporaryTableAfterUse() {
        return false;
    }

    public boolean supportsCurrentTimestampSelection() {
        return true;
    }

    public boolean isCurrentTimestampSelectStringCallable() {
        return false;
    }

    public String getCurrentTimestampSelectString() {
        return "select current_timestamp";
    }

    public boolean supportsUnionAll() {
        return true;
    }

    public boolean hasAlterTable() {
        return false; // As specify in NHibernate dialect
    }

    public boolean dropConstraints() {
        return false;
    }

    public String getAddColumnString() {
        return "add column";
    }

    public String getForUpdateString() {
        return "";
    }

    public boolean supportsOuterJoinForUpdate() {
        return false;
    }

    public String getDropForeignKeyString() {
        throw new UnsupportedOperationException("No drop foreign key syntax supported by SQLiteDialect");
    }

    public String getAddForeignKeyConstraintString(String constraintName,
                                                   String[] foreignKey, String referencedTable, String[] primaryKey,
                                                   boolean referencesPrimaryKey) {
        throw new UnsupportedOperationException("No add foreign key syntax supported by SQLiteDialect");
    }

    public String getAddPrimaryKeyConstraintString(String constraintName) {
        throw new UnsupportedOperationException("No add primary key syntax supported by SQLiteDialect");
    }

    public boolean supportsIfExistsBeforeTableName() {
        return true;
    }

    public boolean supportsCascadeDelete() {
        return false;
    }
}

4、定义用户实体类

/**
 * 用户信息实体
 * author: zuo
 * date: 2017/12/7 16:51
 */

public class UserBean {
    public int userId;  //用户编号
    public String userName; //用户名称
    public String loginName; //登录名
    public String password; //密码
    public String org; //部门名称
    public String group; //班组类别
    public String groupName; //班组名称

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getOrg() {
        return org;
    }

    public void setOrg(String org) {
        this.org = org;
    }

    public String getGroup() {
        return group;
    }

    public void setGroup(String group) {
        this.group = group;
    }

    public String getGroupName() {
        return groupName;
    }

    public void setGroupName(String groupName) {
        this.groupName = groupName;
    }
}

5、定义Dao

/**
 * 用户表查询
 *
 * @author zuo
 * @date 2018/7/29 19:48
 */
@Mapper
@Component
public interface UserDao {
    UserBean findUser(UserBean userBean);
}

6、接口查询

/**
 * Spring Boot demo案例
 *
 * @author zuo
 * @date 2018/7/29 12:56
 */
@Controller
@ResponseBody
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserDao userDao;

    @RequestMapping("/login")
    @ResponseBody
    public MsgBean login(HttpServletRequest request, UserBean userBean) {
        List<UserBean> list = new ArrayList<>();
        UserBean user = userDao.findUser(userBean);
        MsgBean msgBean = new MsgBean();
        if (user != null) {
            list.add(user);
            msgBean.setCode(BaseConfig.SUCCESSCODE);
            msgBean.setMsg(BaseConfig.SUCCESSMSG);
            msgBean.setData(user);
        } else {
            msgBean.setCode(BaseConfig.ERRRORCODE);
            msgBean.setMsg(BaseConfig.ERRRORMSG);
        }
        return msgBean;
    }
}

7、基础配置文件

  • 公用的状态码等属性
/**
 * 定义一些公用属性
 *
 * @author zuo
 * @date 2018/7/29 21:12
 */
public interface BaseConfig {
    //请求成功
    int SUCCESSCODE = 1;
    String SUCCESSMSG = "请求成功";
    //请求失败
    int ERRRORCODE = -1;
    String ERRRORMSG = "请求失败";

}
  • 公用的接口数据返回类
/**
 * 公用的接口请求返回类
 *
 * @author zuo
 * @date 2018/7/29 21:08
 */
public class MsgBean {
    private int code;
    private String msg;
    private Object data;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

接口请求

接口请求
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容