spring boot初體驗(四)集成MyBatis

一.簡介

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

https://github.com/tennyxx/cx.springboot.demo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章