基于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 = ;
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自动建表,我也放弃了。接下来继续,如果解决了我会继续修改的。
基于springboot的ssm的更多相关文章
- 基于springboot的SSM框架实现返回easyui-tree所需要数据
1.easyui-tree easui-tree目所需要的数据结构类型如下: [ { "children": [ { "children": [], " ...
- idea基于springboot搭建ssm(maven)
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/liboyang71/article/det ...
- 基于SpringBoot+SSM实现的Dota2资料库智能管理平台
Dota2资料库智能管理平台的设计与实现 摘 要 当今社会,游戏产业蓬勃发展,如PC端的绝地求生.坦克世界.英雄联盟,再到移动端的王者荣耀.荒野行动的火爆.都离不开科学的游戏管理系统,游戏管理系 ...
- springBoot (适合ssm)
很多小白在学ssm的时候,选用idea,网上应该有很多教程,创建maven项目,创建spring项目的都有,五花八门. 最近接触了springBoot,这个项目类型适用于ssm,还不用去创建很多文件夹 ...
- MyBatis 进阶,MyBatis-Plus!(基于 Springboot 演示)
这一篇从一个入门的基本体验介绍,再到对于 CRUD 的一个详细介绍,在介绍过程中将涉及到的一些问题,例如逐渐策略,自动填充,乐观锁等内容说了一下,只选了一些重要的内容,还有一些没提及到,具体可以参考官 ...
- 基于maven的ssm框架整合
基于maven的ssm框架整合 第一步:通过maven建立一个web项目. 第二步:pom文件导入jar包 (1 ...
- SpringData 基于SpringBoot快速入门
SpringData 基于SpringBoot快速入门 本章通过学习SpringData 和SpringBoot 相关知识将面向服务架构(SOA)的单点登录系统(SSO)需要的代码实现.这样可以从实战 ...
- 基于SpringBoot开发一个Restful服务,实现增删改查功能
前言 在去年的时候,在各种渠道中略微的了解了SpringBoot,在开发web项目的时候是如何的方便.快捷.但是当时并没有认真的去学习下,毕竟感觉自己在Struts和SpringMVC都用得不太熟练. ...
- Shiro 核心功能案例讲解 基于SpringBoot 有源码
Shiro 核心功能案例讲解 基于SpringBoot 有源码 从实战中学习Shiro的用法.本章使用SpringBoot快速搭建项目.整合SiteMesh框架布局页面.整合Shiro框架实现用身份认 ...
随机推荐
- Unity3D中的shader基础知识
1.Unity中配备了强大的阴影和材料的语言工具称为ShaderLab,以程式语言来看,它类似于CgFX和Direct3D的效果框架语法,它描述了材质所必须要的一切咨询,而不仅仅局限于平面顶点/像素着 ...
- Redis哨兵模式(sentinel)部署记录(主从复制、读写分离、主从切换)
部署环境: CentOS7.5 192.168.94.11 (master) 192.168.94.22 (slave0) 192.168.94.33 (slave1) 192.168.94.44 ...
- html5 渐变按钮练习
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- qemu中的内存管理
qemu负责模拟虚机的外设,因此虚机的线性地址空间主要由qemu进行管理,也就是确定线性地址空间中哪段地址属于哪个设备或者DRAM或者其他的什么. 1.数据结构 1.RAMBLOCK (最直接接触ho ...
- webservice常用两种身份验证方式
在项目开发,我们经常会使用WebService,但在使用WebService时我们经常会考虑以下问题:怎么防止别人访问我的WebService?从哪里引用我的WebService?对于第一个问题,就涉 ...
- CCF后感
3.21,昨天天梯训练赛完后查CCF成绩,300!小开心~~~我是合格的程序员啦~~~ 问题:第四题,如果输入数据有对于1本身来说 S 1 ,R 1有这个我就gg了,考完一直在担心这个反复看题也看不出 ...
- post请求中body数据类型
1.application/json:json格式,如下: {"input1":"xxx","input2":"ooo" ...
- 第十六节 BOM基础
打开.关闭窗口 open:蓝色理想运行代码功能 <button onclick="window.open('http://www.baidu.com')">打开窗口&l ...
- git+webpack项目初始化<一>
目录结构 src + page view image service util git初始化 linux常用命令 rm -rf mmall-fe/ 删除 mkdir mmall-fe 创建文件夹 ls ...
- 【题解】Luogu P1344 [USACO4.4]追查坏牛奶Pollutant Control
原题传送门 看到这种题,应该一眼就能知道考的是最小割 没错这题就是如此简单,跑两遍最大流(最小割=最大流),一次边权为题目所给,一次边权为1 还有一种优化,优化后只需跑一次最大流,把每条边的权值改成w ...