【Mybatis學習】註解方式使用講解
MyBatis註解
MyBatis可以利用SQL對映檔案來配置,也可以利用Annotation來設定。MyBatis提供的一些基本註解如下表所示。
註解 |
目標 |
相應的XML |
描述 |
@CacheNamespace |
類 |
<cache> |
為給定的名稱空間(比如類)配置快取。屬性: implemetation,eviction, flushInterval , size 和 readWrite 。 |
@CacheNamespaceRef |
類 |
<cacheRef> |
參照另外一個名稱空間的快取來使用。 屬性:value,也就是類的完全限定名。 |
@ConstructorArgs |
方法 |
<constructor> |
收集一組結果傳遞給物件構造方法。 屬性:value,是形式引數的陣列 |
@Arg |
方法 |
<arg> <idArg> |
單獨的構造方法引數,是ConstructorArgs 集合的一部分。屬性:id,column,javaType,typeHandler。 id屬性是布林值,來標識用於比較的屬性,和<idArg>XML 元素相似 |
@TypeDiscriminator |
方法 |
<discriminator> |
一組例項值被用來決定結果對映的表 現。屬性:Column, javaType , jdbcType typeHandler,cases。 cases屬性就是例項的陣列。 |
@Case |
方法 |
<case> |
單獨例項的值和它對應的對映。屬性:value ,type ,results 。 Results 屬性是結果陣列,因此這個註解和實際的ResultMap 很相似,由下面的 Results註解指定 |
@Results |
方法 |
<resultMap> |
結果對映的列表,包含了一個特別結果 列如何被對映到屬性或欄位的詳情。 屬性:value ,是Result註解的陣列 |
@Result |
方法 |
<result> <id> |
在列和屬性或欄位之間的單獨結果映 射。屬性:id ,column , property , javaType ,jdbcType ,type Handler , one,many。id 屬性是一個布林值,表 示了應該被用於比較的屬性。one 屬性是單獨的聯絡,和 <association> 相似,而many 屬性是對集合而言的,和 <collection>相似。 |
@One |
方法 |
<association> |
複雜型別的單獨屬性值對映。屬性: select,已對映語句(也就是對映器方 法)的完全限定名,它可以載入合適類 型的例項。注意:聯合對映在註解 API 中是不支援的。 |
@Many |
方法 |
<collection> |
複雜型別的集合屬性對映。屬性: select,是對映器方法的完全限定名,它可載入合適型別的一組例項。注意:聯合對映在 Java註解中是不支援的。 |
@Options |
方法 |
對映語句的屬性 |
這個註解提供訪問交換和配置選項的寬廣範圍,它們通常在對映語句上作為屬性出現。而不是將每條語句註解變複雜,Options 註解提供連貫清晰的方式來訪問它們。屬性:useCache=true, flushCache=false, resultSetType=FORWARD_ONLY, statementType=PREPARED, fetchSize= -1,timeout=-1 , useGeneratedKeys=false , keyProperty=”id“。 理解Java 註解是很重要的,因為沒有辦法來指定“null ”作為值。因此,一旦你使用了 Options註解,語句就受所有預設值的支配。要注意什麼樣的預設值來避免不期望的行為 |
@Insert @Update @Delete |
方法 |
<insert> <update> <delete> |
這些註解中的每一個代表了執行的真實 SQL。它們每一個都使用字串陣列(或單獨的字串)。如果傳遞的是字串陣列,它們由每個分隔它們的單獨空間串聯起來。屬性:value,這是字串陣列用來組成單獨的SQL語句 |
@InsertProvider @UpdateProvider @DeleteProvider @SelectProvider |
方法 |
<insert> <update> <delete> <select> 允許建立動態 SQL。 |
這些可選的SQL註解允許你指定一個 類名和一個方法在執行時來返回執行 的SQL。基於執行的對映語句, MyBatis 會例項化這個類,然後執行由 provider 指定的方法. 這個方法可以選擇性的接 受引數物件作為它的唯一引數,但是必 須只指定該引數或者沒有引數。屬性: type,method。type 屬性是類的完全限定名。method 是該類中的那個方法名。 |
@Param |
引數 |
N/A |
當對映器方法需多個引數,這個註解可以被應用於對映器方法引數來給每個引數一個名字。否則,多引數將會以它們的順序位置來被命名。比如 #{1},#{2} 等,這是預設的。 使用@Param(“person”),SQL中引數應該被命名為#{person}。 |
使用方法
1.insert方法
我們可以使用@Insert註解來定義一個INSERT對映語句:package com.mybatis3.mappers;
public interface StudentMapper
{
@Insert("INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,ADDR_ID, PHONE)
VALUES(#{studId},#{name},#{email},#{address.addrId},#{phone})")
int insertStudent(Student student);
使用了@Insert註解的方法將返回insert語句執行後影響的行數。
2.自動生成主鍵
使用@Options註解的userGeneratedKeys 和keyProperty屬性讓資料庫產生auto_increment(自增長)列的值,然後將生成的值設定到輸入引數物件的屬性中。@Insert("INSERT INTO STUDENTS(NAME,EMAIL,ADDR_ID, PHONE)
VALUES(#{name},#{email},#{address.addrId},#{phone})")
@Options(useGeneratedKeys = true, keyProperty = "studId")
int insertStudent(Student student);
這裡stu_id主鍵列值將會通過MySQL資料庫自動生成。並且生成的值將會被設定到student物件的studId屬性中。
mapper.insertStudent(student);
int studentId = student.getStudId();
3.update方法
可以使用@Update註解來定義一個UPDATE對映語句,如下所示:
@Update("UPDATE STUDENTS SET NAME=#{name}, EMAIL=#{email},
PHONE=#{phone} WHERE STUD_ID=#{studId}")
int updateStudent(Student student);
使用了@Update的方法將會返回執行了update語句後影響的行數。
4.delete方法
可以使用@Delete 註解來定義一個DELETE對映語句,如下所示:
@Delete("DELETE FROM STUDENTS WHERE STUD_ID=#{studId}")
int deleteStudent(int studId);
使用了@Delete的方法將會返回執行了update語句後影響的行數。
5.select方法
可以使用@ Select註解來定義一個SELECT對映語句。public interface StudentMapper
{
@Select("SELECT STUD_ID AS STUDID, NAME, EMAIL, PHONE FROM
STUDENTS WHERE STUD_ID=#{studId}")
Student findStudentById(Integer studId);
}
6.結果對映
可以將查詢結果通過別名或者是@Results註解與JavaBean屬性對映起來。
@Select("SELECT * FROM STUDENTS WHERE STUD_ID=#{studId}")
@Results(
{
@Result(id = true, column = "stud_id", property = "studId"),
@Result(column = "name", property = "name"),
@Result(column = "email", property = "email"),
@Result(column = "addr_id", property = "address.addrId")
})
Student findStudentById(int studId);
@Select("SELECT * FROM STUDENTS")
@Results(
{
@Result(id = true, column = "stud_id", property = "studId"),
@Result(column = "name", property = "name"),
@Result(column = "email", property = "email"),
@Result(column = "addr_id", property = "address.addrId")
})
List<Student> findAllStudents();
7.ResultMap
6中的兩個@Results配置完全相同,但是必須得重複它。這裡有一個解決方法。我們可以建立一個對映器Mapper配置檔案, 然後配置<resultMap>元素,然後使用@ResultMap註解引用此<resultMap>。在StudentMapper.xml中定義一個ID為StudentResult的<resultMap>。
<mapper namespace="com.mybatis3.mappers.StudentMapper">
<resultMap type="Student" id="StudentResult">
<id property="studId" column="stud_id" />
<result property="name" column="name" />
<result property="email" column="email" />
<result property="phone" column="phone" />
</resultMap>
</mapper>
然後使用@ResultMap引用名為StudentResult的resultMap。
@Select("SELECT * FROM STUDENTS WHERE STUD_ID=#{studId}")
@ResultMap("com.mybatis3.mappers.StudentMapper.StudentResult")
Student findStudentById(int studId);
@Select("SELECT * FROM STUDENTS")
@ResultMap("com.mybatis3.mappers.StudentMapper.StudentResult")
List<Student> findAllStudents();
8.一對一對映 MyBatis提供了@One註解來使用巢狀select語句(Nested-Select)載入一對一關聯查詢資料。讓我們看看怎樣使用@One註解獲取學生及其地址資訊。
@Select("SELECT ADDR_ID AS ADDRID, STREET, CITY, STATE, ZIP, COUNTRY
FROM ADDRESSES WHERE ADDR_ID=#{id}")
Address findAddressById(int id);
@Select("SELECT * FROM STUDENTS WHERE STUD_ID=#{studId} ")
@Results(
{
@Result(id = true, column = "stud_id", property = "studId"),
@Result(column = "name", property = "name"),
@Result(column = "email", property = "email"),
@Result(property = "address", column = "addr_id",
one = @One(select = "com.mybatis3.mappers.StudentMapper.
findAddressById"))
})
Student selectStudentWithAddress(int studId);
這裡我們使用了@One註解的select屬性來指定一個使用了完全限定名的方法上,該方法會返回一個Address物件。使用column=”addr_id”,則STUEDNTS表中列addr_id的值將會作為輸入引數傳遞給findAddressById()方法。如果@OneSELECT查詢返回了多行結果,則會丟擲TooManyResultsException異常。
我們可以通過基於XML的對映器配置,使用巢狀結果ResultMap來載入一對一關聯的查詢。而MyBatis3.2.2版本,並沒有對應的註解支援。但是我們可以在對映器Mapper配置檔案中配置<resultMap>並且使用@ResultMap註解來引用它。
在StudentMapper.xml中配置<resultMap>,如下所示:
<mapper namespace="com.mybatis3.mappers.StudentMapper">
<resultMap type="Address" id="AddressResult">
<id property="addrId" column="addr_id" />
<result property="street" column="street" />
<result property="city" column="city" />
<result property="state" column="state" />
<result property="zip" column="zip" />
<result property="country" column="country" />
</resultMap>
<resultMap type="Student" id="StudentWithAddressResult">
<id property="studId" column="stud_id" />
<result property="name" column="name" />
<result property="email" column="email" />
<association property="address" resultMap="AddressResult" />
</resultMap>
</mapper>
@Select("select stud_id, name, email, a.addr_id, street, city,
state, zip, country" + " FROM students s left outer join addresses a
on s.addr_id=a.addr_id" + " where stud_id=#{studId} ")
@ResultMap("com.mybatis3.mappers.StudentMapper.
StudentWithAddressResult")
Student selectStudentWithAddress(int id);
9.一對多對映
MyBatis提供了@Many註解,用來使用巢狀Select語句載入一對多關聯查詢。@Select("select addr_id as addrId, street, city, state, zip,
country from addresses where addr_id=#{id}")
Address findAddressById(int id);
@Select("select * from courses where tutor_id=#{tutorId}")
@Results(
{
@Result(id = true, column = "course_id", property = "courseId"),
@Result(column = "name", property = "name"),
@Result(column = "description", property = "description"),
@Result(column = "start_date" property = "startDate"),
@Result(column = "end_date" property = "endDate")
})
List<Course> findCoursesByTutorId(int tutorId);
@Select("SELECT tutor_id, name as tutor_name, email, addr_id
FROM tutors where tutor_id=#{tutorId}")
@Results(
{
@Result(id = true, column = "tutor_id", property = "tutorId"),
@Result(column = "tutor_name", property = "name"),
@Result(column = "email", property = "email"),
@Result(property = "address", column = "addr_id",
one = @One(select = " com.mybatis3.
mappers.TutorMapper.findAddressById")),
@Result(property = "courses", column = "tutor_id",
many = @Many(select = "com.mybatis3.mappers.TutorMapper.
findCoursesByTutorId"))
})
Tutor findTutorById(int tutorId);
這裡我們使用了@Many註解的select屬性來指向一個完全限定名稱的方法,該方法將返回一個List<Course>物件。使用column=”tutor_id”,TUTORS表中的tutor_id列值將會作為輸入引數傳遞給findCoursesByTutorId()方法。
這裡使用了@Many註解的select屬性來指向一個完全限定名稱的方法,該方法將返回一個List<Course>物件。使用column=”tutor_id”,TUTORS表中的tutor_id列值將會作為輸入引數傳遞給findCoursesByTutorId()方法。
我們可以通過基於XML的對映器配置,使用巢狀結果ResultMap來載入一對多關聯的查詢。而MyBatis3.2.2版本,並沒有對應的註解支援。但是我們可以在對映器Mapper配置檔案中配置<resultMap>並且使用@ResultMap註解來引用它。
在TutorMapper.xml中配置<resultMap>,如下所示:
<mapper namespace="com.mybatis3.mappers.TutorMapper">
<resultMap type="Address" id="AddressResult">
<id property="addrId" column="addr_id" />
<result property="street" column="street" />
<result property="city" column="city" />
<result property="state" column="state" />
<result property="zip" column="zip" />
<result property="country" column="country" />
</resultMap>
<resultMap type="Course" id="CourseResult">
<id column="course_id" property="courseId" />
<result column="name" property="name" />
<result column="description" property="description" />
<result column="start_date" property="startDate" />
<result column="end_date" property="endDate" />
</resultMap>
<resultMap type="Tutor" id="TutorResult">
<id column="tutor_id" property="tutorId" />
<result column="tutor_name" property="name" />
<result column="email" property="email" />
<association property="address" resultMap="AddressResult" />
<collection property="courses" resultMap="CourseResult" />
</resultMap>
</mapper>
@Select("SELECT T.TUTOR_ID, T.NAME AS TUTOR_NAME, EMAIL,
A.ADDR_ID, STREET, CITY, STATE, ZIP, COUNTRY, COURSE_ID, C.NAME,
DESCRIPTION, START_DATE, END_DATE FROM TUTORS T LEFT OUTER
JOIN ADDRESSES A ON T.ADDR_ID=A.ADDR_ID LEFT OUTER JOIN COURSES
C ON T.TUTOR_ID=C.TUTOR_ID WHERE T.TUTOR_ID=#{tutorId}")
@ResultMap("com.mybatis3.mappers.TutorMapper.TutorResult")
Tutor selectTutorById(int tutorId);
動態SQL
有時候我們需要根據輸入條件動態地構建SQL語句。MyBatis提供了各種註解如@InsertProvider,@UpdateProvider
@DeleteProvider和@SelectProvider,來幫助構建動態SQL語句,然後讓MyBatis執行這些SQL語句。
[email protected]
現在來看一個使用@SelectProvider註解來建立一個簡單的SELECT對映語句的例子。 建立一個TutorDynaSqlProvider.java類,以及findTutorByIdSql()方法,如下所示:public class TutorDynaSqlProvider
{
public String findTutorByIdSql(int tutorId)
{
return "SELECT TUTOR_ID AS tutorId, NAME, EMAIL FROM TUTORS
WHERE TUTOR_ID=" + tutorId;
}
}
然後建立一個對映語句
@SelectProvider(type=TutorDynaSqlProvider.class, method="findTutorByIdSql")
Tutor findTutorById(int tutorId);
這裡我們使用了@SelectProvider來指定了一個類,及其內部的方法,用來提供需要執行的SQL語句。
但是使用字串拼接的方法構建SQL語句是非常困難的,並且容易出錯。所以MyBaits提供了一個SQL工具類不使用字串拼接的方式,簡化構造動態SQL語句。
現在,來看看如何使用org.apache.ibatis.jdbc.SQL工具類來準備相同的SQL語句。
public class TutorDynaSqlProvider
{
public String findTutorByIdSql(final int tutorId)
{
return new SQL()
{
{
SELECT("tutor_id as tutorId, name, email");
FROM("tutors");
WHERE("tutor_id=" + tutorId);
}
} .toString();
}
}
SQL工具類會處理以合適的空格字首和字尾來構造SQL語句。
動態SQL provider方法可以接收以下其中一種引數:
- 無引數
- 和對映器Mapper介面的方法同類型的引數
- java.util.Map
public String findTutorByIdSql()
{
return new SQL()
{
{
SELECT("tutor_id as tutorId, name, email");
FROM("tutors");
WHERE("tutor_id = #{tutorId}");
}
} .toString();
}
這裡我們沒有使用輸入引數構造SQL語句,所以它可以是一個無參方法。 如果對映器Mapper介面方法只有一個引數,那麼可以定義SQLProvider方法,它接受一個與Mapper介面方法相同型別的引數。 例如對映器Mapper介面有如下定義:
Tutor findTutorById(int tutorId);
這裡findTutorById(int)方法只有一個int型別的引數。我們可以定義findTutorByIdSql(int)方法作為SQL provider方法。
public String findTutorByIdSql(final int tutorId)
{
return new SQL()
{
{
SELECT("tutor_id as tutorId, name, email");
FROM("tutors");
WHERE("tutor_id=" + tutorId);
}
} .toString();
}
如果對映器Mapper介面有多個輸入引數,我們可以使用引數型別為java.util.Map的方法作為SQLprovider方法。然後對映器Mapper介面方法所有的輸入引數將會被放到map中,以param1,param2等等作為key,將輸入引數按序作為value。你也可以使用0,1,2等作為key值來取的輸入引數。
@SelectProvider(type = TutorDynaSqlProvider.class,
method = "findTutorByNameAndEmailSql")
Tutor findTutorByNameAndEmail(String name, String email);
public String findTutorByNameAndEmailSql(Map<String, Object> map)
{
String name = (String) map.get("param1");
String email = (String) map.get("param2");
//you can also get those values using 0,1 keys
//String name = (String) map.get("0");
//String email = (String) map.get("1");
return new SQL()
{
{
SELECT("tutor_id as tutorId, name, email");
FROM("tutors");
WHERE("name=#{name} AND email=#{email}");
}
} .toString();
}
SQL工具類也提供了其他的方法來表示JOINS,ORDER_BY,GROUP_BY等等。 讓我們看一個使用LEFT_OUTER_JOIN的例子:
public class TutorDynaSqlProvider
{
public String selectTutorById()
{
return new SQL()
{
{
SELECT("t.tutor_id, t.name as tutor_name, email");
SELECT("a.addr_id, street, city, state, zip, country");
SELECT("course_id, c.name as course_name, description,
start_date, end_date");
FROM("TUTORS t");
LEFT_OUTER_JOIN("addresses a on t.addr_id=a.addr_id");
LEFT_OUTER_JOIN("courses c on t.tutor_id=c.tutor_id");
WHERE("t.TUTOR_ID = #{id}");
}
} .toString();
}
}
public interface TutorMapper
{
@SelectProvider(type = TutorDynaSqlProvider.class,
method = "selectTutorById")
@ResultMap("com.mybatis3.mappers.TutorMapper.TutorResult")
Tutor selectTutorById(int tutorId);
}
由於沒有支援使用內嵌結果ResultMap的一對多關聯對映的註解支援,我們可以使用基於XML的<resultMap>配置,然後與@ResultMap對映。
[email protected]
可以使用@InsertProvider註解建立動態的INSERT語句,如下所示:public class TutorDynaSqlProvider
{
public String insertTutor(final Tutor tutor)
{
return new SQL()
{
{
INSERT_INTO("TUTORS");
if (tutor.getName() != null)
{
VALUES("NAME", "#{name}");
}
if (tutor.getEmail() != null)
{
VALUES("EMAIL", "#{email}");
}
}
} .toString();
}
}
public interface TutorMapper
{
@InsertProvider(type = TutorDynaSqlProvider.class,
method = "insertTutor")
@Options(useGeneratedKeys = true, keyProperty = "tutorId")
int insertTutor(Tutor tutor);
}
[email protected] 可以通過@UpdateProvider註解建立UPDATE語句,如下所示:
public class TutorDynaSqlProvider
{
public String updateTutor(final Tutor tutor)
{
return new SQL()
{
{
UPDATE("TUTORS");
if (tutor.getName() != null)
{
SET("NAME = #{name}");
}
if (tutor.getEmail() != null)
{
SET("EMAIL = #{email}");
}
WHERE("TUTOR_ID = #{tutorId}");
}
} .toString();
}
}
public interface TutorMapper
{
@UpdateProvider(type = TutorDynaSqlProvider.class,
method = "updateTutor")
int updateTutor(Tutor tutor);
}
4.DeleteProvider 可以使用@DeleteProvider註解建立動態地DELETE語句,如下所示:
public class TutorDynaSqlProvider
{
public String deleteTutor(int tutorId)
{
return new SQL()
{
{
DELETE_FROM("TUTORS");
WHERE("TUTOR_ID = #{tutorId}");
}
} .toString();
}
}
public interface TutorMapper
{
@DeleteProvider(type = TutorDynaSqlProvider.class,
method = "deleteTutor")
int deleteTutor(int tutorId);
}
注意事項:
- 在利用註解配置對映器介面的時候,必須要通過 sqlSessionFactory.getConfiguration().addMapper(IBlogDAO.class);來對給對映器介面註冊,如果對映器介面中使用了@ResultMap註解,則由於已經在mybatis-config.xml配置了Mapper,則就不需要再次在程式碼中新增mapper。
- 當方法有多個引數的時候,為了與SQL語句中的#{}對應,一般可以使用@Param("")來為每個引數命別名,使得該別名與#{}對應。當引數只有一個的時候,不需要別名。
- 在進行更新刪除新增的時候,如果傳遞的是一個實體物件,則SQL可以直接使用實體的屬性。
- 對映器介面呼叫SqlBuilder中的方法,都是將引數轉換為Map中的key,可以在SqlBuilder的方法中利用Map來獲取傳遞的引數值,進而進行邏輯操作判斷。
- 註解中對於返回多條記錄的查詢可以直接利用@Results和@Result來配置對映,或者利用@ResultMap來呼叫SQL配置檔案中的ResultMap。
相關推薦
【Mybatis學習】註解方式使用講解
MyBatis註解 MyBatis可以利用SQL對映檔案來配置,也可以利用Annotation來設定。MyBatis提供的一些基本註解如下表所示。 註解 目標 相
【MyBatis學習】:通過自動回覆機器人學習MyBatis(一)
自動回覆機器人案例分析基本功能: 接收發送指令; 根據指令自動回覆對應的內容; 專案使用技術: JSP+Servlet+JDBC 專案使用資料庫中的資料表message
【Mybatis學習】框架中使用到的設計模式
框架中是由SqlSessionFactory建立SqlSession的,也即會話,類似JDBC中的Connection。在每次進行程式-資料庫操作時都需要建立SqlSession,因此該SqlSessionFactory會工作在整個生命週期內,如果每次進行操作時都新建它時會極大地消耗連線資源,而且職責也唯一,
【Mybatis學習】Mybatis的解析和執行簡要介紹
Mybatis執行原理簡要分析 1.SqlSessionFactory的構建 SqlsessionFactory主要用來建立SqlSession,為了構建SqlsessionFactory,需要提供配置檔案以及相關引數。 構建主要分為2步: 解析配置檔案並生成Config
【Hibernate學習】 —— 抓取策略(註解方式)
屬性的方法 ould per hql 項目 操作記錄 新建 應用程序 span 當應用程序須要在關聯關系間進行導航的時候。hibernate怎樣獲取關聯對象的策略。 抓取策略的方式: FetchType.LAZY:懶載入。載入一個實體時。定
【MyBatis學習18】使用註解配置Mapper
MyBatis支援使用註解來配置對映的sql語句,這樣可以省掉對映器xml檔案。 一、對映語句 1、insert 比如入門例項中的: public int insert(User user) throws Exception;11<insert id="in
【機器學習】如何簡單形象又有趣地講解神經網絡是什麽?
二層 紐約大學 都是 不定 一個 移動 機器學習 mat weixin 【機器學習】如何簡單形象又有趣地講解神經網絡是什麽? https://mp.weixin.qq.com/s/jAcInAWI6cVvsnevoHIShQ 作者:王小龍 鏈接:www.zhihu.
【mysql學習】linux安裝mysql,使用install指令碼方式 (二)
本文介紹Linux下MySQL 5.6.27 安裝; 1、下載地址https://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.27-linux-glibc2.5-x86_64.tar.gz 2、解壓tar -zxf mysql-5.6.27-linux-glibc
【mysql學習】linux安裝mysql,使用install腳本方式 (二)
6.2 學習 sta ini 開機 serve 方式 mysql學習 ref 本文介紹Linux下MySQL 5.6.27 安裝; 1、下載地址https://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.27-linux-glibc
【MyBatis學習15】使用MyBatis Generator自動建立程式碼
這兩天需要用到MyBatis的程式碼自動生成的功能,由於MyBatis屬於一種半自動的ORM框架,所以主要的工作就是配置Mapping對映檔案,但是由於手寫對映檔案很容易出錯,所以可利用MyBatis生成器自動生成實體類、DAO介面和Mapping對映檔案。這樣可以省去很多的功夫,將生成的程
【論文復現】VGG框架講解以及VGG16復現,遷移學習自己的資料。tensorflow。
論文連結,至於論文我沒仔細看,我只學習了其框架。 但是需要注意的是: 在訓練期間,ConvNets的輸入是固定大小的224×224 RGB影象。 唯一預處理是從每個畫素中減去在訓練集上計算的平均RGB值,(eg:VGG16是:VGG_MEAN = tf.constant([123.68, 1
【機器學習】EM演算法詳細推導和講解
眾所周知,極大似然估計是一種應用很廣泛的引數估計方法。例如我手頭有一些東北人的身高的資料,又知道身高的概率模型是高斯分佈,那麼利用極大化似然函式的方法可以估計出高斯分佈的兩個引數,均值和方差。這個方法基本上所有概率課本上都會講,我這就不多說了,不清楚的請百度。 然而現在我面臨的是這種情況,我
@[TOC](這可能是史上講解最細緻的springboot教程【免費學習】定期更新)
01.springboot介紹 02.微服務介紹 03.springboot第一個例子 04.Springboot中的常用註解分析 05.springboot啟動配置分析 06.springboot熱部署 07.springboot的yaml語法 08.springboot屬性配置檔案方式詳解 [email&
【Mybatis學習筆記】01—Mybatis入門
什麼是Mybatis: Mybatis是一款持久層框架。用於程式與資料庫的之間的互動。 Mybatis和大名鼎鼎的全自動持久層框架Hibernate最大不同的地方在於,Mybatis是半自動的,由開發人員來定製sql語句。 並且相比較Hibernate而言Mybatis
【轉載】【機器學習】EM演算法詳細推導和講解
今天不太想學習,炒個冷飯,講講機器學習十大演算法裡有名的EM演算法,文章裡面有些個人理解,如有錯漏,還請讀者不吝賜教。 眾所周知,極大似然估計是一種應用很廣泛的引數估計方法。例如我手頭有一些東北人的身高的資料,又知道身高的概率模型是高斯分佈,那麼利用極大化似然函式的
【 Linux學習】Linux環境下利用wget下載https連結內容時報錯:無法本地校驗頒發者的許可權。 要以不安全的方式連線至 ,使用“--no-check-certificate”
一、問題描述 今天在CenterOS系統上使用wget命令下載一個https連結的內容時報錯,如下所示: [[email protected] /]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-
【Spring學習】spring註解自動注入bean
Spring mvc註解用到的配置: <!-- 啟用spring mvc 註解 --> <context:annotation-config /> <context:component-scan base-package
【MyBatis學習筆記】5:認識使用typeHandlers配置型別處理器
簡述 註冊了的型別處理器會用於處理下面兩種情形: 為PreparedStatement設定一個引數,將引數從Java型別轉為JDBC型別。 從ResultSet中取出一個值,將結果從JDBC型別轉為Java型別。 型別處理器可分為以下兩類: MyB
【機器學習】【層次聚類演算法-1】HCA(Hierarchical Clustering Alg)的原理講解 + 示例展示數學求解過程
層次聚類(Hierarchical Clustering)是聚類演算法的一種,通過計算不同類別資料點間的相似度來建立一棵有層次的巢狀聚類樹。在聚類樹中,不同類別的原始資料點是樹的最低層,樹的頂層是一個聚類的根節點。建立聚類樹有自下而上合併和自上而下分裂兩種方法,本篇文章介紹合併方法。層次聚類的合併演算法層次聚
【Mybatis學習筆記】04 Mybatis分頁-多引數傳遞
2018.5.18需求:查詢分頁資料方法一:使用索引按照引數的順序,從0開始mapper:介面:引數名任意方法二:使用註解、mapper:介面:註解的value值要和mapper的佔位引數一致。方法三:使用map(常用)mapper中的引數佔位符要和測試中的map的key,v