基於springboot的ssm


 

 

 

參考該網址成功搭建:

https://blog.csdn.net/liboyang71/article/details/73459909

 

目前有幾個問題:

1、我使用application.yml配置參數是不同的?

yml:

mybatis:
basepackage: com.bonc.core.mapper
xmlLocation: classpath:mapper/**/*.xml
properties:
mybatis.mapper-locations=classpath*:mapper/*.xml
#起別名。可省略寫mybatis的xml中的resultType的全路徑
mybatis.type-aliases-package=com.example.demo.domain
2、數據庫配置
https://blog.csdn.net/cocoaxian/article/details/72235495

由於mysql版本過高創建連接的時候會出現如下報告

解決辦法:在mysql連接上加上&useSSL=true

如下:jdbc:mysql:///:3366:test?useUnicode=true&characterEncoding=utf-8&useSSL=true

ssl是一種加密技術在客戶端連接數據庫的中間做了加密,TCP/IP層中。

我的數據庫版本為:5.7

3、查詢的時候<select>有無parameterType="String"都不影響嗎? 

不影響,resultType必須要有。

4、在mapper的方法里使用@Param("name")的作用是?

當方法的參數為一個時可以省略,但是在xml中必須使用#{name}形式。只有加了@Param("name")注解才可以使用${}

5、為什么使用resultMap

resultMap詳解https://blog.csdn.net/bear_wr/article/details/52383840

https://www.cnblogs.com/kenhome/p/7764398.html

通過resultMap來接受結果集,resultMap的type可以直接寫為實體類名(這里說要配置,但是我還不知道在哪里配置,我直接寫沒有錯)

引用resultMap作為返回集,一定要將resultType改為resultMap.(這個錯的很常見,一開始測試,改了還報找不到resultMap,后來發現我另一個修改測試還寫了,導致一直出錯)

resultMap返回的結果集實際上就是實體類對象,使用其作為返回的方法可以用實體,list來接受。map不可以。

6.增刪改返回類型,傳入參數可寫可不寫。

int Integer 

7.遇到問題

只要加注解:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})但是,你只要在配置文件配置好數據庫連接參數就好了,這里其實也不需要的。

這里,我的項目用yml,properties都寫了一遍。yml配置的項目出問題到奔潰。最后發現yml文件新建的時候創建到了templates下,以至於報數據庫的相關問題。

還有報這個問題:

我看網上的出這個問題的原因有:

(1)yml注釋使用的是#而不是//,這個我一般用快捷鍵ctrl+/進行注釋,基本不會出現問題

(2)yml配置文件里面有相同的節點。請檢查把對應的節點刪除即可。

(3)我犯得錯誤是最低級的,位置沒有對好。在spring下的節點有的縮進兩格,有的縮進四格。要記得冒號后空一格。

 

自動建表用date

https://blog.csdn.net/u013456370/article/details/52691093

 

搭建環境:java 1.8 

 mysql  5.7.14

IDEA 2017

 

開始搭建:

選擇mysql會直接幫你把相應的依賴添加上。

接下來將層級結構划分好,注意划分的包要和入口類同級。包名小寫,為了規范代碼編寫可以將阿里代碼規范插件添加上(file------Settings-----plugins--------Alibaba  Java   Coding  Guidelines-------Apply),當你右擊類名時可以通過規范檢查代碼規范,當然了,最好把阿里開發手冊看一下。(https://www.cnblogs.com/han-1034683568/p/7680354.html)(https://blog.csdn.net/dalinsi/article/details/78082167)。

目錄說明(摘自公眾號:https://mp.weixin.qq.com/s/ip4esbr5jhpUg7wikgIo9A):

- src
    -main
        -java
            -package
                #主函數,啟動類,運行它如果運行了 Tomcat、Jetty、Undertow 等容器
                -SpringbootApplication    
        -resouces
            #存放靜態資源 js/css/images 等
            - statics
            #存放 html 模板文件
            - templates
            #主要的配置文件,SpringBoot啟動時候會自動加載application.yml/application.properties        
            - application.yml
    #測試文件存放目錄        
    -test
 # pom.xml 文件是Maven構建的基礎,里面包含了我們所依賴JAR和Plugin的信息
- pom

初次新建好的層級目錄為:

 

注意:5個綠框框標記在同一級。紅框內容為我添加的內容。

數據庫新建表:

我的數據庫是study,表名為:user

create table user (
id int(32) primary key auto_increment,
name varchar(20),
sex varchar(2) ,
age int(3) ,
birth date 
)

配置文件:

如果你設置了多個配置文件參考:https://www.cnblogs.com/sweetchildomine/p/6980054.html

 這里為防止出錯,一個配置文件就好,我分別寫下application.properties和application.yml兩種配置文件。配置都相同,配置文件不同。

application.properties:

server.port=8080

#配置mysql
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/study?useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root

#配置Oracle
#spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
#spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
#spring.datasource.username=root
#spring.datasource.password=root

對於mysql配置的spring.datasource.url,如果不加useUnicode=true&characterEncoding=utf-8&useSSL=true,其實主要是SSL的配置。將會報錯:

Tue Jun 19 10:42:01 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

報錯原因為mysql版本過高有了新規定(解決方法的博客:https://blog.csdn.net/cocoaxian/article/details/72235495)

到這里基本就可以了,你可以啟動一下:

tomcat正常啟動就沒問題了。

如果配置為oracle,你要引入依賴:

<dependency>
	<groupId>com.oracle</groupId>
	<artifactId>ojdbc14</artifactId>
	<version>10.2.0.4.0</version>
</dependency>

 application.yml:

server:
  port: 8081
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/study?useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: root

如果你想要同時存在兩個配置文件請參考:https://www.cnblogs.com/sweetchildomine/p/6980054.html

我再啰嗦兩句:其實就是配置文件后面設置一個區分:application-dev.yml或application-prod.yml.

如果你希望dev生效就在配置文件里面配置:

spring:

  profiles:

    active:dev

很節省代碼了。

 開始整合ssm

為支持mybatis,首先在pom.xml文件添加依賴:

        <!--新增所需依賴-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>

首先在配置文件里添加

#配置mybatis
mybatis:
#Mybatis掃描
  mapper-locations: classpath:mapper/*.xml
#起別名。可省略寫mybatis的xml中的resultType的全路徑
  type-aliases-package: com.practice.demo.springboot2ssm.domain

1.寫實體類

由於我想要避免在代碼中寫入太多get,set,toString方法,我在pom.xml引入了lombok

<dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
</dependency>

@Data
public class User {

    private int id;
    private String name;
    private String sex;
    private int age;
    private Date birth;
}

 

 userMapper.xml:

如果這里報http://mybatis.org/dtd/mybatis-3-mapper.dtd網址錯誤,可設置:Fie----settings-----Languages & Frameworks------Schems & DTDs,將該網址添加進去。

<?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標簽開始,由/mapper結束,可以把它想成一個空間,是映射文件
屬性namespace:空間名,主要在代理中使用。這個namespace是唯一的。
這里把mapper標簽和接口聯系在一起了,namespace=寫接口路徑,映射文件要和接口在同一目錄下
 -->
<mapper namespace="com.practice.demo.springboot2ssm.dao.UserMapper">
    <!-- =============映射關系標簽=============
    屬性type:寫po類的包名類名,由於之前定義了po類的別名,這里就寫這個別名
    屬性id:是這個映射標簽的唯一標識
    id標簽是查詢結果集中的唯一標識
    屬性column:查詢出來的列名
    屬性property:是po類里所指定的列名
    通常會在原列名后面加下划線,這是固定的,這里就是id后面_
     -->
    <resultMap type="User" id="BaseResultMap">
        <id column="id" jdbcType="INTEGER" property="id"/>
        <result column="name" jdbcType="VARCHAR" property="name"/>
        <result column="sex" jdbcType="VARCHAR" property="sex"/>
        <result column="age" jdbcType="INTEGER" property="age"/>
        <result column="birth" jdbcType="DATE" property="birth"/>
    </resultMap>

    <!-- ==================定義sql片段==============
    sql:是sql片段標簽屬性id是該片段的唯一標識 -->
    <sql id="ry">
        id,name,sex,age,birth
    </sql>
    <!-- 增刪改查標簽里的id:一定要和接口里對應的方法名一致,
         resultMap輸出類型里寫映射標簽里的id
         parameterType:輸入類型,規范輸入數據類型,指明查詢時使用的參數類型-->
    <!--插入操作-->
    <insert id="insertUser" parameterType="map">
        INSERT INTO user (<include refid="ry"/>)
        VALUES(#{id},#{name},#{sex},#{age},#{birth})
    </insert>

    <!--修改操作-->
    <update id="updateUser" parameterType="map">
        UPDATE user
        SET name=#{name},sex=#{sex},age=#{age},birth=#{birth}
        WHERE id=#{id}
    </update>
    <!--刪除操作-->
    <delete id="deleteUser" parameterType="int">
        DELETE FROM USER where id = #{id}
    </delete>

    <!--查找操作-->
    <select id="selectUser" parameterType="int" resultMap="BaseResultMap">
        select <include refid="ry"/> from user
    </select>
</mapper>

 

UseMapper:

package com.practice.demo.springboot2ssm.dao;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

@Mapper
@Repository
public interface UserMapper {

    int insertUser(Map<String,Object> map);

    int updateUser(Map<String,Object> map);

    /**
     * delete user
     * @param id
     * @return int
     */
    int deleteUser(@Param("id") int id );

    List selectUser();
}

 @Mapper主要作用是掃描包,還可以在主程序下加入@MapperScan("com.practice.demo.springboot2ssm.dao")

UserServoce:

package com.practice.demo.springboot2ssm.service;


import com.github.pagehelper.PageHelper;
import com.practice.demo.springboot2ssm.dao.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

/**
 * @program: springboot2ssm
 * @description:
 * @author: 
 * @create: 2018/06/19
 */
@Service
//該屬性用於設置需要進行回滾的異常類名稱數組,
// 當方法中拋出指定異常名稱數組中的異常時,則進行事務回滾
@Transactional(rollbackFor =
        {RuntimeException.class,Exception.class})
public class UserService {

    @Autowired
    UserMapper userMapper;

    public int insertUser(Map<String, Object> map) {
        return userMapper.insertUser(map);
    }

    public int update(Map<String, Object> map) {
        return userMapper.updateUser(map);
    }

    public int deleteUser(int id) {
        return userMapper.deleteUser(id);
    }

    public List selectUser(int pageNum,int pageSize){
//       使用分頁插件進行分頁
        PageHelper.startPage(pageNum,pageSize);

        return userMapper.selectUser();
    }

}

 

UserController:

package com.practice.demo.springboot2ssm.controller;

import com.practice.demo.springboot2ssm.msg.ObjectRestResponse;
import com.practice.demo.springboot2ssm.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * @program: springboot2ssm
 * @description:
 * @author: 
 * @create: 2018/06/19
 */
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    UserService userService;

    /**
     * 插入人員信息
     * @param map {"id":"X","name":"XX","sex":"X","age":"XX","birth":"XX"}
     * @return
     */
    @PostMapping("/insert")
    public ObjectRestResponse insertUser(@RequestBody Map<String,Object> map) {
        return new ObjectRestResponse().rel(true).data(userService.insertUser(map)).msg("插入成功");

    }
    /**
     * 修改人員信息
     * @param map {"id":"X","name":"XX","sex":"X","age":"XX","birth":"XX"}
     * @return
     */
    @PostMapping("/update")
    public int updateUser(@RequestBody Map<String,Object> map){
        return userService.update(map);
    }

    /**
     * 刪除人員信息
     * @param id  localhost:8081/user/delete/2
     * @return
     */
    @PostMapping("/delete/{id}")
    public int deleteUser(@PathVariable("id") int id ){
        return userService.deleteUser(id);

    }

    /**
     * 查詢人員信息
     * @return
     */
    @GetMapping("/select")
    public List selectUser(int pageNum,int pageSize){
       return userService.selectUser(pageNum,pageSize);
    }
}

插入測試:

建表使用的是自增長,如果id為0或者null,會自動插入id

分裝結果集:

新建一個包分類:

這個基本類我寫的有點問題,感興趣的可以了解一下封裝結果集。

package com.practice.demo.springboot2ssm.msg;

import lombok.Data;

/**
 * @program: springboot2ssm
 * @description:
 * @author:
 * @create: 2018/06/19
 */
@Data
public class BaseResponse {

    private int status = 200;
    private String message;

    public BaseResponse(int status) {
        this.status = status;
    }

    public BaseResponse(){};
}
package com.practice.demo.springboot2ssm.msg;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;

/**
 * @program: springboot2ssm
 * @description:
 * @author:
 * @create: 2018/06/19
 */
@Setter
@Getter
public class ObjectRestResponse<T> extends BaseResponse {

    private String msg;
    private boolean rel;
    private T data;


    public ObjectRestResponse rel(boolean rel){
        this.setRel(rel);
        return this;
    }

    public ObjectRestResponse msg(String msg){
        this.msg = msg;
        return this;
    }

    public ObjectRestResponse data(T data){
        this.data = data;
        return this;
    }

}

我只舉插入的例子:

關於修改測試:

 

 

使用分頁插件進行分頁:

添加依賴:

 <!--springboot分頁插件-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.5</version>
        </dependency>

為省事,代碼我貼的是最終代碼,結果集封裝以及分頁都已經給出。

需要配置分頁,在application.yml中增加:

#配置分頁
pagehelper:
#分頁的數據庫
  helper-dialect: mysql
#如果pageNum<1則查詢第一頁,如果pageNum大於最后一頁,查詢最后一頁
  reasonable: true
#支持通過Mapper接口參數來傳遞分頁
  support-methods-arguments: true
#為了支持startPage(Object params)方法,增加該參數來配置參數映射
  params: count=countSql
#默認支持駝峰命名規范如:數據庫字段是order_id那么實體字段要寫成orderId

分頁核心代碼是:

PageHelper.startPage(pageNum,pageSize);

測試

 

 如果執行插入的時候希望主鍵為字符串且使用UUID時,經常用的方法有:

一、使用java.util.UUID方法

新建一個包:util

創建一個類:

public class BaseUtil{
    public static String createUUID(){
         String uuid = UUID.randomUUID().toString();
          return uuid.replace("-","");
     }  
}    

當你要插入時,可在service層進行處理:

String id = BaseUtil.createUUID();

map.put("id",id);

userMapper.insertUser(map);

二、引入jpa依賴:

 <!--jpa-->
        <!--<dependency>-->
            <!--<groupId>org.springframework.boot</groupId>-->
            <!--<artifactId>spring-boot-starter-data-jpa</artifactId>-->
            <!--<version>1.5.2.RELEASE</version>-->
        <!--</dependency>-->

 在實體類的屬性或get方法添加兩個注解,注意,字段類型為32位的String類型。使用注解:

 假如

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
//配置uuid,本來jpa是不支持uuid的,但借用hibernate的方法可以實現。
@Column(name = "id", length = 32)

   private String id;

 

 

添加過濾器:

過濾器這塊我不太熟悉,主要對插入員工進行過濾。

添加新的依賴:

 <!--支持servlet的jar包,應該叫servlet-api.jar-->
        <!--你如果編寫過servlet就知道要用到HttpServletResponse和HHttpServletRequest-->
        <!--等對象,這些對象都要靠這個jar包才能使用-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>

添加新的包:

package com.practice.demo.springboot2ssm.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


/**
 * @program: springboot2ssm
 * @description:
 * @author: liu yan
 * @create: 2018/06/28
 */
@Component
@WebFilter
@Slf4j
public class MSecurityFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
      log.info("--------------MSecurityFilter進入初始化----------");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("--------------MSecurityFilter進入----------");
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse)servletResponse;
        System.out.println("URL:"+request.getRequestURL());
        System.out.println("URI"+request.getRequestURI());
        if ("/job/insert".equals(request.getRequestURI())) {
            filterChain.doFilter(request,response);
        }else {
            System.out.println("請先插入數據");
        }
        log.info("--------------MSecurityFilter退出----------");

    }

    @Override
    public void destroy() {
        log.info("--------------MSecurityFilter進入銷毀----------");
    }
}

 

 

mapper中公司使用通用mapper也是很常見的,可以學習下。另外我的項目演練jpa的時候出現的包沖突的問題,雖然發現一個解決包沖突很好的一個方法,傳送(https://blog.csdn.net/qq_35246620/article/details/79753210)(https://www.cnblogs.com/winner-0715/p/7198421.html?utm_source=itdadao&utm_medium=referral)遺憾的是,按照此方法並沒有解決我的問題,jpa與pagehelper、通用mapper可能並沒有解決沖突,如果不加jpa則是對的,本來演示jps自動建表,我也放棄了。接下來繼續,如果解決了我會繼續修改的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM