一.簡介
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地址,可以參考,有錯誤希望可以幫助指正。