参考该网址成功搭建:
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自动建表,我也放弃了。接下来继续,如果解决了我会继续修改的。