一.简介
1.关于ORM
对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换[1] 。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。
(梭自百度百科https://baike.baidu.com/item/ORM/3583252?fr=aladdin)
2.MyBatis介绍
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
http://blog.csdn.net/jiuqiyuliang/article/details/45286191
二.准备工作
1.mysql下载地址(msi版):
http://sw.bos.baidu.com/sw-search-sp/software/dbe4e07f278c8/mysql-installer-community-5.7.20.msi
2.mysql数据库安装(和上边下载地址匹配的安装教程)
https://jingyan.baidu.com/article/363872ec2e27076e4ba16fc3.html
3.数据库准备工作
mysql数据库,创建"mydb"数据库,创建user表。添加字段id,name,age,并随便模拟几条数据
数据库可视化工具这里用的 navicat,可以网上自己搜索和下载。
三.实现步骤
默认装好了mysql数据库,并且有一个简单的返回api的spring boot demo。如果没有了解简单的spring boot结构,可以参考之前几篇文章构建一个demo
spring boot构建一个api返回helloworld: https://my.oschina.net/CrazyBoy1024/blog/1610025
spring boot中的aop/ioc :
https://my.oschina.net/CrazyBoy1024/blog/1610746 https://my.oschina.net/CrazyBoy1024/blog/1610048
1.添加依赖
在pom.xml中添加mysql和mybatis的依赖
<!-- 添加 MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<!-- 添加 MyBatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
2.创建分层结构和必要的类。
java的分层结构一般为Action(Controller)+Services+Dao ;
关于java里的三层结构介绍:http://blog.csdn.net/inter_peng/article/details/41021727
(1)创建需要用到的分层结构和文件
· 在resources静态资源里创建【mapper】文件夹,用于存放写sql的xml文件,创建user.xml文件。
· 创建一个【model】文件夹,用于存放mybatis返回的数据实体, 创建User.java文件 。
· 创建一个【dao】文件夹,用于编写数据操作,这里是预留mybatis调用的数据操作(个人理解),创建· UserDao.java文件。
·创建一个【services】文件夹,用于编写业务操作和dao层调用取数据等(个人理解), 创建 IUserService.java接口,创建【impl】文件夹用于放对接口的具体实现,并创建UserServiceImpl.java
完成后如图所示
(2)编写User实体
这里的User实体依然用上篇文章的User类,改造一下把id改为int和数据库对应,添加age属性
package com.example.demo.model;
import org.springframework.stereotype.Component;
/**
* @author liucx
*/
@Component
public class User {
private int id;
private String name;
private int age;
public long getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
(3)编写UserDao文件
package com.example.demo.dao;
import com.example.demo.model.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface UserDao {
//这里的get对应的是user.xml里<select id="get">
public User get(@Param("id")int id);
}
(4)编写IUserService接口和实现
IUserServiece接口:
package com.example.demo.services;
import com.example.demo.model.User;
public interface IUserServiece {
public User get(int id);
}
UserServiceImpl实现:
package com.example.demo.services.impl;
import com.example.demo.dao.UserDao;
import com.example.demo.model.User;
import com.example.demo.services.IUserServiece;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements IUserServiece {
@Autowired
//idea会报语法错误,编译没问题Could not autowire. No beans of 'UserDao' type found
// 降低警告级别可解决
private UserDao dao;
@Override
public User get(int id) {
User user = dao.get(id);
return user;
}
}
(5)编写user.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" >
<!--namespace指向UserDao路径-->
<mapper namespace="com.example.demo.dao.UserDao">
<!--resultMap是定义返回数据实体的节点。
type指返回实体的类型,这里指向model下的User.java实体。
id是resltMap的唯一标识,只要不重复就ok,命名最好符合当前意义。
节点内的column与数据库的字段name对应。property与User.java属性对应。这样完成实体属性和数据库字段的映射-->
<resultMap type="com.example.demo.model.User" id="user">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
<!--select是mybatis的查询操作,类似的还有update,delete等
id是唯一标识,要与dao的接口定义的方法名一致。
resultMap是对应上边返回数据实体的节点id
内部嵌套sql语句,#{ param }是接收的参数-->
<select id="get" resultMap="user">
select user.id, user.name, user.age
from user
where id = #{id}
</select>
</mapper>
3.配置数据库连接和mybatis
在application.properties配置mysql数据库连接和mybatis
#mysql配置
# 数据库地址= jdbc:mysql://本地host:端口号/库名
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mydb
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# mybatis配置
#指向数据实体存放的路径,这里是com.example.demo.model
mybatis.typeAliasesPackage=com.example.demo.model
#指向mybatis xml文件存放路径,这里是mapper下所有的xml文件,*代表所有.xml后缀
mybatis.mapperLocations=classpath:/mapper/*.xml
4.修改controller,调用services层取数据
package com.example.demo.controller;
import com.example.demo.model.User;
import com.example.demo.services.IUserServiece;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* @author liucx
*/
@RestController
public class TestController {
@Autowired
User user;
@Autowired
IUserServiece userServiece;
@RequestMapping(value = "/get/{id}",method = RequestMethod.GET)
public User getUser(@PathVariable int id){
user=userServiece.get(id);
return user;
}
}
5.浏览器运行
浏览器输入http://localhost:8080/get/1
对比数据库
完成spring boot中集成mybatis从数据库取值操作。
四.可能遇到的报错
1.控制台警告 SSL
这个是新版本的mysql会要求显式配置ssl,不影响执行结果。
想去掉这个问题的话,只需要在配置文件mysql连接字符串里修改后缀加上userSSL=false即可。
2.未找到Dao , MyBatis绑定错误
这里要检查xml里节点id和Dao里定义的接口方法是否对应(我第一次就是错在这里),比如UserDao里定义get,则对应xml中<select id="get"></select>。
xml内中文注释也可能导致该报错,也可尝试删除注释。
可以按以下步骤一一执行:
· 检查xml文件所在的package名称是否和interface对应的package名称一一对应
· 检查xml文件的namespace是否和xml文件的package名称一一对应
· 检查函数名称能否对应上
· 去掉xml文件中的中文注释
· 随意在xml文件中加一个空格或者空行然后保存
3.跳转页面的url无对应的值
异常:This application has no explicit mapping for /error, so you are seeing this as a fallback.
出现这个异常说明了跳转页面的url无对应的值. 也就是404.
在第一篇文章中提到过这个。需要把 带有@SpringBootApplication注解的入口类放在根目录,否则找不到其他的类。
最后放上spring boot 1-4的整个demo地址,可以参考,有错误希望可以帮助指正。