08 Spring 操作持久層 (融合 Mybatis)最簡(jiǎn)使用(使用 Mybatis Generator)

轉(zhuǎn)載請(qǐng)注明來(lái)源 賴(lài)賴(lài)的博客

導(dǎo)語(yǔ)

對(duì)接越多雕沿,耦合約松,系統(tǒng)越復(fù)雜猴仑。

如果這章學(xué)習(xí)有困難审轮,可以先參考番外 02: Spring 之使用 JAVA 操作Mysql數(shù)據(jù)庫(kù)(為何要用ORM)Spring整合 Mybatis前基礎(chǔ)

Mybatis作為最近比較流行的ORM框架(Object Relation Mapping),ORM的功能也就是把數(shù)據(jù)庫(kù)的表映射為對(duì)象便于操作辽俗。
本章介紹Mybatis與Spring的融合和推薦一種入手使用的方式疾渣,你不需要對(duì)Mybatis有很深刻的了解,只需要知道他是一個(gè)ORM框架即可崖飘,但是你需要知道數(shù)據(jù)庫(kù)的基本知識(shí)榴捡。
數(shù)據(jù)庫(kù)的使用是不可避免的,在學(xué)習(xí)本章之前朱浴,你需要:

  • 了解數(shù)據(jù)庫(kù)的基本知識(shí)
  • 使用過(guò)mysql數(shù)據(jù)庫(kù)
  • 熟悉SQL語(yǔ)句
  • 電腦已經(jīng)安裝mysql數(shù)據(jù)庫(kù)(建議學(xué)習(xí)可以使用WAMP套件

實(shí)例

項(xiàng)目工程目錄結(jié)構(gòu)和代碼獲取地址

獲取地址(版本Log將會(huì)注明每一個(gè)版本對(duì)應(yīng)的課程)

https://github.com/laiyijie/SpringLearning

目錄結(jié)構(gòu)&數(shù)據(jù)庫(kù)

工程目錄結(jié)構(gòu)
工程目錄結(jié)構(gòu)
數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)

創(chuàng)建語(yǔ)句:
CREATE TABLE account (
username varchar(45) NOT NULL,
password varchar(45) NOT NULL,
name varchar(45) NOT NULL,
create_time bigint(20) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
ALTER TABLE account
ADD PRIMARY KEY (username);

運(yùn)行工程(與之前不同吊圾,請(qǐng)注意)

運(yùn)行方式
  • 右鍵App.java
  • Run as
  • Java Application
運(yùn)行結(jié)果

Account [username=laiyijie, password=123456, name=賴(lài)賴(lài), create_time=1480595033430]
Account [username=laiyijie, password=123456, name=賴(lài)賴(lài), create_time=1480595033430]

項(xiàng)目詳解

從 App.java 入手:

App.java

package me.laiyijie.demo;

import java.util.List;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import me.laiyijie.demo.domain.Account;
import me.laiyijie.demo.service.UserService;

public class App {

    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("root-context.xml");

        UserService service = context.getBean(UserService.class);

        Account account = service.createAccount("laiyijie", "123456", "賴(lài)賴(lài)");

        System.out.println(account);

        List<Account> accounts = service.getAccountsByCreateTime(0L, System.currentTimeMillis());

        for (Account account2 : accounts) {
            System.out.println(account2);
        }

        context.close();
    }

}
  • 加載ApplicationContext
  • 取出UserService的實(shí)現(xiàn)對(duì)象
  • 調(diào)用UserServicecreateAccount方法
  • 輸出account
  • 調(diào)用UserServicegetAccountsByCreateTime方法
  • 循環(huán)輸出accounts
  • 關(guān)閉ApplicationContext

Account類(lèi)是一個(gè)純數(shù)據(jù)類(lèi),也就是說(shuō)翰蠢,Account類(lèi)中的字段與數(shù)據(jù)庫(kù)中的字段完全對(duì)應(yīng):

Account.java(沒(méi)有給出 getter和setter以及toString方法)

package me.laiyijie.demo.domain;

public class Account {
    private String username;

    private String password;

    private String name;

    private Long create_time;
    
}  

果然與數(shù)據(jù)庫(kù)中的字段完全一樣O钇埂!

CREATE TABLE `account` (
  `username` varchar(45) NOT NULL,
  `password` varchar(45) NOT NULL,
  `name` varchar(45) NOT NULL,
  `create_time` bigint(20) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;  

那讓我們繼續(xù)看看UserService都定義了一些什么:

UserService.java

package me.laiyijie.demo.service;

import java.util.List;

import me.laiyijie.demo.domain.Account;

public interface UserService {
    Account createAccount(String username ,String password,String name);
    List<Account> getAccountsByCreateTime(Long start,Long end);
}  

定義了兩個(gè)方法

  1. 創(chuàng)建賬號(hào)
  2. 取出兩個(gè)時(shí)間之間創(chuàng)建的所有賬號(hào)

其實(shí)現(xiàn)類(lèi)為 UserServiceImpl

UserServiceImpl.java

package me.laiyijie.demo.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import me.laiyijie.demo.dao.AccountMapper;
import me.laiyijie.demo.domain.Account;
import me.laiyijie.demo.domain.AccountExample;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private AccountMapper accountMapper;
    
    public Account createAccount(String username, String password, String name) {
        
        Account account = new Account();
        account.setCreate_time(System.currentTimeMillis());
        account.setName(name);
        account.setPassword(password);
        account.setUsername(username);
        
        accountMapper.insert(account);
        return account;
    }

    public List<Account> getAccountsByCreateTime(Long start, Long end) {
        AccountExample accountExample = new AccountExample();
        accountExample.or().andCreate_timeGreaterThan(start).andCreate_timeLessThanOrEqualTo(end);
        return accountMapper.selectByExample(accountExample);
    }
}

關(guān)鍵來(lái)了梁沧!
此處引入了依賴(lài) private AccountMapper accountMapper 并且調(diào)用了此接口的一些方法檀何!

我們不妨看一下這個(gè)類(lèi):

AccountMapper.java

package me.laiyijie.demo.dao;

import java.util.List;
import me.laiyijie.demo.domain.Account;
import me.laiyijie.demo.domain.AccountExample;
import org.apache.ibatis.annotations.Param;

public interface AccountMapper {
    long countByExample(AccountExample example);

    int deleteByExample(AccountExample example);

    int deleteByPrimaryKey(String username);

    int insert(Account record);

    int insertSelective(Account record);

    List<Account> selectByExample(AccountExample example);

    Account selectByPrimaryKey(String username);

    int updateByExampleSelective(@Param("record") Account record, @Param("example") AccountExample example);

    int updateByExample(@Param("record") Account record, @Param("example") AccountExample example);

    int updateByPrimaryKeySelective(Account record);

    int updateByPrimaryKey(Account record);
}  

可以看到,AccountMapper定義了對(duì)Account數(shù)據(jù)表的所有操作(CRUD),其中有一部分以ByExample結(jié)尾的不容易理解埃碱,我們?cè)敿?xì)講解猖辫!

List<Account> selectByExample(AccountExample example)

我們看其用法:
public List<Account> getAccountsByCreateTime(Long start, Long end) {
AccountExample accountExample = new AccountExample();
accountExample.or().andCreate_timeGreaterThan(start).andCreate_timeLessThanOrEqualTo(end);
return accountMapper.selectByExample(accountExample);
}

這段代碼摘自UserServiceImpl中,這個(gè)方法的目的是取出start到end時(shí)間內(nèi)創(chuàng)建的所有賬號(hào)

AccountExample的目的是為了組合一個(gè)where語(yǔ)句砚殿,其組合出的語(yǔ)句結(jié)構(gòu)如下 where(xxx and xxx)or (xxx and xxx)
所以:

accountExample.or().andCreate_timeGreaterThan(start).andCreate_timeLessThanOrEqualTo(end);
等于
where create_time > xxx and create_time<=xxx

如果進(jìn)一步的啃憎,我們?cè)黾右恍写aaccountExample.or().andUsernameEqualTo("laiyijie");

那么就是相當(dāng)于:

accountExample.or().andCreate_timeGreaterThan(start).andCreate_timeLessThanOrEqualTo(end);
accountExample.or().andUsernameEqualTo("laiyijie");
等于
where (create_time > xxx and create_time<=xxx) or username="laiyijie"

就是如此簡(jiǎn)單!相信信息可以查看MybatisGenerator關(guān)于Example使用的文檔

說(shuō)了這么多似炎,是不是還是覺(jué)得代碼太多辛萍?
其實(shí)me.laiyijie.demo.daome.laiyijie.demo.domainme.laiyijie.demo.Mapper都是自動(dòng)生成的羡藐。 這個(gè)神器就是MybatisGenerator贩毕。

也就是說(shuō),在現(xiàn)在這個(gè)項(xiàng)目中仆嗦,其實(shí)我只書(shū)寫(xiě)了UserService.java辉阶、UserServiceImpl.javaApp.java三個(gè)類(lèi)!

MybatisGenerator(創(chuàng)建 domain瘩扼,mapper谆甜,dao,Example對(duì)象集绰,ORM自動(dòng)解決)

介紹一下怎么使用MybatisGenerator(官方文檔位置

  • 下載MybatisGenerator的Eclipse插件
    • 打開(kāi)MarketPlace并搜索mybatis并且安裝
安裝MybatisGenerator插件
  • 配置mybatisGenerator.xml(用于配置如何生成源文件)
mybatisGenerator.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration PUBLIC
          "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
          "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    <generatorConfiguration>
        <!-- 填寫(xiě)mysql-connector-java的驅(qū)動(dòng)類(lèi) -->
        <classPathEntry
            location="C:\Users\admin\.m2\repository\mysql\mysql-connector-java\5.1.38\mysql-connector-java-5.1.38.jar" />
    
        <context id="context1">
            <commentGenerator>
                <!-- 是否去除自動(dòng)生成的注釋 true:是 : false:否 -->
                <property name="suppressAllComments" value="true" />
            </commentGenerator>
            <!-- 配置連接類(lèi)和數(shù)據(jù)庫(kù)賬號(hào)密碼 -->
            <jdbcConnection connectionURL="jdbc:mysql://127.0.0.1:3306/myspring"
                driverClass="com.mysql.jdbc.Driver" userId="test" password="o34rWayJPPHgudtL" />
            <!-- 配置生成類(lèi)的存放包名 -->
            <javaModelGenerator targetPackage="me.laiyijie.demo.domain"
                targetProject="demo" />
            <sqlMapGenerator targetPackage="me.laiyijie.demo.mapper"
                targetProject="demo" />
            <javaClientGenerator targetPackage="me.laiyijie.demo.dao"
                targetProject="demo" type="XMLMAPPER" />
    
            <!-- 需要生成表 -->
            <table schema="myspring" tableName="account" domainObjectName="Account">
                <property name="useActualColumnNames" value="true" />
            </table>
    
        </context>
    </generatorConfiguration>  
  • 右鍵mybatisGenerator.xml> Run as> Mybatis Generator 生成成功规辱!

詳細(xì)配置請(qǐng)參考MybatisGenerator官方文檔

下面這一步就是配置Spring連接數(shù)據(jù)庫(kù):

root-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:task="http://www.springframework.org/schema/task"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

    <context:component-scan base-package="me.laiyijie.demo"></context:component-scan>

    <bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource"
        p:driverClassName="com.mysql.jdbc.Driver"
        p:url="jdbc:mysql://127.0.0.1:3306/myspring"
        p:username="test" p:password="o34rWayJPPHgudtL" />
        
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
        p:dataSource-ref="mysqlDataSource" p:mapperLocations="classpath:me/laiyijie/demo/mapper/*.xml" />

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
        p:sqlSessionFactoryBeanName="sqlSessionFactory" p:basePackage="me.laiyijie.demo.dao" />

</beans>  

新增的配置的解釋如下:

  • 配置數(shù)據(jù)源(數(shù)據(jù)庫(kù)賬密等)

    <bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource"
    p:driverClassName="com.mysql.jdbc.Driver"
    p:url="jdbc:mysql://127.0.0.1:3306/myspring"
    p:username="test" p:password="o34rWayJPPHgudtL" />

  • 配置MybatissqlSessionFactoryMapperScannerConfigurer(其實(shí)就是用于掃描所有*.xml配置文件并且生成與接口*Mapper對(duì)應(yīng)的實(shí)現(xiàn)類(lèi)的Bean,這也是為什么可以使用@Autowired來(lái)加載AccountMapper這個(gè)接口的原因栽燕!

      <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
      p:dataSource-ref="mysqlDataSource" p:mapperLocations="classpath:me/laiyijie/demo/mapper/*.xml" />  
    
      <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
          p:sqlSessionFactoryBeanName="sqlSessionFactory" p:basePackage="me.laiyijie.demo.dao" />  
    

三條配置罕袋,一點(diǎn)兒也不麻煩!

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>me.laiyijie</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <dependencies>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.2.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.2.RELEASE</version>
        </dependency>

        <!-- mybatis-Spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
    </dependencies>
</project>

新增依賴(lài):

  • spring-jdbc spring對(duì)數(shù)據(jù)庫(kù)查詢的支持
  • commons-dbcp 配置數(shù)據(jù)源中的org.apache.commons.dbcp.BasicDataSource來(lái)源碍岔,數(shù)據(jù)連接池
  • mybatis-spring root-context.xml 中的使用的兩個(gè)類(lèi)出自這里
  • mybatis mybatis框架
  • mysql-connector-java 連接mysql數(shù)據(jù)庫(kù)用的驅(qū)動(dòng)

小結(jié)

  • Mybatis是一種ORM框架浴讯,ORM的功能也就是把數(shù)據(jù)庫(kù)的表映射為對(duì)象便于操作。
  • 通過(guò) mybatis-spring包使得Mybatis可以在Spring中使用
  • 數(shù)據(jù)源的連接是依賴(lài)于實(shí)用的數(shù)據(jù)庫(kù)付秕,本文使用的Mysql因此需要引入 mysql-connector
  • MybatisGenerator產(chǎn)生的類(lèi)和方法涵蓋了單表的所有操作兰珍,可以解決絕大部分?jǐn)?shù)據(jù)庫(kù)操作問(wèn)題

附:

數(shù)據(jù)源配置建議如下(解決Mysql八小時(shí)問(wèn)題以及utf-8編碼問(wèn)題):

<bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver"
    p:url="jdbc:mysql://127.0.0.1:3306/myspring?useUnicode=true&characterEncoding=utf8"
    p:username="test" p:password="o34rWayJPPHgudtL" p:testWhileIdle="true"
    p:testOnBorrow="false" p:validationQuery="SELECT 1"
    p:timeBetweenEvictionRunsMillis="7200000" p:numTestsPerEvictionRun="50" />
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市询吴,隨后出現(xiàn)的幾起案子掠河,更是在濱河造成了極大的恐慌,老刑警劉巖猛计,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唠摹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡奉瘤,警方通過(guò)查閱死者的電腦和手機(jī)勾拉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)煮甥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人藕赞,你說(shuō)我怎么就攤上這事成肘。” “怎么了斧蜕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵双霍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我批销,道長(zhǎng)洒闸,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任均芽,我火速辦了婚禮丘逸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掀宋。我一直安慰自己深纲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布布朦。 她就那樣靜靜地躺著囤萤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪是趴。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天澄惊,我揣著相機(jī)與錄音唆途,去河邊找鬼。 笑死掸驱,一個(gè)胖子當(dāng)著我的面吹牛肛搬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播毕贼,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼温赔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鬼癣?” 一聲冷哼從身側(cè)響起陶贼,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎待秃,沒(méi)想到半個(gè)月后拜秧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡章郁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年枉氮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡聊替,死狀恐怖楼肪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惹悄,我是刑警寧澤淹辞,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站俘侠,受9級(jí)特大地震影響象缀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜爷速,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一央星、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惫东,春花似錦莉给、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至滞时,卻和暖如春叁幢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坪稽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工曼玩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窒百。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓黍判,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親篙梢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子顷帖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)渤滞,斷路器贬墩,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評(píng)論 6 342
  • jHipster - 微服務(wù)搭建 CC_簡(jiǎn)書(shū)[http://www.reibang.com/u/be0d56c4...
    quanjj閱讀 795評(píng)論 0 2
  • (在一個(gè)心理電臺(tái)聽(tīng)到的這篇文章,當(dāng)時(shí)正好看了這部電影蔼水,個(gè)人很喜歡震糖,于是分享一下) 梁朝偉說(shuō)過(guò):男人如果愛(ài)你,那你就...
    木橙小姐閱讀 445評(píng)論 0 1
  • /** * 對(duì)象轉(zhuǎn)化為數(shù)組 * @param object $obj 對(duì)象 * @return array 數(shù)組 ...
    上善若水_900e閱讀 162評(píng)論 0 0