在IDEA中使用SpringBoot创建第一个SSM程序(数据库使用postgresql,jdk版本为11)

一、写在前面

对于我而言,在此之前没接触过SpringBoot,也从来没用IDEA写过东西,没用过postgresql,也没用过MyBatis,本来是想自己试着用SSM写一个登录Demo的,但是Spring的注解注入也没怎么接触过,也从来没有自己从头到尾用过SpringMVC,实习的时候接触过一点,但都是在别人代码的基础上进行开发。在这么多新的东西面前,报错变得很难解决,因为我没办法确定是IDEA配置问题还是某段代码问题,甚至连怎么在IDEA中进行打包部署都不清楚,所以最后我选择了在看文字材料速成的同时看一个视频,先简单地跟着视频敲。

现在只是跟着视频对整个框架有个大概的了解,很多知识点也并不是十分清楚为什么,之后有空的话我也会去阅读一下官方文档,并整理成博客。写这篇博客是因为我喜欢看文字多于视频,并且也会对一些自己需要的内容进行补充,希望也能给和我一样新入坑的人带来一点帮助。

最后,放上我参考的视频链接:SpringBoot构建电商基础秒杀项目

二、安装IDEA并配置Maven

在开发前,希望你已经完成了对IDEA的Maven配置,如果没有,请参考使用intellij idea创建maven项目,在这篇博客里也有链接指向如何安装IDEA,因此在本文中我不再赘述如何安装IDEA并进行Maven的配置。

三、SpringBoot是做什么的?

1、简化Maven依赖配置
我们只要在创建SpringBoot项目时勾选自己想要集成的例如MyBatis,SpringBoot就会自动在pom文件中引入对应的依赖包,且会自动选择相应的版本。

2、简化被整合的框架配置(自动配置Spring)
Spring Boot 会根据在类路径中的 jar 包、类,为 jar 包里的类自动配置 Bean,这样会极大地减少我们要使用的配置。如果对Spring自动装配的bean不满意也可以通过复制代码段到自己的内容中并添加@Bean注解使其变成可控代码(可进行修改),此时自动装配不会生效。

3、简化部署运维
SpringBoot内嵌Tomcat,运行即可启动,并默认将项目打包成可执行jar,无需对项目进行local server的配置再以war包形式部署。且SpringBoot的配置项集中在application.properties中,大大减少了xml配置。提供了各种endpoint以便运维。

四、创建一个SpringBoot工程

1、通过IDEA的SpringInitializr创建

左上角 File-New-Project-Spring Initializr
Spring Initializr
Next->名称啥的自己设一下->Next->选择需要的依赖包,这里暂时是选择了Spring Web相关、mybatis相关以及postgresql相关包。
在这里插入图片描述其他没什么特别的,项目建成之后目录结构是这样的:
初始目录结构
这里会有一个叫xxxApplication的启动类,然后pom.xml里会有刚刚设置过的相关依赖包,不需要自己再引入,同时resources下会有一个application.properties,此时它是空的。到这里一个SpringBoot项目就这么简单地创建好了,非常方便,当然现在还是不能启动的,这个后面再说。

注:如果生成的pom文件有部分依赖为红色,那么先reload project(即reimport),如果还没有解决则检查自己的maven设置,无误则可能是镜像设置问题,可以多配几个国内镜像试试,可以参考IDEA中部分依赖包下载失败 提示cannot resolve plugin xxx

2、通过官网创建

官网网址:https://start.spring.io ->点击此处链接到官网

在serch for dependency中输入想搜索的依赖包并选择,选择完成后点击下方的绿色按钮Generate Project即可创建一个springboot工程,并且自动下载到本地,接下来直接在idea或者eclipse打开该工程就可以了。

五、安装并创建PostgreSQL数据库

1、安装地址

PostgreSQL下载地址
安装比较容易,不多说了,但是记得顺便把pgAdmin装一下。

2、建表

pgAdmin这个东西呢,我也是第一次接触,但是现在就是想简单地建个表,就随便建了一个。结构如下图哈,其中postgres是数据库名,在Tables处右键-create-table,在弹出来的框里填写表名然后增加column的name和datatype就可以了。
在这里插入图片描述
在这里我新建了一张叫my_user的表,两列为username和password,数据类型都为text。

3、插入数据及设置主键

接下来就是插入数据并设置username为主键。
右键表名->Query Tool,在右边的Query Editor中编写SQL语句并执行就可以了(当然直接右键-查询,在查询结果处点击也可以方便地插入数据),这里我们简单地插入一条数据,SQL语句如下

INSERT INTO my_user
VALUES('yogi','123456')

主键可以不需要写sql,直接在Constaints上右键选择Primary Key,输入key的名字并选择column即可。
在这里插入图片描述
数据库创建完毕,但是有一个注意事项

4、注意事项!非常重要!

PostgreSQL本身大小写不敏感,但是在这里【非常不推荐】使用大写字母。首先带有大写字母的表的新建和查询时表名都必须带双引号,不然会报【error】postgresql relation does not exist。也即你可以SELECT * FROM "MyUser",但是不可以SELECT * FROM MyUser。如果仅仅是这样也还是没有问题的,但是如果有大写字母,在后面使用Mybatis Generator生成DO类的时候会报错:Table configuration with catalog null, schema public, and table xxx did not resolve to any tables.就是因为有大写字母引起的,我尝试了在my-generator.xml配置中设置表名为tableName=""MyUser""(我刚开始创建的表名叫MyUser),引入了"的转义字符,但是并没有效果,最后还是新建了一张叫做my_user的表。

六、编写application.properties,启动项目

项目刚刚创建好的时候是不能运行的,运行会报错:Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.

这个错误就是由于没有编写application.properties,找不到数据库的URL。
配置如下,其中Tomcat端口也可以不改,那就是8080,我是为了防止端口冲突,就随便改了一个。url在数据为postgresql时是jdbc:postgresql://localhost:5432/[数据库名]
后面是用户名和密码,我直接postgres登录的。

#更改Tomcat端口
server.port=8087

spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=123456

这个时候已经可以成功启动项目了,但是由于啥都还没写,所以访问localhost:8087(注意自己的端口号!)时web页面上显示的会是Whitelabel Error Page。

我们对生成的ExampleApplication 文件稍微做一点修改
生成的文件如下:

package com.yogi.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(ExampleApplication.class, args);
    }

}

加入注释@RestController,以及根目录下的方法home,重新启动后再次进入就可以看到Hello World了。

package com.yogi.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class ExampleApplication {

    @RequestMapping("/")
    public String home(){
        return "Hello,world!";
    }

    public static void main(String[] args) {
        SpringApplication.run(ExampleApplication.class, args);
    }

}

七、Mybatis Generator工具

Mybatis generator工具可以由数据库表自动生成相应的DO类、Dao类和Mapper文件。

1、引入依赖

原有自动生成的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.yogi</groupId>
    <artifactId>example</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>example</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</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>
        </plugins>
    </build>

</project>

<plugins>标签下添加新的<plugin>,添加完之后的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.yogi</groupId>
    <artifactId>example</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>example</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</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.5</version>
                <dependencies>
                    <dependency>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-core</artifactId>
                        <version>1.3.5</version>
                    </dependency>
                    <dependency>
                        <groupId>org.postgresql</groupId>
                        <artifactId>postgresql</artifactId>
                        <version>9.4-1201-jdbc4</version>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <id>mybatis generator</id>
                        <phase>package</phase>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!-- 允许移动生成的文件 -->
                    <verbose>true</verbose>
                    <configurationFile>
                        src/main/resources/mybatis-generator.xml
                    </configurationFile>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2、mybatis-generator.xml

在resources目录下创建mybatis-generator.xml,这个文件在官网有示例,copy下来改一改就行。
要改的就是数据库链接地址(如果数据库不同),URL记得换成自己的数据库名,然后用户名和密码也要改。以及后面的targetPackage和targetProject。注意如果targetPackage写的包要存在,如果没有的话先新建包,再把对应的包写上去。在这里我新建了dataobject、mapping以及dao包。
table部分每一张表都要写一个table标签,这里只建了一张表因此就一个示例。

<?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>

    <context id="DB2Tables" targetRuntime="MyBatis3">
        <!-- 数据库链接地址及账号密码 -->
        <jdbcConnection driverClass="org.postgresql.Driver"
                        connectionURL="jdbc:postgresql://localhost:5432/postgres"
                        userId="postgres"
                        password="123456">
        </jdbcConnection>

        <!-- 生成Model类(即数据表对应的DTO类)的存放位置 -->
        <javaModelGenerator targetPackage="com.yogi.example.dataobject" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!-- 生成映射文件存放位置 -->
        <sqlMapGenerator targetPackage="mapping"  targetProject="src/main/resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <!-- 生成Dao类存放位置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.yogi.example.dao"  targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

        <!-- 生成对应表及类名 这个是会生成Example的,有一些复杂查询,但很多时候并不需要 -->
        <!--
        <table tableName="my_user" domainObjectName="MyUserDO"></table>
        -->

        <!-- 生成对应表及类名 但不生成复杂查询 -->
        <table tableName="my_user" domainObjectName="MyUserDO" enableCountByExample="false"
               enableUpdateByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" selectByExampleQueryId="false"></table>

    </context>
</generatorConfiguration>

此时的目录结构:
在这里插入图片描述
注意添加了mapping之后需要在application.properties中添加:

mybatis.mapper-locations=classpath*:mapping/*.xml

3、自动生成

左上选项 Run->Edit configurations
跳出框框后点击+,选择Maven
在这里插入图片描述输入mybatis-generator:generate,完成。
在这里插入图片描述
点击run就可以看到生成的文件了。

八、调用自动生成的方法

在这里我们只是简单地看一下mybatis是否集成成功,所以直接修改ExampleApplication的代码进行调用,未分层,代码如下:

package com.yogi.example;

import com.yogi.example.dao.MyUserDOMapper;
import com.yogi.example.dataobject.MyUserDO;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication(scanBasePackages = {"com.yogi.example"})
@RestController
@MapperScan("com.yogi.example.dao")
public class ExampleApplication {

    @Autowired
    private MyUserDOMapper userDOMapper;

    @RequestMapping("/")
    public String home(){
        MyUserDO userDO = userDOMapper.selectByPrimaryKey("yogi");
        if(userDO == null){
            return "用户不存在";
        }else{
            return userDO.getPassword();
        }
    }

    public static void main(String[] args) {
        SpringApplication.run(ExampleApplication.class, args);
    }

}

就可以跑程序啦~run的时候记得run application 而不是run刚刚配置过得Maven命令
再次访问http://localhost:8087/,显示123456,成功。

九、使用SpringMVC方式

1、目录结构

设置controller层和service层,其中controller放的就相当于Struts2的Action,应该不难理解。
在这里插入图片描述

2、UserService和UserServiceImpl

其实也就是简单地调用一下userDOMapper而已,没什么两样,但是要给这个类加上@Service注解,/不过这里是为了简化直接把userDO返回去了,实际上在实际应用中很少会有这么做的时候,因dataobject只是对数据库的一个映射,而不代表真正的模型,比如和用户相关的信息分散在两张表中,那么真正的模型需要建一个UserModel类,把所有相关信息都放进来。

UserServiceImpl.java:

package com.yogi.example.service.impl;

import com.yogi.example.dao.MyUserDOMapper;
import com.yogi.example.dataobject.MyUserDO;
import com.yogi.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private MyUserDOMapper userDOMapper;

    @Override
    public MyUserDO getUserByName(String username) {
        
        MyUserDO userDO = userDOMapper.selectByPrimaryKey(username);
        return userDO;
    }
}

UserService:

package com.yogi.example.service;

import com.yogi.example.dataobject.MyUserDO;

public interface UserService {

    MyUserDO getUserByName(String username);
}

3、UserController.java

相当于Struts2的action,需要加注解@Controller
这里其实在实际应用中也并不能直接返回MyUserDO,因为可能有部分内容不适合或者不需要给到前端,比如密码,这时候就要创建VO类(viewobject)去掉这部分属性,再返回VO类即可。但是这里也为了简化,我们就直接返回了。

package com.yogi.example.controller;

import com.yogi.example.dataobject.MyUserDO;
import com.yogi.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/get")
    @ResponseBody
    public MyUserDO getUser(@RequestParam(name="username") String username){
        MyUserDO userDO = userService.getUserByName(username);
        return userDO;
    }
}

4、启动项目查看结果

到这里一个简单的demo就完成啦。

启动项目后在浏览器地址栏输入http://localhost:8080/user/get?username=yogi
显示{“username”:“yogi”,“password”:“123456”} 则说明成功~

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值