Mybatis框架

Mybatis框架
? ? ? ? Mybatis的含義:Mybatis框架是一個持久層框架,幾乎解決了jdbc代碼在手動設置參數和對結果集的手動獲取問題,原本是apache公司的開源項目,最后轉給Google公司。Mybatis會將參數封裝在一個對象中傳遞給數據庫,并將sql語句執行后的結果集封裝成對象。

? ? ? ? 它提供全局配置文件,建立與數據庫的連接;將接口進行分裝并提供類和方法實現對數據庫的鏈接和操作;對sql語句執行后的結果進行高級映射并封裝成對象;支持動態sql;支持緩存。

? ? ? ? Mybatis中存在自動映射,因為當在數據庫中查詢的表的屬性名和類中的屬性名完全相同時才會自動映射并封裝,所以需要保證類中的屬性和數據庫中的屬性名相同;如果類中的屬性為私有屬性,那么類中必須實現get和set方法;還需要保證類中要有無參構造方法,由于mybatis在數據庫中查詢數據后需要創建對象,調用對應類的無參構造方法,如果找不到對應的無參構造方法,mybatis就會報錯;當數據庫中的屬性名存在駝峰命名,mybatis也是會進行自動映射,但前提是需要開啟屬性mapUnderscoreToCamelCase,這個屬性需要在全局配置文件中設置,表示是否開啟駝峰命名的自動映射,true為開啟,開啟后例如在數據庫中的屬性名為student_id,那么類中的屬性只要設置為studentId這種駝峰命名的方式就可以進行自動映射。

搭建Mybatis框架
? ? ? ? 在數據庫中創建表,并在創建的項目中創建對應表的模型類;例如在數據庫中創建一個學生表,那么為了方便理解我們也在項目中創建一個學生類,如圖所示

? ? ? ? 我們通常將類中所有的屬性都定義為其包裝類類型,這樣方便后面動態查詢條件的判斷

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
? PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
? "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
? <environments default="development">
? ? <environment id="development">
? ? ? <transactionManager type="JDBC"/>
? ? ? <dataSource type="POOLED">
? ? ? ? <property name="driver" value="${driver}"/>
? ? ? ? <property name="url" value="${url}"/>
? ? ? ? <property name="username" value="${username}"/>
? ? ? ? <property name="password" value="${password}"/>
? ? ? </dataSource>
? ? </environment>
? </environments>
? <mappers>
? ? <mapper resource="org/mybatis/example/BlogMapper.xml"/>
? </mappers>
</configuration>

? ? ? ? 1、在項目的pom.xml配置文件中導入mybatis的jar包

? ? ? ? 2、配置全局配置文件(數據庫連接信息)

? ? ? ? 在resources目錄創建一個.xml文件用來配置全局文件,并在文件中寫入配置信息

? ? ? ? 其中<dataSource>標簽用來配置連接數據庫的配置信息,其中driver的值為com.mysql.cj.jdbc.Driver,url的值為jdbc:mysql://127.0.0.1:3306/mybatisdb?serverTimezone=Asia/Shanghai,username和password則為自己連接數據庫的用戶名和密碼,這里我使用的數據庫是SQLyog

? ? ? ? <dataSource type="POOLED">如果type為unpooled那么表示獲取連接時不是從連接池中獲取,而是返回一個新建的連接;如果type為pooled

? ? ? ? (1)?先先判斷空閑連接池內有沒有空閑連接,如果還有則給你返回?個空閑連接。

? ? ? ? (2)、如果沒有空閑連接,則去活動連接池內看看還有沒有位置,如果還有,則new?個連接給你返回

? ? ? ? (3)、如果活動連接池沒有位置了,則返回在活動連接池使?最久的連接。意思就是給你返回?個在活動連接池內待最久的連接

? ? ? ? <mappers>標簽用來添加映射配置文件,一個映射添加一個<mapper>標簽,標簽中resource屬性表示映射文件對于全局配置文件的相對地址

? ? ? ? 3、寫sql映射,訪問接口

? ? ? ? 在創建映射文件之前需要先創建和映射文件進行綁定的接口,一個映射文件對應一個接口,配個映射配置文件中都需要加上

<?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">
<mapper namespace=""></mapper>
? ? ? ? <mapper>標簽中用來寫sql語句,namespace屬性的值對應和此映射文件所綁定的接口的包名,例如

? ? ? ? 這樣映射文件就和接口進行了綁定,我們還需要在配置文件中獲取連接數據庫的信息以及構建SqlSessionFactory,由于SqlSessionFactory一旦創建就會一直存在于Mybatis的應用過程中,并且由于創建SqlSessionFactory的開銷過大 ,所以我們在構建SqlSessionFactory時只需要創建一次即可,所以我們可以創建一個類并將創建SqlSessionFactory的方法放在這個類的靜態代碼塊中,這樣即使多次調用這個類但是創建SqlSessionFactory只會執行一次。

public class MyBatisUtil {
? ? static SqlSessionFactory sqlSessionFactory = null;
?
? ? static {
? ? ? ? try {
? ? ? ? ? ? // ? ? ? ?將全局配置文件放入到流中
? ? ? ? ? ? InputStream inputStream = Resources.getResourceAsStream("mybatisConfig.xml");
? ? ? ? ? ? // ? ? ? ?與數據庫建立連接
? ? ? ? ? ? sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
?
? ? public SqlSession getSqlSession() {
? ? ? ? return sqlSessionFactory.openSession();//通過SqlSessionFactory對象獲取SqlSession
? ? }
}

? ? ? ? getSqlSession方法時用來通過SqlSessionFactory對象的openSession方法獲取SqlSession對象,我們可以通過SqlSession對象來執行與參數和返回值相匹配的接口

? ? ? ? 如果向執行sql語句,首先要在接口中定義抽象方法,并確定參數列表和返回值;然后在映射文件中寫對應的sql語句,如果為select語句則需要在<select>標簽中書寫sql語句,如果為insert語句則需要在<insert>標簽中書寫sql語句,update和delect語句同理。

public interface StudentDao {
? ? Student find(int id);//查詢通過id查詢學生的信息
}
? ? ? ? sql語句中的id需要與接口中的方法名相同,resultType為返回值類型這里的類型為Student,由于Student為自定義的類型,所以需要寫該類型的包名,#{id}表示傳過來的參數的值

<select id="find" resultType="com.ffyc.mybatisdemo.model.Student">
? ? ? ? select * from student where id = #{id}
</select>
? ? ? ? 以下為具體實現的方法

public void findStudent() {
? ? ? ? SqlSession sqlSession = new MyBatisUtil().getSqlSession();//通過類獲取SqlSession對象
? ? ? ? StudentDao studentDao = sqlSession.getMapper(StudentDao.class);//通過接口的class(類)對象,獲取代理對象,由于接口和映射配置文件綁定,所以可以通過代理對象調用接口中的方法
? ? ? ? Student student = studentDao.find(1);//通過代理對象調用接口中的find方法,并傳入參數1
? ? ? ? System.out.println(sqlSession);
? ? ? ? sqlSession.close();
? ? }
? ? ? ? 4、測試

? ? ? ? 執行方法后的結果如下,得到如下結果需要在Student中實現toString方法

參數傳遞問題
? ? ? ? 與映射器綁定的接口中的方法中的參數可以是任意一個,因為映射器配置文件中的id屬性的值和對應接口的方法名相同,所以同一個接口中的方法不能重名。當方法中的參數為一個時,直接將該參數進行傳遞即可;而當參數為多個時需要使用@Param注解對參數進行綁定,@Param里的值為類中的屬性名,與其綁定的則為形參。

void find(@Param("id")Integer id,@Param("no")Integer no,@Param("name")String name);
? ? ? ? 當接口中的參數過于多時,我們可以將參數封裝在一個對象中,通過傳遞對象來傳遞參數,但是我們還需要在映射器中加入parameterType屬性來說明傳遞的參數的類型。

void find(Student student);
<select id="find" parameterType="Student"></select>
增刪改查
? ? ? ? 當我們對數據庫進行增添操作時,我們先把數據封裝在對象中并將值傳給數據庫中進行操作,此時如果我們還想通過剛新插入的數據的id查詢其它的內容,由于id是自增的是由數據庫進行自加的,所以我們并不知道id是多少。這時我們可以通過在sql語句的<insert>標簽中添加三個屬性,就可以獲取到數據庫在對數據進行添加后的id,并將id封裝在對象的屬性中。useGeneratedKeys="true"表示是否開啟將自增屬性傳回,keyColumn="id"表示數據庫表中的自增屬性,keyProperty="id"表示要將獲取到的自增屬性的值賦值給類中的哪個屬性,這樣能獲取自增屬性id的條件是id得是自增屬性。

<insert id="saveAdmin" parameterType="Admin" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
? ? ? ? insert into admin(account,password,gender)value(#{account},#{password},#{gender})
</insert>
? ? ? ? 在新增,刪除和修改操作中,我們在將SqlSession關閉之前,需要將SqlSession的實例化對象的commit方法進行提交,而查詢操縱則不需要。因為查詢操作沒有對數據庫中的數據進行改變。

? ? ? ? Mybatis中還存在增刪改查操作的注解標簽,一般如果某些增刪改查操作的sql語句較為簡單,我們就可以直接在對應的接口上面通過注解標簽的形式來進行操作。

@Select("select * from grade where id = #{id}")
? ? int selectGrade(int id);
#{}和${}的區別
? ? ? ? #{}為占位符,通過預編譯的方式先用?代替出現占位符的地方,等到將sql語句編譯完成再將傳入的參數,可以防止sql注入

? ? ? ? ${}為拼接符,拼接符就像字符串一樣被Mybatis拼接到sql語句中,不能防止sql注入

結果處理
? ? ? ? 結果處理就是Mybatis對sql語句執行后的結果進行的封裝處理,有時我們不止只在一張表中進行查詢操作,返回的結果集中可能存在多個表中的數據,這時我們就需要在mapper映射器中將所有的映射關系進行配置,因為Mybatis在多表查詢后時不會將結果進行自動映射并封裝的。

? ? ? ? 例如在學生和年級關系中,如果想要查詢一個學生的信息和其所對應的年級信息,這是一個多對一關系的關聯查詢,查詢的結果集中存在不屬于學生表的屬性,這時我們需要在自定義的學生類中添加一個年級類型的屬性用來存放和年級相關的所有信息,并在mapper映射器中配置各個查詢結果的屬性所對應類中的屬性。

public ?class Student {
? ? private Integer id;
? ? private String name;
? ? private String gender;
? ? private Grade grade;
?
? ? public Integer getId() {
? ? ? ? return id;
? ? }
?
? ? public void setId(Integer id) {
? ? ? ? this.id = id;
? ? }
?
? ? public Integer getNo() {
? ? ? ? return no;
? ? }
?
? ? public void setNo(Integer no) {
? ? ? ? this.no = no;
? ? }
?
? ? public String getName() {
? ? ? ? return name;
? ? }
?
? ? public void setName(String name) {
? ? ? ? this.name = name;
? ? }
?
? ? public String getGender() {
? ? ? ? return gender;
? ? }
?
? ? public void setGender(String gender) {
? ? ? ? this.gender = gender;
? ? }
?
? ? public Grade getGrade() {
? ? ? ? return grade;
? ? }
?
? ? public void setGrade(Grade grade) {
? ? ? ? this.grade = grade;
? ? }
?
? ? @Override
? ? public String toString() {
? ? ? ? return "Student{" +
? ? ? ? ? ? ? ? "id=" + id +
? ? ? ? ? ? ? ? ", no=" + no +
? ? ? ? ? ? ? ? ", name='" + name + '\'' +
? ? ? ? ? ? ? ? ", gender='" + gender + '\'' +
? ? ? ? ? ? ? ? ", grade=" + grade +
? ? ? ? ? ? ? ? ", admin=" + admin +
? ? ? ? ? ? ? ? '}';
? ? }
}

public class Grade {
? ? private int id;
? ? private String name;
?
? ? public int getId() {
? ? ? ? return id;
? ? }
?
? ? public void setId(int id) {
? ? ? ? this.id = id;
? ? }
?
? ? public String getName() {
? ? ? ? return name;
? ? }
?
? ? public void setName(String name) {
? ? ? ? this.name = name;
? ? }
?
? ? @Override
? ? public String toString() {
? ? ? ? return "Grade{" +
? ? ? ? ? ? ? ? "id=" + id +
? ? ? ? ? ? ? ? ", name='" + name + '\'' +
? ? ? ? ? ? ? ? ", studentList=" + studentList +
? ? ? ? ? ? ? ? '}';
? ? }
}

? ? ? ? 如果查詢結果集中的屬性存在于多個表中,我們在查詢<select>標簽中的resultType屬性將會變為resultMap屬性,其值為<resultMap>標簽中自定義的id的值,type="Student"表示返回結果集的類型,<resultMap>標簽中有<id>和<result>標簽,<id>標簽代表數據庫的表中主鍵屬性,<result>標簽則代表其他屬性,column="id"表示在數據庫表中的屬性名,property="id"表示自定義類中的屬性名。如果類中存在其他自定義類型的屬性則使用<association>標簽表示,其中也存在<id>和<result>標簽配置方式和前面相同。我們還需要人為的在查詢語句中給結果的屬性列起別名,這樣可以保證在配置映射關系時一個結果集的屬性名可以對應一個類中的屬性,這是多對一關系結果集映射關系的配置。

<resultMap id="findInfo" type="Student">
? ? ? ? <id column="id" property="id"></id>
? ? ? ? <result column="name" property="name"></result>
? ? ? ? <result column="gender" property="gender"></result>
? ? ? ? <association property="grade" javaType="Grade">
? ? ? ? ? ? <result column="gname" property="name"></result>
? ? ? ? </association>
</resultMap>
? ? <select id="findStudent" resultMap="findInfo">
? ? ? ? SELECT s.id,s.name,s.gender,g.name gname FROM student s LEFT JOIN grade g ON s.gradeid = g.id WHERE s.id = #{id}
? ? </select>
? ? ? ? 如果我們要查詢在一個年級中有多少個學生以及每個學生的基本信息,這是一個一對多關系的關聯查詢,這時我們也需要在年級類中添加新的屬性,由于是一對多關系所以一個年級就會對應多個學生,所以我們需要添加一個存放學生信息的集合屬性。

public class Grade {
? ? private int id;
? ? private String name;
? ? private List<Student> studentList;
}
? ? ? ? 配置映射關系的方式和前面大致相同,仍然是寫在一個<resultMap>標簽中,當屬性為集合時我們需要使用<collection>標簽,property="studentList"表示在類中這個集合的名字,javaType="list"表示這個集合的類型,ofType="Student"表示集合中的泛型是什么類型,其余的配置方式和前面的都是一樣的。

<resultMap id="findGrade" type="Grade">
? ? ? ? <id column="id" property="id"></id>
? ? ? ? <result column="name" property="name"></result>
? ? ? ? <collection property="studentList" javaType="list" ofType="Student">
? ? ? ? ? ? <id column="sid" property="id"></id>
? ? ? ? ? ? <result column="sname" property="name"></result>
? ? ? ? </collection>
</resultMap>
? ? <select id="findStudent" resultMap="findGrade">
? ? ? ? SELECT
? ? ? ? ? g.id,
? ? ? ? ? g.name,
? ? ? ? ? s.id sid,
? ? ? ? ? s.name sname
? ? ? ? FROM
? ? ? ? ? grade g
? ? ? ? ? LEFT JOIN student s
? ? ? ? ? ? ON g.id = s.gradeid
? ? </select>

? ? ? ? 在這種一對多的關聯查詢中我們還可以使用嵌套查詢來解決分頁問題的產生,通過將一個復雜的查詢轉換為多個簡單查詢。例如查詢所有年級以及每個年級對應的所有學生的信息。具體的思路是我們先通過一個簡單查詢將所有的年級信息查詢出來,再根據年級的id來查詢每個年級所對應的所有學生。

? ? ? ? 其中我們還是使用<resultMap>標簽進行對映射關系的配置,和前面的關聯查詢不同<collection>標簽的屬性要比前面多兩個column="id"表示我們接下來可能需要用到的屬性,這里我們是需要根據年級的id進行之后的查詢操作的,select="findStudent2"表示一個自定義的名字,和另一個簡單查詢的id值相同并且另一個簡單查詢的返回值類型也就變為了Student類型,還是同樣將需要的學生信息的屬性配置到<collection>標簽中。

<resultMap id="GradeMap" type="Grade">
? ? ? ? <id column="id" property="id"></id>
? ? ? ? <result column="name" property="name"></result>
? ? ? ? <collection property="studentList" javaType="list" ofType="Student" column="id" select="findStudent2">
? ? ? ? ? ? <id column="id" property="id"></id>
? ? ? ? ? ? <result column="name" property="name"></result>
? ? ? ? </collection>
</resultMap>
? ? <select id="findStudent1" resultMap="GradeMap">
? ? ? ? ? ? select * from grade
? ? </select>
? ? <select id="findStudent2" resultType="Student">
? ? ? ? select id,name from student where gradeid = #{id}
? ? </select>
動態sql
? ? ? ? 我們在進行查詢操作時,有時查詢的條件不止一個,這時我們就需要在select語句中手動添加查詢條件例如:

select * from student where id = 1 and name = "小明"
? ? ? ? 前面我們將類中的屬性創建為包裝類類型,這樣當參數無效時只有兩中可能:一種是null,另一種是" ",這時我們如果不將為null或者為" "的屬性刪除的話我們就查詢不到我們想要的數據,這時我們就需要動態地將查詢條件進行改變,Mybatis框架中剛好有這種功能。我們可以將where語句的部分寫入到Mybatis提供的<where>標簽中,并將where后面的語句使用<if>標簽進行判斷。<where>標簽會動態的進行插入或刪除我們需要的或者不需要的sql語句,當<where>標簽中的<if>條件成立時<where>標簽就會將where加入到sql語句中,并且將條件成立的<if>標簽中的語句也加入到sql語句中where的后面,而且<where>還會動態地判斷where后面的第一個語句是否為and或者or,如果是還會將and和or進行刪除,當<where> 標簽中沒有一個<if>條件成立時<where>標簽就不會將where加入到sql語句中,從而實現動態sql的效果。

<select id="findStudent">
? ? select * from student
? ? <where>
? ? ? ? <if test="id!=null&amp;id!=''">
? ? ? ? ? ? id = #{id}
? ? ? ? </if>
? ? ? ? <if test="name!=null&amp;name!=''">
? ? ? ? ? ? and name = #{name}
? ? ? ?</if>
? ? </where>
</select>
? ? ? ? 使用<trim>標簽也可以達到這種效果,prefix="where"表示需要在語句中添加的前綴,只要有一個<if>標簽成立就加前綴,反之則一個都不加。prefixOverrides="and|or"表示當插入語句中的第一個為and或者or時就將其刪除。

<select id="findStudent">
? ? ? ? select * from student
? ? ? ? <trim prefix="where" prefixOverrides="and|or">
? ? ? ? ? ? <if test="id!=null&amp;id!=''">
? ? ? ? ? ? ? ? id = #{id}
? ? ? ? ? ? </if>
? ? ? ? ? ? <if test="name!=null&amp;name!=''">
? ? ? ? ? ? ? ? and name = #{name}
? ? ? ? ? ? </if>
? ? ? ? ? ? <if test="gender!=null&amp;gender!=''">
? ? ? ? ? ? ? ? and gender = #{gender}
? ? ? ? ? ? </if>
? ? ? ? </trim>
</select>
? ? ? ? <set>標簽也是這樣如果有<if>標簽成立就插入set,如果沒有就不插入。如果插入語句的最后一個為","則<set>標簽就會將","進行刪除。

<update id="updateStudent" parameterType="Student">
? ? ? ? update student
? ? ? ? <set>
? ? ? ? ? ? <if test="name!=null&amp;name!=''">
? ? ? ? ? ? ? ? name = #{name},
? ? ? ? ? ? </if>
? ? ? ? ? ? <if test="gender!=null&amp;gender!=''">
? ? ? ? ? ? ? ? gender = #{gender}
? ? ? ? ? ? </if>
? ? ? ? </set>
? ? ? ? where id = #{id}
</update>
? ? ? ? <trim>標簽prefix="set"表示插入的前綴,suffixOverrides=","表示當插入語句的最后一個為","就刪除

<update id="updateStudent">
? ? ? ? update student
? ? ? ? <trim prefix="set" suffixOverrides=",">
? ? ? ? ? ? <if test="name!=null&amp;name!=''">
? ? ? ? ? ? ? ? name = #{name},
? ? ? ? ? ? </if>
? ? ? ? ? ? <if test="gender!=null&amp;gender!=''">
? ? ? ? ? ? ? ? gender = #{gender}
? ? ? ? ? ? </if>
? ? ? ? ? ? where id = #{id}
? ? ? ? </trim>
</update>
Mybatis的一級二級緩存
? ? ? ? 通過緩存可以減少用戶對數據庫訪問的次數,進而減少了數據庫的壓力,提高查詢性能。我們可以將通過相同的操作而得到相同的結果集的數據保存到緩存中,這樣當用戶進行多次相同的操作時就不會再向數據庫中訪問數據,而是直接通過緩存提高了查詢效率。我們一般將一段時間內不會發生改變的數據存放在緩存中,例如對某些網頁的訪問,一個網頁在一段時間內可能有很多的用戶對其進行訪問,我們不能讓用戶都去訪問數據庫中的數據,而是可以通過緩存拿到相同的數據,而緩存中的數據我們只需要讓其每過一段時間自動刷新一次即可。

? ? ? ? 一級緩存

? ? ? ? 一級緩存的作用域是同一個SqlSession中,在一個SqlSession中如果執行多次相同的sql操作,那么從第二次操作開始,讀取到的數據都是來自于緩存中的,當一個SqlSession不存在后,其對應的緩存也將被銷毀,Mybatis默認開啟的是一級緩存。

? ? ? ? 二級緩存

? ? ? ? 二級緩存是 SqlSessionFactory 級別的,作用域為同一個namespace中,當用戶執行同一個namespace中的同一個sql語句時,第一次訪問會先向數據庫中訪問并將訪問后的數據存放在二級緩存中,當第二次執行同一個namespace中的同一個sql語句時,就會從緩存中讀取數據,除非當緩存在超時,被聲明需要刷新,或者sqlSession在執行update,insert,delete操作并commit提交時,會清空緩存區,防止讀取的數據存在問題。
————————————————
版權聲明:本文為CSDN博主「楠佩憶心軒」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_52391639/article/details/125816937

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35426.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35426.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35426.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數學建模(二)線性規劃

課程推薦&#xff1a;6 線性規劃模型基本原理與編程實現_嗶哩嗶哩_bilibili 目錄 一、線性規劃的實例與定義 1.1 線性規劃的實例 1.2 線性規劃的定義 1.3 最優解 1.4 線性規劃的Mathlab標準形式 1.5 使用linprog函數 二、線性規劃模型建模實戰與代碼 2.1 問題提出 2.2…

機器學習深度學習——seq2seq實現機器翻譯(詳細實現與原理推導)

&#x1f468;?&#x1f393;作者簡介&#xff1a;一位即將上大四&#xff0c;正專攻機器學習的保研er &#x1f30c;上期文章&#xff1a;機器學習&&深度學習——seq2seq實現機器翻譯&#xff08;數據集處理&#xff09; &#x1f4da;訂閱專欄&#xff1a;機器學習&…

機器學習編譯系列

機器學習編譯MLC 1. 引言2. 機器學習編譯--概述2.1 什么是機器學習編譯 1. 引言 陳天奇目前任教于CMU&#xff0c;研究方向為機器學習系統。他是TVM、MXNET、XGBoost的主要作者。2022年夏天&#xff0c;陳天奇在B站開設了《機器學習編譯》的課程。 ??《機器學習編譯》課程共分…

立即開始使用 3D 圖像

一、說明 這個故事介紹了使用這種類型的數據來訓練機器學習3D模型。特別是&#xff0c;我們討論了Kaggle中可用的MNIST數據集的3D版本&#xff0c;以及如何使用Keras訓練模型識別3D數字。 3D 數據無處不在。由于我們希望構建AI來與我們的物理世界進行交互&#xff0c;因此使用3…

了解 Langchain?是個啥?:第 1 部分

一、說明 在日常生活中&#xff0c;我們主要致力于構建端到端的應用程序。我們可以使用許多自動 ML 平臺和 CI/CD 管道來自動化 ml 管道。我們還有像Roboflow和Andrew N.G.的登陸AI這樣的工具來自動化或創建端到端的計算機視覺應用程序。 如果我們想在OpenAI或擁抱臉的幫助下創…

Day 26 C++ list容器(鏈表)

文章目錄 list基本概念定義結構雙向迭代器優點缺點List和vector區別存儲結構內存管理迭代器穩定性隨機訪問效率 list構造函數——創建list容器函數原型示例 list 賦值和交換函數原型 list 大小操作函數原型示例 list 插入和刪除函數原型示例 list 數據存取函數原型注意示例 lis…

論文詳解 ——《SNR-Aware Low-light Image Enhancement》

文章目錄 Abstract1.Introduction2. Related Work3. Our Method3.1 Long- and Short-range Branches3.2 SNR-based Spatially-varying Feature Fusion3.3 SNR-guided Attention in Transformer3.4 Loss Function 4. Experiments4.1. Datasets and Implementation Details4.2 Co…

SpringBoot | 使用newWorkStealingPool和CompletableFuture進行并發異步處理

關注wx&#xff1a; CodingTechWork 需求 一個列表操作需要異步處理每個元素&#xff0c;最終需要將列表各個元素的操作結果統一返回&#xff0c;無需關注該列表中的順序執行。這個線程池不會保證任務的順序執行&#xff0c;即為WorkStealing搶占式的工作。 開發模板 線程池…

基于SpringBoot實現MySQL備份與還原

基于SpringBoot實現MySQL備份與還原&#xff0c;需求是在頁面上對所有的平臺數據執行備份和恢復操作&#xff0c;那么就需要使用代碼去調用MySQL備份和恢復的指令&#xff0c;下面是具體實現步驟&#xff1b; MySQL備份表設計 CREATE TABLE IF NOT EXISTS mysql_backups (id …

6.1 安全漏洞與網絡攻擊

數據參考&#xff1a;CISP官方 目錄 安全漏洞及產生原因信息收集與分析網絡攻擊實施后門設置與痕跡清除 一、安全漏洞及產生原因 什么是安全漏洞 安全漏洞也稱脆弱性&#xff0c;是計算機系統存在的缺陷 漏洞的形式 安全漏洞以不同形式存在漏洞數量逐年遞增 漏洞產生的…

前端開發:數組對象判斷重復的方法詳解

前言 在前端開發過程中,關于數據處理是非常常用的操作,尤其是通過算法處理從后端獲取的數據甚為重要。而且在前端開發中,兩大類型的數據處理是必備的:數組和對象。與其說是數據處理,不如說是數組和對象的處理。實際開發中,關于數組數據的處理所占比例更高,尤其是涉及到表…

使用Flask.Request的方法和屬性,獲取get和post請求參數(二)

1、Flask中的request 在Python發送Post、Get等請求時&#xff0c;我們使用到requests庫。Flask中有一個request庫&#xff0c;有其特有的一些方法和屬性&#xff0c;注意跟requests不是同一個。 2、Post請求&#xff1a;request.get_data() 用于服務端獲取客戶端請求數據。注…

理解ConcurrentSkipListMap(有點類似于并發的TreeMap)

是一個分層的結構。 從最上面開始查找&#xff0c;最后層層往下查。 插入和刪除有可能會引起節點Level的變更。 key是有序的&#xff0c;因此可以看做是并發的TreeMap

ubuntu18.04下配置muduoC++11環境

1.安裝muduo依賴的編譯工具及庫 Cmake sudo apt-get install cmakeBoost sudo apt-get install libboost-dev libboost-test-devcurl、c-ares DNS、google protobuf sudo apt-get install libcurl4-openssl-dev libc-ares-dev sudo apt-get install protobuf-compiler libp…

帶你了解SpringBoot支持的復雜參數--自定義對象參數-自動封裝

&#x1f600;前言 本篇博文是關于SpringBoot 在響應客戶端請求時支持的復雜參數和自定義對象參數&#xff0c;希望您能夠喜歡&#x1f60a; &#x1f3e0;個人主頁&#xff1a;晨犀主頁 &#x1f9d1;個人簡介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章…

go struct 的常見問題

go struct 的常見問題 1. 什么是struct&#xff1f;2. 如何聲明、定義和創建一個struct&#xff1f;3. struct和其他數據類型&#xff08;如數組、切片、map等&#xff09;有什么區別&#xff1f;4. 如何訪問struct字段&#xff1f;5. struct是否支持繼承&#xff0c;是否支持重…

JavaWeb_xml

文章目錄 1.xml是什么&#xff1f;2.xml的用途 1.xml是什么&#xff1f; xml 是可擴展的標記性語言 2.xml的用途 1、用來保存數據&#xff0c;而且這些數據具有自我描述性 2、它還可以做為項目或者模塊的配置文件 3、還可以做為網絡傳輸數據的格式&#xff08;現在 JSON 為主…

【Github】SourceTree技巧匯總

sourceTree登錄github賬戶 會跳轉到瀏覽器端 按照Git Flow 初始化倉庫分支 克隆遠程倉庫到本地 推送變更到遠程倉庫 合并分支 可以看到目前的本地分支&#xff08;main、iOS_JS&#xff09;和遠程分支&#xff08;origin/main、origin/HEAD、origin/iOS_JS&#xff09;目前所處…

5134. 簡單判斷

文章目錄 Question輸入樣例1&#xff1a; 3 7 0 輸出樣例1&#xff1a; IdeasCode Question 給定三個非負整數 x,y,z &#xff0c;請你按如下要求進行判斷并輸出相應結果&#xff1a; 如果 x>yz &#xff0c;則輸出 。 如果 y>xz &#xff0c;則輸出 -。 如果 xy 且 z0…