spring boot

Posted 静静的仰望天空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot相关的知识,希望对你有一定的参考价值。

spring boot

1、idea新建项目

1.选择Spring Initializr 项目

注意不要选Default,要选Custom,然后把右侧的网址改为阿里云的下载地址(默认为国外的下载地址,下载比较慢)

然后下一步

修改项目包名和项目名

选择自己要使用的工具,在此页面选中,新建完工程就会自动导入相应的包

此时会使用到:开发工具中的Lombok

​ Web中的Spring Web

​ 关系型数据库中的MyBatis Framework和mysql Driver



然后下一步,此时修改项目名,这个在上边修改项目包名的时候已经修改过,直接finish即可
进入后选择自动导包

这个位置为自动导入的包,如果有报红的,到之前maven设置的专门存放包的文件夹中把相应的文件夹删除(箭头所指的冒号前为相应的目录),然后点击刷新即可

2、配置pom.xml文件

Spring-boot的版本号默认为2.3.7,版本相对较高,改为2.2.6,这个版本使用较多

spring webmvc,没有写版本号,随spring-boot版本变化而变化

spring-boot的依赖工程包中可以查看版本号(ctrl+鼠标左键),spring-boot中拥有的所有工具都在这,需要使用哪个依赖就在上方的中导入,因为之前在选择工具的时候选择了4项,所以此时除默认外就只有这4个依赖。【如果还有其他的工具集可以在下方的中导入,然后在上方导入依赖】

mybatis和spring-boot的整合包

数据库,默认版本为8.0的数据库,我的数据库版本为5.1.38,此时不太合理,将数据库版本号改为5.1.38


lombok选择的选项可以删除,使用默认的lombok即可

spring-boot的测试工具,一般放着不动就可以,也可以删除(因为junit与spring web存在冲突,两个只能同一个,所以直接将junit排除)

3、配置application文件,将后缀名properties改为yml


首先给工程起名字

注意格式(前方的缩进,也就是空格也不要改变,此时就相当于spring包下的application包下的name属性,工程名可以自己起,尽量与idea中设置的工程名相同)

设置tomcat启动端口
默认为8080,此时改为9999(因为8080端口可能会被占用)


设置虚拟机地址

然后回车,选中com.mysql.jdbc.Driver,再回车

配置自己的url,username,passwoed
url: jdbc:mysql://192.168.201.150:3306/lianxi
username和password写虚拟机数据的账号和密码,之前设置的

【注意是spring-datasource-***,不要选错了】
补充:

url:统一资源定位符(网络中某个资源的绝对路径)
  例
    https://www.baidu.com/ 这就是URL
    url包括哪几部分?
      协议
      IP
      PORT
      资源名

    http://182.61.200.7:80/index.html
      http:// 通信协议(通信之前就提前定好的数据传送格式)
      182.61.200.7 服务器的IP地址
      80 服务器上软件的端口
      index.html 是服务器上某个资源名

    jdbc:mysql://localhost:3306/bankdb
      jdbc:mysql://  协议
      localhost   IP地址,localhost和127.0.0.1都是本机ip地址
      3306   mysql数据库端口号
      bankdb   具体的数据库实例名

调用实体类的配置文件(xml文件一般为写完java类后写)

mapper - locations 表示:读取路径为mapper包下的所有xml文件

config - location 表示:mybatis.cfg.xml为给实体类起别名的xml文件

yml文件写完后代码

spring:
  application:
    name: myspb01
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.201.150:3306/mydemo
    username: root
    password: ****
server:
  port: 9999
mybatis:
  mapper-locations: classpath:mapper/*.xml
  config-location: classpath:mybatis.cfg.xml

4、写java类

控制层(controller)–>服务层(业务逻辑层)(service)–>数据链路层(dao)

工程建完之后会自动生成一个java类,自己写的java类必须在这个java类的下面一层

4.1 写实体类

实体类包名一般为domain或者entity/model,类名与数据库表名相对应(首字母大写),类中属性与数据库表中的字段对应

Userinfos类

package com.kgc.myspb01.domain;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;
import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Userinfos 
    private long userid;
    private String username;
    private Date birthday;
    private List<Scores> scores;

Scores类

package com.kgc.myspb01.domain;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Scores 
    private long scid;
    private long userid;
    private long score;

4.2 写实体类的接口,接口中为操作数据库的方法

接口的包名一般为dao或者mapper,接口名实体类名加dao或mapper,dao的话全部大写,mapper的话首字母大写

UserinfosMapper

package com.kgc.myspb01.dao;

import com.kgc.myspb01.domain.Userinfos;

import java.util.List;

public interface UserinfosMapper 
    public void addUser(Userinfos user);
    public void delUser(long userid);
    public List<Userinfos> findUserByCondit(Userinfos user);
//    public List<Userinfos> findAllUser();

ScoresMapper (ScoresDAO)

package com.kgc.myspb01.dao;

import com.kgc.myspb01.domain.Scores;

import java.util.List;

public interface ScoresMapper 
    public List<Scores> findScoresByUserid(long userid);
    public void deleteScoreByUserid(long userid);
    public void modfiyScore(Scores score);
    public void addScore(Scores score);

4.3 写xml文件

4.3.1 在resources下创建mybatis.cfg.xml文件,用于给实体类起别名
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC
        "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--给自己的实体类起别名-->
<configuration>
    <typeAliases>
        <typeAlias type="com.kgc.myspb01.domain.Userinfos" 
                   alias="user"></typeAlias>
        <typeAlias type="com.kgc.myspb01.domain.Scores" 
                   alias="score"></typeAlias>
    </typeAliases>
</configuration>
4.3.2 在resources下创建mapper包,用于存放实体类的xml文件,实体类的xml文件用于写sql语句


注意:实体类的xml文件需要把表头改一下(图片遮挡的部位可以看下方代码)

scores.xml

<?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">
<!--namespace为dao包下的接口(带包名)-->
<mapper namespace="com.kgc.myspb01.dao.ScoresMapper">
    <!--mapper中写sql语句:增删改查insert,delete,update,select-->
    <!--id=方法名,parameterType=参数类型,resultType=返回值类型(score为给实体类起的别名)-->
    <select id="findScoresByUserid" parameterType="long" 
            resultType="score">
        select * from scores where userid=#userid
    </select>
    <insert id="addScore" parameterType="score">
        insert into scores(userid,score) values(#userid,#
        score)
    </insert>
    <delete id="deleteScoreByUserid" parameterType="long">
        delete from scores where userid=#userid
    </delete>
    <update id="modfiyScore" parameterType="score">
        update scores set score=#score where userid=#userid
    </update>
</mapper>

userinfos.xml

<?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.kgc.myspb01.dao.UserinfosMapper">
    <!--  resultMap  通常用于关联查询-->
    <!--把查询的数据库表中的列(column="userid")往user类中的属性          
       (property="userid")上映射-->
    <!--  collection 一对多
          property 查询出成绩的结果存放在哪个属性中
          column  用什么列传递给成绩查询做参数
          select 成绩查询的方法名    -->
    <resultMap id="user_score" type="user">
        <result property="userid" column="userid"></result>
        <collection property="scores" column="userid"            select="com.kgc.myspb01.dao.ScoresMapper.findScoresByUserid">
        </collection>
    </resultMap>
    <!--useGeneratedKeys="true"  改为true,表示如果插入的表userid以自       增列为主键,则允许 JDBC 自动生成主键,并可将自动生成的主键userid返回
            keyProperty="userid"
    注意:useGeneratedKeys参数只针对insert语句生效(通常用于存在主外键关          系的表中)-->
    <insert id="addUser" parameterType="user"               
            useGeneratedKeys="true"
            keyProperty="userid">
        insert into userinfos(username,birthday) values(#
        username,#birthday)
    </insert>
    <delete id="delUser" parameterType="long">
        delete from userinfos where userid=#userid
    </delete>
    <!--动态sql  
      <where>的作用相当于where条件,只不过里边加了一个判断
      如果条件成立的话,才会加上<if>中的语句-->
    <select id="findUserByCondit" parameterType="user" 
            resultMap="user_score">
        select * from userinfos
        <where>
            <if test="userid!=0">
                userid=#userid
            </if>
            <if test="username!=null">
                and username=#username
            </if>
            <if test="birthday!=null">
                and date_format(birthday,'%Y-%m-
                %d')=date_format(#birthday,'%Y-%m-%d')
            </if>
        </where>
    </select>
</mapper>

4.4 写服务类

服务类的包名一般为service

package com.kgc.myspb01.services;

import com.kgc.myspb01.domain.Scores;
import com.kgc.myspb01.domain.Userinfos;

import java.util.List;

public interface UserinfosService 
    public void addUserinfo(Userinfos user, Scores scores);
    public void delUserById(long userid);
    public void modifyScores(Scores score);
    public List<Userinfos> searchUser(Userinfos user);

在service包下新建impl包,用于存放服务接口的实现类

package com.kgc.myspb01.services.impl;

import com.kgc.myspb01.dao.ScoresMapper;
import com.kgc.myspb01.dao.UserinfosMapper;
import com.kgc.myspb01.domain.Scores;
import com.kgc.myspb01.domain.Userinfos;
import com.kgc.myspb01.services.UserinfosService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

//此时service接口只有一个实现类,若有多个实现类,可以起别名@service(value = "userService")
@Service  //告诉spring自动new当前类,方便其他类的调用
@Transactional  //自动提交事务
public class UserinfosServiceImpl implements UserinfosService 
    //告诉spring自动去找注解标注的接口的实现类,然后new出来,如果没找到会报空指针异常
    @Resource        
    private UserinfosMapper userinfosMapper;
    @Resource
    private ScoresMapper scoresMapper;

    @Override
    public void addUserinfo(Userinfos user, Scores scores) 
        userinfosMapper.addUser(user);
        //把主表中的主键拿出来填充到外表的外键列
        scores.setUserid(user.getUserid());
        scoresMapper.addScore(scores);
    

    @Override
    public void delUserById(long userid) 
        //删除时注意先删从表,再删主表
        scoresMapper.deleteScoreByUserid(userid);
        userinfosMapper.delUser(userid);
    

    @Override
    public void modifyScores(Scores score) 
        scoresMapper.modfiyScore(score);
    

    @Override
    public List<Userinfos> searchUser(Userinfos user) 
        return userinfosMapper.findUserByCondit(user);
    

4.7 写控制器类controller,用于接收和返回数据

package com.kgc.myspb01.controller;

import com.kgc.myspb01.domain.Scores;
import com.kgc.myspb01.domain.Userinfos;
import com.kgc.myspb01.services.UserinfosService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;

@RestController  //告诉spring这是一个控制器,并让spring给new出来
public class InitCtrl 
    //@Resource(name = "userService")  指定调用下方接口的哪个实现类,        userService为实现类实现接口时起的别名
    @Resource
    private UserinfosService userinfosService;

    //给自己的servlet起别名(在tomcat中使用)
    @RequestMapping("/add")
    public String add(String username,String birthday,long score)
        try 
            SimpleDateFormat sdf = new SimpleDateFormat(
                "yyyy-MM-dd");
            Userinfos us = Userinfos.builder().username(username)
                    .birthday(sdf.parse(birthday)).build();
            Scores scores = 
                Scores.builder().score(score).build();
            userinfosService.addUserinfo(us,scores);
         catch (ParseException e) 
            e.printStackTrace();
        
        return "ok";
    
    @RequestMapping("/del")
    public String del(long userid)
        userinfosService.delUserById(userid);
        return "ok";
    
    @RequestMapping("/update")
    public String update(long userid,long score)
        Scores scores = 
            Scores.builder().userid(userid).score(score).build();
        userinfosService.modifyScores(scores);
        return "ok";
    
    @RequestMapping("/find")
    public List<Userinfos> find(
        //在传参的时候加上注解@RequestParam,表示当前参数是必须的吗,false表示不是必须的,可有可无,如果不传这个值,则默认值为0,下方的两个参数默认值为空
            @RequestParam(required = false,defaultValue = "0") 
        long userid,
            @RequestParam(required = false,defaultValue = "") 
        String username,
            @RequestParam(required = false,defaultValue = "") 
        String birthday
    )
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");<

Spring Boot 学习例子

01.spring-boot-restfulservice

02.spring-boot-consumer

03.spring-boot-upload

04.spring-boot-validatingform

05.spring-boot-jdbc

06.spring-boot-transactions

07.spring-boot-securing

08.spring-boot-ldap

09.spring-boot-configuration

10.spring-boot-batchservice

11.spring-boot-jquery

12.spring-boot-mustache

13.spring-boot-jsp

14.spring-boot-securing-database

持续更新中...,敬请关注。

以上是关于spring boot的主要内容,如果未能解决你的问题,请参考以下文章

Spring BootSpring Boot项目部署到外部Tomcat容器

Spring BootSpring Boot之使用 Spring Data Elasticsearch 整合elasticsearch

Spring BootSpring Boot之自定义拦截器

spring bootspring cloud下spring boot微服务启动没有报错,但是访问访问不到

Spring BootSpring Boot 日志文件详解

Spring BootSpring Boot 日志文件详解