Spring boot + sqlserver

参考:

1、狂神说SpringMVC05:整合SSM框架  狂神系列笔记:狂神说Springboot笔记 - 时移之人 - 博客园

SpringBoot Mybatis问题收集

SpringBoot + MyBatis(注解版),常用的SQL方法

【五种方法】mybatis使用Map返回时,当value为空时不显示key

一、在pom文件加入SQL server依赖

    <dependency>
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>sqljdbc4</artifactId>
        <version>4.0</version>
    </dependency>

如果中央仓库拉不下来jar包,点击这里百度网盘 请输入提取码
,提取码0fcq,我将整个sqlserver驱动包文件夹上传了,你只要按照对应的路径复制就好。

网上手工教程Spring boot 连接 sqlserver_dianhuilu4947的博客-CSDN博客_springboot连接sqlserver数据库

刷新一下可以下载到。

二、设置SQLServer的TCP/ip连接:

注意: IP ALL/127.0.0.1和网卡IP的端口都要修改

三、设置连接信息

有人采用 修改application.properties 为 application.yml  SpringBoot连接SQLServer_哔哩哔哩_bilibili

spring:
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://ip地址:端口;DatabaseName=数据库名
    username: 用户名
    password: 密码
    maxActive: 20
    initialSize: 1
    maxWait: 60000
    minIdle: 1
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: select 1
    testWhileIdle: true
    testOnBorrow: true
    testOnReturn: true
    poolPreparedStatements: true
    maxOpenPreparedStatements: 20

我采用(application.properties)

spring.datasource.url=jdbc:sqlserver://localhost:1433;DatabaseName=数据库名
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.username=用户名
spring.datasource.password=密码

四、Mybatis 依赖包和mybatis 配置文件

<!--springboot整合mybatis的依赖-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.0.1</version>
</dependency>
<!--添加mybatis分页插件支持 根据需求可要可不要-->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.0.0</version>
</dependency>
#mapper配置文件
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.atl.erpcloud.mapper
#开启驼峰命名
mybatis.configuration.map-underscore-to-camel-case=true

 注意:配置文件yml和properties文件格式不同

五、springboot 整合mybatis的目录结构

参见:SpringBoot项目中的目录结构,以及每个目录的作用是什么。_天霸地霸tua的博客-CSDN博客

在根目录下:
①工程启动类(ApplicationServer.java)在根目录的build包下
②实体类(domain)在根目录的domain下(我采用entity
③数据访问层(dao)在根目录的repository下(我采用mapper)
④数据服务层(Service)在根目录的service下,数据服务的实现接口(serviceImpl)在根目录的service.impl下
⑤前端控制器(controller)在根目录的controller下
⑥工具类(utils)在根目录的utils下
⑦常量接口类(constant)在根目录的constan下
⑧配置信息类(config)在根目录的config下
⑨数据传输类(vo)在根目录的vo下。
资源文件的结构
根目录:src/main/resources
①项目配置文件:resources/application.yml
②.静态资源目录:resources/static/
——用于存放html、css、js、图片等资源
③视图模板目录:resources/templates/
——用于存放jsp、thymeleaf等模板文件
④mybatis映射文件:resources/mapper/(mybatis项目)
⑤mybatis配置文件:resources/mapper/config/(mybatis项目)
⑥国际化(i18n))置于i18n文件夹下
⑦spring.xml置于META-INF/spring文件夹下
⑧页面以及js/css/image等置于static文件夹下的各自文件下

 六、记得在SpringBoot启动类上添加mapper接口扫描注解

@SpringBootApplication
//添加扫描mybatis的dao层接口,生成实现类
@MapperScan(value = "com.baidu.mapper")
public class Sbdemo2Application {
    public static void main(String[] args) {
        SpringApplication.run(Sbdemo2Application.class, args);
    }
}

七、编写实体类

 Springboot mybatis generate根据数据库表自动生成实体类、Mapper和Mapper.xml

Springboot+Mybatis+SQL Server自动生成实体类

POM.xml 修改

        <!-- mybatis自动生成插件 -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.5</version>
        </dependency>
 <!-- Mybatis generator代码生成插件 配置 -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.1</version>
                <configuration>
                    <!--generatorConfig.xml位置-->
                    <configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
                <executions>
                    <execution>
                        <id>Generate MyBatis Artifacts</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <phase>generate-sources</phase>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>com.microsoft.sqlserver</groupId>
                        <artifactId>sqljdbc4</artifactId>
                        <version>4.0</version>
                    </dependency>
                </dependencies>
            </plugin>

generatorConfig.xml文件

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

    <!--<properties resource="jdbc.properties"></properties>-->
    <!--数据库驱动包位置-->
    <classPathEntry location="C:\Users\liu\.m2\repository\com\microsoft\sqlserver\sqljdbc4\4.0\sqljdbc4-4.0.jar" />

    <context id="DB2Tables" targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>

        <!--数据库URL、用户名、密码-->
        <jdbcConnection driverClass="com.microsoft.sqlserver.jdbc.SQLServerDriver"
                        connectionURL="jdbc:sqlserver://localhost:1433;DatabaseName=eggdemo" userId="sa" password="1q2w3e">
        </jdbcConnection>


        <!--生成模型包的位置 -->
        <javaModelGenerator targetPackage="com.atl.erpcloud.Entity"
                            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="false" />
        </sqlMapGenerator>

        <!--生成映射dao(Mapper)的包名和位置-->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.atl.erpcloud.Mapper" targetProject="./src/main/java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

        <!--需要生成那些数据库(更改tableName和domainObjectName)-->
        <table tableName="bom_structure" domainObjectName="BomBom" enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false"                enableSelectByExample="false" selectByExampleQueryId="false"  >
        </table>

    </context>
</generatorConfiguration>

双击执行插件

提示错误:

[ERROR] Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.1:generate (default-cli) on project erpcloud: Execution default-cli of goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.1:generate failed: Plugin org.mybatis.generator:mybatis-generator-maven-plugin:1.3.1 or one of its dependencies could not be resolved: Failed to collect dependencies at org.mybatis.generator:mybatis-generator-maven-plugin:jar:1.3.1 -> com.microsoft.sqlserver:sqljdbc4:jar:4.0: Failed to read artifact descriptor for com.microsoft.sqlserver:sqljdbc4:jar:4.0: Could not transfer artifact com.microsoft.sqlserver:sqljdbc4:pom:4.0 from/to spring-snapshots (http://repo.spring.io/libs-snapshot): Authorization failed for http://repo.spring.io/libs-snapshot/com/microsoft/sqlserver/sqljdbc4/4.0/sqljdbc4-4.0.pom 403 Forbidden -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginResolutionException

删除pom中plugin中的

<dependencies>
    <dependency>
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>sqljdbc4</artifactId>
        <version>4.0</version>
    </dependency>
</dependencies>

八、Mapper

1、只用注解方式(删除掉UserMappper.xml文件即可。)

package com.example.demo.dao;
 
import java.util.List;
 
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
 
import com.example.demo.model.UserDomain;
 
@Mapper
public interface UserDao {
 
    @Insert("INSERT INTO t_user(name, password, phone) VALUES(#{name}, #{password}, #{phone})")
     int insert(@Param("name") String name, @Param("password") String password, @Param("phone") String phone);
 
 
    @Select("SELECT * FROM t_user ")
    List<UserDomain> selectUsers();
}

2、@Repository和@Mapper注解问题

@Repository 来自Spring的注解

@Mapper 来自Mybatis的注解

在springboot 中,给mapper的接口上加上@Repository,无法生成相应的bean,从而无法@Autowired,这是因为spring扫描注解时,自动过滤掉了接口和抽象类,这种情况下可以在启动的类前加 上@MapperScan(“×××.×××.mapper”,从而使mapper可以自动注入,但是idea还会提示bean无法找到,但是不会影响运行

在使用Springboot环境下,如果结合了mybatis,在dao层上必须加@mapper与@Repository两个注解。尤其是@mapper,不可或缺;
而@Repository注解多用于实现类上。如果只是单独在接口上添加该方法会出现无法注入的情况;如果一定要只使用@Repository,可以在主方法上加@MapperScan(“com.xxx.xxx.dao”)

@SpringBootApplication
@MapperScan(
        basePackages = {"com.test.teinterface"},
        annotationClass = Mapper.class
)
public class InterfaceApplication extends SpringBootServletInitializer {
    public InterfaceApplication() {
    }

    public static void main(String[] args) {
        (new SpringApplicationBuilder(new Object[]{InterfaceApplication.class})).web(true).run(args);
    }

    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        SpringApplicationBuilder rst = builder.sources(new Class[]{InterfaceApplication.class});
        return rst;
    }
}

九、service 

暂时没有加接口类,直接实现BomInfoSerivce

package com.atl.erpcloud.service;
import com.atl.erpcloud.entity.BomInfo;
import com.atl.erpcloud.mapper.BomInfoMapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
@Service
public class BomInfoService {
    @Autowired
    private BomInfoMapper bomInfoMapper;

    public BomInfo getBomById(String model) {
        return bomInfoMapper.getBomById(model);
    }

    public int deleteById(String model) {
        return bomInfoMapper.deleteById(model);
    }
    public BomInfo addBom(BomInfo bomInfo) {
        int save = bomInfoMapper.insert(bomInfo);
        return bomInfo;
    }

    public int Update(BomInfo bomInfo) {
        return bomInfoMapper.updateBySelective(bomInfo);
    }

    public List<BomInfo> selectAll() {
        return bomInfoMapper.selectAll();
    }
    //分页查询
    //@Override
    public PageInfo<BomInfo> findAllModel(int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<BomInfo> bomDomains = bomInfoMapper.selectAll();
        PageInfo result = new PageInfo(bomDomains);
        return result;
    }

}

@Autowired真的就是Spring的自动注入???

@Autowired 相当于自动装配后的实例类的自动初始化参数,个人理解。

十:RESTful api

用Spring Boot开发API接口

Postman

十一、多条件查询

利用反射跟自定义注解拼接实体对象的查询SQL

SpringBoot系列——Spring-Data-JPA

SpringBoot2学习笔记(四)JPA与Mybatis

1、mybatis 动态SQL查询总结

2、mybatis 动态sql及参数传递

3、MyBatis动态sql参数连接方式#{}和${}区别

4、Spring Data JPA - Reference Documentation

5、SpringBoot+Mybatis 框架之 @SelectProvider注解方式搭建

6、基于 @SelectProvider 注解实现无侵入的通用Dao

Spring-data repositories use EntityManager beneath. Repository classes are just another layer for the user not to worry about the details. But if a user wants to get his hands dirty, then of course spring wouldn't mind.
That is when you can use EntityManager directly.

This section explains how to create a custom repository with Spring Boot.

Let us assume you have a Repository Class like AbcRepository

interface AbcRepository extends JpaRepository<Abc, String> {

}

You can create a custom repository like

interface CustomizedAbcRepository {
  void someCustomMethod(User user);
}

The implementation class looks like

class CustomizedAbcRepositoryImpl implements CustomizedAbcRepository {

@Autowired
EntityManager entityManager;


  public void someCustomMethod(User user) {
    // You can build your custom query using Criteria or Criteria Builder
    // and then use that in entityManager  methods
  }
}

十二、SpringBoot + Vue

整合Springboot+Vue(基础框架)

Springboot+Vue整合笔记【超详细】

十三 JQuery DataTable

  1. Jquery DataTable基本使用
  2. jquery datatable ajax配置详解

十四:跨域配置

1、在根目录下的vue.config.js设置(不行,无效,不知道原因

  devServer: {
   open: true,  // npm run serve后自动打开页面
    host: '0.0.0.0',  // 匹配本机IP地址(默认是0.0.0.0)
    port: 8081, // 开发服务器运行端口号
    proxy: {
      '/api': {
         target: 'http://127.0.0.1:8080/', // 代理接口地址
         secure: false,  // 如果是https接口,需要配置这个参数
         changeOrigin: true, // 是否跨域
         pathRewrite: {
           '^/api': '/api'   //需要rewrite的, 这里理解成以'/api'开头的接口地址,把/api代替target中的地址
        }
      }
    }
  },

2、改在config/index.js中设置(有效可以

3、但是在jquery DataTable中还是有问题,如下:

list#:1 Access to XMLHttpRequest at 'http://127.0.0.1:8080/bom/bysql/1=1?_=1612838025177' from origin 'http://localhost:8081' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

问题原因:跨域资源共享 CORS 详解

解决方法增加拦截器:

import com.tczmh.service.Interceptor.HeaderHandlerInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
 
@Autowired
private HeaderHandlerInterceptor headerHandlerInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
    // 注册拦截器
    registry.addInterceptor(headerHandlerIntercepto).addPathPatterns("/**");
}
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@Component
public class HeaderHandlerInterceptor implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 这是要放行通过的域名 如果不限制用一个 * 也可以,就是不安全
        response.addHeader("Access-Control-Allow-Origin", "http://bz.tczmh.club");
        // 允许的方法 例如GET POST PUT DELETE,只要放行用过的
        response.addHeader("Access-Control-Request-Method", "POST");
        // 这个对应的是ajax里设置了header,例如存了token 或者 ontentType: "application/json"
        response.addHeader("Access-Control-Allow-Headers", "Content-Type");
        return true;
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
 
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
 
    }
}

另外ajax调用如果用二级域名也有问题 会404,最好直接写全域名

 
  1. $.ajax({
  2. url:"http://tczmh.club/service/bz/bzContact",
  3. type:"post",
  4. .........
  5. });

//另一个方法,未测试
/*
* @Configuration
public class CrosConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                .allowCredentials(true)
                .maxAge(3600)
                .allowedHeaders("*");
    }
}
* */

十五、AXIOS

axios是一个基于 promise 的 HTTP 库,这样我们进行前后端对接的时候,使用这个工具可以提高我们的开发效率。

安装命令:

cnpm install axios --save

然后同样我们在main.js中全局引入axios。

import axios from 'axios'
Vue.prototype.$axios = axios //

vue + axios 使用说明

十六、BootStrap

vue项目引入bootstrap正确姿势

  • 1.安装依赖包:
      cnpm install bootstrap --save-dev
      cnpm install jquery --save-dev
      cnpm install popper.js --save-dev
    
  • 2.将bootstrap全局引入。
    在项目中根目录西main.js中添加如下代码:
import 'bootstrap'

引入jquery同理,可在main.js添加下面一行:

import $ from 'jquery'
  • 3.将bootstrap css资源引入到相关页面中。
    和普通的html直接link css文件资源不同,对于基于组件化的vue项目,我们需要在相关需要使用的vue文件中添加如下代码:
<script>
import 'bootstrap/dist/css/bootstrap.min.css'
import 'bootstrap/dist/js/bootstrap.min.js'
</script>

如果Home.vue为Article.vue的父组件,那么想css作用于Article.vue,只需要在Home.vue添加上述两行import即可。

网上相关的教程或者博客很多,但是在这引入css和js文件的路径大多都是错的,正确的是从node_module之后开始算路径,如bootstrap/xxx/xxx/xxx.min.css,而不是'./node_modules/bootstrap/xxx/xxx/xx.min.css。

十七、登录信息保存

Vue系列4 - Vue+store 保存用户登录信息和退出登录

vuex + axios 做登录验证 并且保存登录状态

十八、SpringBoot数据库事务处理

SpringBoot事物Transaction实战讲解教程

十九、一对多

mybatis记录随便(五)一对多映射实现方式

二十、RestFul API

1、GET请求 使用RESTful风格api命名接口时,GET方法怎么传递多个参数

2、POST 请求 SpringBoot中Rest风格接口传递多个参数 SpringBoot中Rest风格接口传递多个参数_tianjidudao的博客-CSDN博客

二十一:部署

部署SpringBoot大数据平台 部署SpringBoot大数据平台_LvJinYang的博客-CSDN博客

其他常用功能

  1. vue定义全局变量和全局方法
  2. Vue 页面加载数据之前增加 `loading` 动画
  3. Build Yourself a Right GIF Spinner / loading.io 网站
  4. Vue父子组件传值的方法Vue父子组件传值的方法_lianwenxiu的博客-CSDN博客_父子组件传值

  5. Vue混入(一)继承的实现方式Vue混入(一)继承的实现方式 - 简书

  6. v-slot Vue新指令:v-slot | 码农网

其他资源

  1. SQL server分页的四种方法(算很全面了)SQL server分页的四种方法(算很全面了)_kanlon的博客-CSDN博客_sql 分页
  2. springboot+vue前后端免费开源(重点参考)

问题:

1、org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题_写代码的蜗牛-CSDN博客

#mapper配置文件
mybatis.mapper-locations=classpath:Mapping/*.xml
mybatis.type-aliases-package=com.atl.erpcloud.mapper

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值