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");
        Userinfos user = new Userinfos();
        user.setUserid(userid);
        if(!username.trim().equals("")){
            user.setUsername(username);
        }
        try {
            if(!birthday.trim().equals("")){
                user.setBirthday(sdf.parse(birthday));
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return userinfosService.searchUser(user);
    }
}
4.8 找到自动生成的java类
package com.kgc.myspb01;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
//dao包中的实体类接口并没有实现类,此注解为通知spring调用第三方工具来实现dao包中的接口,这样spring中就有dao包中所有接口的匿名类
@MapperScan("com.kgc.myspb01.dao")
public class Myspb01Application {

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

写完后直接右键单击运行,进入网页测试,输入localhost:9999/find?userid=122&username=zz

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐