1 为所有的java工程设置默认的maven路径
把所有的java工程都关闭,
设置后,结果一致不成功,是因为使用公司内网的maven镜像,所以无限网络链接需要改成公司内网
然后改成公司内网后,然后升级一下maven
升级之前把m2路径下的repository下载的jar包给删掉,重新reimport一下。
<dependency>
<groupId> org.springframework.boot </groupId>
<artifactId> spring-boot-configuration-processor </artifactId>
<optional>true </optional>
</dependency>
配置后,升级一下maven
2 Dao和service和controller层的含义
Dao层是为了和数据库交互的
Service层是为了是想应用层的服务的
Controller是为了实现和web的交互的。
3 当读取一个数据库的时候出现索引越界的错误
可能这是数据库为空,然后我们读取的时候按照id来读取,因为数据库为空,所有其按照id来读取就会出现索引错误的现象
4 Springboot做例子的时候,发现findOne不能使用
首先我说一下我遇到问题的由来
我先是用的SpringDataJPA的1.11版本,可以使用findOne()方法根据id查询,
然后我使用了2.0.5版本,发现findOne()方法报错了,不能用来当作根据id查询了,
· getOne 当查询一个不存在的id数据时,会直接抛出异常,因为其返回的是一个引用,简单就是说一个代理对象。
· 无论如何都想要有一个返回,则使用findOne,而不用getOne。
2.0.5的已经变成了findById(id).get()来查询了。
//查询一个女生
@GetMapping(value= "/girls/{id}")
public GirlgirlFindOne(@PathVariable("id") Integer id){
returngirlRepository.findOne(id).get();
}
5 Request method 'DELETE' not supported
Springboot: Request method 'DELETE' not supported,Request method 'PUT' not supported, Request method 'POST' not supported
GET,POST,PUT,DELETE, Spring都支持,不要怀疑Spring, 一定是前端发送的rest 请求和后端的响应不匹配,
查找原因以及解决办法,很简单
用chrome打开F12控制台,仔细检查核对发送到服务端的rest请求的url是否和后端的rest服务匹配,如果不匹配就会出类似错误
比如后端服务如果定义是这样,http://xxx.xxx.xxx/users/abc请求,将删除用户abc
@RestController
@RequestMapping(value="/users")
public class UserDataController {
@RequestMapping(value="{/id}", method=RequestMethod.DELETE)
... ....
如果前端有拼接URL的代码,比如
var url ="http://xxx.xxx.xxx/users/" + userid
但如果如果因为bug或者错误,导致userid为空,就可能发送的请求是http://host/users/, 这样就会导致 Request method 'DELETE'not supported,Request method 'PUT' not supported, Request method 'POST' not supported类似的异常
6.mysql使用事务处理,往数据库中存两个数据,要求一个存失败另一个也不能成功。以下的代码是没有问题的,结果就是不能实现这个功能,事后查了才知道mysql默认表的类型是MyIsam,这种是非事务安全型的,所以不能实现事务的功能
MySQL 数据表主要支持六种类型 ,分别是:BDB、HEAP、ISAM、MERGE、MYISAM、InnoBDB。
这六种又分为两类,一类是”事务安全型”(transaction-safe),包括BDB和InnoDB;其余都属于第二类,称为”非事务安全型”(non-transaction-safe)。
用一下的命令更改一下mysql表的类型就可以了。ALTER table test.girl engine = InnoDB;
@Transactional public void insertTwo(){ try { Girl girlA = new Girl(); girlA.setCupSize("F"); girlA.setAge(18); girlRepository.save(girlA); Girl girlB = new Girl(); girlB.setCupSize("Baaa"); girlB.setAge(19); girlRepository.save(girlB); } catch (Exception ex){ throw new RuntimeException(); } }
创建表时指定表类型的方法 CREATE TABLE `message` ( `id` int(11) NOT NULL auto_increment, `sender` varchar(255) default NULL, `receiver` varchar(255) default NULL, `content` text, `is_read` char(1) default 'N', `send_time` datetime default NULL, `del_flag` tinyint(4) default '0', PRIMARY KEY (`id`) ) ENGINE=MYISAM; -- 也可以创建后更改: ALTER TABLE `message` ENGINE = INNODB; -- 查看表类型(存储引擎) SHOW TABLE STATUS FROM `test`; -- -- 结果为数据库test中所有表的信息,其中第二项type即是表的类型。 -- 查看表类型(存储引擎)2 SHOW CREATE TABLE `message`; -- -- 结果为表message创建时的信息,其中有TYPE或ENGINE一项,指定了表的类型(存储引擎)。 -- show tables不能得到表类型的信息。