一、环境准备
- IDEA 2019
- JDK 1.8
- Mybatis 3.0
- Oracle数据库11g
- Apache-Maven-3.6.1
二、环境搭建步骤
1、创建新项目:
下一步:
下一步:
下一步:完成项目创建。新建的项目结构:
因为本教程不使用application.properties
文件,所以可删除该文件,后面会用application.yml
文件代替。这里需要注意:别把.iml
文件删了。
2、配置 maven
(1)点击进入最新版本maven下载页 ,选择
apache-maven-3.6.1-bin.zip
进行下载;
(2)将下载文件解压至D盘,然后在解压文件apache-maven-3.6.1/conf/settings.xml
文件中进行以下配置:(可搜索标签名确定要添加的位置,默认情况下要添加的两个标签都被注释了。)
- 本地存放下载的maven资源库架包位置
<localRepository>D:\jars\</localRepository>
- 使用阿里云资源库镜像,下载速度更快
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
(3)在IDEA中配置 maven:
最后点击apply、ok。
3、在pom.xml中添加数据库驱动依赖包:
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4.0</version>
</dependency>
---------------- ojdbc6下载失败解决方案 ----------------
(1)直接引用Maven资源库中的ojdbc6
是不可以的,故需要先下载到本地后再导入本地maven库(D:\jars\);
(2) 点击下载ojdbc6
(3)查看ojdbc6 版本为11.2.0.4.0
(4)执行mvn命令:
mvn install:install-file -Dfile=D:/ojdbc6.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.4.0 -Dpackaging=jar
注意: mvn命令在\apache-maven-3.6.1\bin
目录中
(5)成功执行命令后,会在本地资源库中D:\jars\com\oracle\ojdbc6
生成如下文件:
打开maven-metadata-local.xml
文件,即可查看到ojdbc6的版本信息:
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<versioning>
<release>11.2.0.4.0</release>
<versions>
<version>11.2.0.4.0</version>
</versions>
<lastUpdated>20190714043824</lastUpdated>
</versioning>
</metadata>
4、在resources
目录下创建application.yml
文件
server:
port: 8080
spring:
datasource:
name: oracle
driver-class-name: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@localhost:1521/orcl
username: scott
password: tiger
mybatis:
mapper-locations: classpath:mapping/*.xml #classpath就是resources目录
type-aliases-package: com.example.mydemo.mapper
5、根据application.yml
中mybatis的配置信息,在resources目录下创建文件夹:mapping,并在其中创建一个.xml文件:
<?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 namespace="com.example.mydemo.model.Emp">
</mapper>
这里为了测试,mapper中就先不写内容了,但namespace必须有,接下来就在java中创建相应的映射实体类Emp
package com.example.mydemo.model;
public class Emp {
}
为了测试,类中啥也别写。
6、实体类和映射文件都有了,创建mapper接口
package com.example.mydemo.mapper;
public interface EmpMapper {
}
为了方便测试,接口中也啥都不写。
7、开始测试…
写一个controller类进行测试:
package com.example.mydemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class TestController {
@RequestMapping(value="/test")
@ResponseBody
public String test(){
return "ABCDEFG,Hello Springboot";
}
}
最后,在启动类中添加mapperscan(此时不写也没问题):
然后右键启动类运行:
started表示启动成功。这里不用安装tomcat即可运行。
9、在浏览器中输入:http://localhost:8080/test即可。
10、连接数据库
(1)MydemoApplication.java类上加两注解:
@MapperScan("com.example.demo.mapper")
@ServletComponentScan
(2)CommonController.java
package com.example.demo.controller;
import com.example.demo.model.Result;
import com.example.demo.service.CommonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping(value = "/sys/")
public class CommonController {
@Autowired
private CommonService commonService;
@RequestMapping("/test")
@ResponseBody
public Result test(@RequestParam Map<String, String> param) {
List<Map<String, Object>> result = commonService.test();
return Result.success("ok", result);
}
}
(3)Result.java
package com.example.demo.model;
public class Result<T> {
private String msg;
private boolean success;
private int code;
private T data;
public Result() {
}
public Result(String msg, boolean success, int code, T data) {
this.msg = msg;
this.success = success;
this.code = code;
this.data = data;
}
public static Result success(String msg) {
return Result.success(msg, null);
}
public static Result success(String msg, Object data) {
return Result.success(msg, data, 0);
}
public static Result success(String msg, Object data, int code) {
return new Result(msg, true, code, data);
}
public static Result fail(String msg) {
return Result.fail(msg, null);
}
public static Result fail(String msg, Object data) {
return new Result(msg, false, 0, data);
}
/********** 必须加上get和set方法,否则springboot无法返回json串**********/
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
(4)CommonService.java
package com.example.demo.service;
import com.example.demo.mapper.CommonMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class CommonService {
@Autowired
private CommonMapper commonMapper;
public List<Map<String, Object>> test() {
return commonMapper.test();
}
}
(5)CommonMapper.java
package com.example.demo.mapper;
import java.util.List;
import java.util.Map;
public interface CommonMapper {
List<Map<String, Object>> test();
}
(6)CommonMapper.xml
<?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 namespace="com.example.demo.mapper.CommonMapper">
<select id="test" resultType="java.util.Map">
select * from sys_user
</select>
</mapper>
mybatis提供将数据库表自动生成映射实体类及mapper相应文件的插件,可参考其他文章https://blog.youkuaiyun.com/pengyulong1285/article/details/81070841
三、常见错误及解决方案:
-
1、Error starting ApplicationContext. To display the conditions report re-run your application with ‘debug’ enabled.
2019-07-14 21:04:02.855 ERROR 4916 — [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘sqlSessionFactory’ defined in class path resource [org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration.class]:…
前面的错误描述不用管,真正的错误内容都在最底下:比如:
Caused by: java.io.FileNotFoundException: class path resource [com.example.mydemo.mapper] cannot be opened because it does not exist
错误分析:classpath就是resources目录,配置的是mapper.xml文件,而这里提示的是com…mapper是包名,明显是配置application.yml时发生的错误:
mapper-locations与type-aliases-package配置反了。纠正后的结果:
问题解决。 -
2.org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.example.demo.dao.LoginMapper.getMenus
原因:数据库url地址对应数据库不对。 -
3、查询数据库数据中包含Timestramp类型,在返回给前台时报错:
nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer
(to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
(through reference chain: com.example.demo.pojo.Result["data"]->java.util.ArrayList[0]->java.util.HashMap["logtime"]->oracle.sql.TIMESTAMP["stream"])] with root cause
此问题仍未解决,后续补充…
本人也是新手,正在不断地学习,本文之后也会不断更新完善,如有更好的建议,欢迎下方留言交流。