1. 程式人生 > >Mybatis使用 MyBatis框架的學習(二)——MyBatis架構與入門

Mybatis使用 MyBatis框架的學習(二)——MyBatis架構與入門

MyBatis框架的學習(二)——MyBatis架構與入門

2017年05月11日 23:36:27 閱讀數:7318

MyBatis框架的架構

MyBatis框架的架構如下圖: 
這裡寫圖片描述
下面作簡要概述:

  1. SqlMapConfig.xml,此檔案作為mybatis的全域性配置檔案,配置了mybatis的執行環境等資訊。mapper.xml檔案即sql對映檔案,檔案中配置了操作資料庫的sql語句,此檔案需要在SqlMapConfig.xml中載入。
  2. 通過mybatis環境等配置資訊構造SqlSessionFactory(即會話工廠)。
  3. 由會話工廠建立sqlSession即會話,操作資料庫需要通過sqlSession進行。
  4. mybatis底層自定義了Executor執行器介面操作資料庫,Executor介面有兩個實現,一個是基本執行器、一個是快取執行器。
  5. MappedStatement也是mybatis一個底層封裝物件,它包裝了mybatis配置資訊及sql對映資訊等。mapper.xml檔案中一個sql對應一個MappedStatement物件,sql的id即是MappedStatement的id
  6. MappedStatement對sql執行輸入引數進行定義,包括HashMap、基本型別、pojo,Executor通過MappedStatement在執行sql前將輸入的java物件對映至sql中,輸入引數對映就是JDBC程式設計中對preparedStatement設定引數。
  7. MappedStatement對sql執行輸出結果進行定義,包括HashMap、基本型別、pojo,Executor通過MappedStatement在執行sql後將輸出結果對映至java物件中,輸出結果對映過程相當於JDBC程式設計中對結果的解析處理過程。

MyBatis入門

mybatis下載

mybaits的程式碼由github.com管理,地址:https://github.com/mybatis/mybatis-3/releases。大家可從該地址下載mybatis最新框架。 
本人下載的是mybatis-3.2.7,其目錄結構為: 
這裡寫圖片描述

開發需求

現在我們明確需求,即實現以下功能:

  1. 根據使用者id查詢一個使用者資訊
  2. 根據使用者名稱稱模糊查詢使用者資訊列表
  3. 新增使用者
  4. 更新使用者
  5. 刪除使用者

MyBatis入門程式配置

【第一步】,使用Eclipse建立一個普通的Java工程,例如mybatis-day01。 
【第二步】,加入Jar包。工程所需加入的Jar包有mybatis核心包、依賴包和mysql資料驅動包。如下: 
這裡寫圖片描述 
【第三步】,在classpath下建立日誌記錄檔案——log4j.properties。我們可在mybatis-day01工程下新建一個config原始碼包,並在該原始碼包下建立一個日誌記錄檔案——log4j.properties 
這裡寫圖片描述 
log4j.properties檔案的內容如下:

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

mybatis預設使用log4j作為輸出日誌資訊。 
【第四步】,在classpath下建立SqlMapConfig.xml檔案。我們同樣可在config原始碼包下建立該檔案 
這裡寫圖片描述 
其內容如下:

<?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>
    <!-- 和spring整合後environments配置將廢除 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事務管理 -->
            <transactionManager type="JDBC" />
            <!-- 資料庫連線池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="yezi" />
            </dataSource>
        </environment>
    </environments>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

SqlMapConfig.xml是mybatis的核心配置檔案,以上檔案的配置內容為資料來源、事務管理。 
注意:等後面mybatis和Spring兩個框架整合之後,environments的配置將被廢除。 
【第五步】,建立一個po類——User.java。我們可在src目錄下新建一個名為cn.itheima.mybatis.po的包,並在該包下建立一個po類——User.java 
這裡寫圖片描述 
po類作為mybatis進行sql對映使用,po類通常與資料庫表對應,User.java檔案的內容如下:

public class User {
    private int id;
    private String username;// 使用者姓名
    private String sex;// 性別
    private Date birthday;// 生日
    private String address;// 地址
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address="
                + address + "]";
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

【第六步】,在classpath下的sqlmap目錄下建立sql對映檔案user.xml 
這裡寫圖片描述 
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">
<mapper namespace="test">

</mapper>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

namespace:即名稱空間,其用於隔離sql語句(即不同sql對映檔案中的兩個相同id的sql語句如何來區分),這是當前的作用,後面會講另一層非常重要的作用。 
【第七步】,載入對映檔案。mybatis框架需要載入對映檔案,將user.xml新增在SqlMapConfig.xml中,如下: 
這裡寫圖片描述
故須在SqlMapConfig.xml配置檔案中新增如下配置資訊:

<mappers>
    <!-- resource是基於classpath來查詢的 -->
    <mapper resource="sqlmap/user.xml"/>
</mappers>
  • 1
  • 2
  • 3
  • 4

MyBatis入門程式測試——根據id查詢使用者資訊

在user.xml對映檔案中新增如下配置:

<!-- 根據id獲取使用者資訊 -->
<select id="getUserById" parameterType="int" resultType="cn.itheima.mybatis.po.User">
    select * from user where id=#{id};
</select>
  • 1
  • 2
  • 3
  • 4
  • parameterType:查詢引數的資料型別,即定義輸入到sql中的對映型別。
  • resultType:查詢結果的資料型別,如果是pojo則應該給出全路徑。
  • #{id}表示使用PreparedStatement設定佔位符號並將輸入變數id傳到sql中。說白點,#{}作用就是佔位符,相當於JDBC中的?

接著在src目錄下新建一個名為cn.itheima.mybatis.first的包,並在該包下建立一個MybatisTest單元測試類,緊接著在該類中編寫如下一個但單元測試方法:

public class MybatisTest {

    @Test
    public void getUserById() throws IOException {
        // 第一步,建立SqlSessionFactoryBuilder物件
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 第二步,載入配置檔案
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 第三步,建立SqlSessionFactory物件
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        // 第四步,建立SqlSession物件
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 第五步,使用SqlSession物件執行查詢,得到User物件
        // 第一個引數:執行查詢的StatementId
        User user = sqlSession.selectOne("getUserById", 10);
        // 第六步,列印結果
        System.out.println(user);
        // 第七步,釋放資源,每一個sqlSession就是一個連線
        sqlSession.close();
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

以上完成的需求就是根據id查詢使用者資訊。一般來講工廠物件一般在實際開發是單例的,並不需要頻繁地建立,故getUserById()方法可優化為:

public class MybatisTest {

    private SqlSessionFactory sqlSessionFactory = null; // 工廠物件一般在我們的系統中是單例的

    @Before
    public void init() throws IOException {
        // 第一步,建立SqlSessionFactoryBuilder物件
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 第二步,載入配置檔案
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 第三步,建立SqlSessionFactory物件
        sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    }

    @Test
    public void getUserById() throws IOException {
        // 第四步,建立SqlSession物件
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 第五步,使用SqlSession物件執行查詢,得到User物件
        // 第一個引數:執行查詢的StatementId
        User user = sqlSession.selectOne("getUserById", 10);
        // 第六步,列印結果
        System.out.println(user);
        // 第七步,釋放資源,每一個sqlSession就是一個連線
        sqlSession.close();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

根據使用者名稱稱模糊查詢使用者資訊列表

現在我就來完成第二個需求——根據使用者名稱稱模糊查詢使用者資訊列表。 
一開始我在user.xml對映檔案中新增如下配置:

<select id="getUserByName" parameterType="string" resultType="cn.itheima.mybatis.po.User">
    SELECT * FROM `user` WHERE username LIKE #{username}
</select>
  • 1
  • 2
  • 3

如果查詢結果返回的是List集合,那麼resultType只需要設定為List集合中的一個元素的資料型別即可。 
接著在MybatisTest單元測試類編寫如下單元測試方法:

@Test
public void getUserByName() {
    // 建立一個SqlSession物件
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // 執行查詢
    List<User> list = sqlSession.selectList("getUserByName", "%張%");
    for (User user : list) {
        System.out.println(user);
    }
    // 釋放資源
    sqlSession.close();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

執行以上方法,Eclipse控制檯列印如下: 
這裡寫圖片描述
實際開發中建議使用#{}佔位符這種方式,因為這樣可以防止SQL注入。除了以上這種方式外,在此我還介紹第二種方式,即在user.xml對映檔案中新增如下配置:

<select id="getUserByName" parameterType="string" resultType="cn.itheima.mybatis.po.User">
    SELECT * FROM `user` WHERE username LIKE '%${value}%'
</select>
  • 1
  • 2
  • 3

${value}表示使用引數將${value}替換,做字串的拼接,${}為字串拼接指令。注意:如果是取簡單資料型別的引數,括號中的值必須為value。 
如此一來,MybatisTest單元測試類中的getUserByName()方法應修改為:

@Test
public void getUserByName() {
    // 建立一個SqlSession物件
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // 執行查詢
    List<User> list = sqlSession.selectList("getUserByName", "張");
    for (User user : list) {
        System.out.println(user);
    }
    // 釋放資源
    sqlSession.close();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

執行以上方法,Eclipse控制檯列印如下: 
這裡寫圖片描述
很明顯這種方式在實際開發中是不建議使用的,因為無法防止SQL注入。

總結

#{}和${}

#{}:表示一個佔位符號,可以很好地去避免sql注入。其原理是將佔位符位置的整個引數和sql語句兩部分提交給資料庫,資料庫去執行sql語句,去表中匹配所有的記錄是否和整個引數是否一致。 
#{}要獲取輸入引數的值:

  • 如果輸入引數是簡單資料型別,則#{}中可以寫value或其它名稱。
  • 如果輸入引數是pojo物件型別,則#{}可通過OGNL方式去獲取,表示式就是屬性.屬性.屬性....方式。

${}表示一個sql拼接符號,其原理是在向資料庫發出sql之前去拼接好sql再提交給資料庫執行。 
${}要獲取輸入引數的值:

  • 如果輸入引數是簡單資料型別,則${}中只能寫value。
  • 如果輸入引數是pojo物件型別,則${}可通過OGNL方式去獲取,表示式就是屬性.屬性.屬性....方式。

一般情況下建議使用#{},特殊情況下必須要用${},比如:

  1. 動態拼接sql中動態組成排序欄位,要通過${}將排序欄位傳入sql中。
  2. 動態拼接sql中動態組成表名,要通過${}將表名傳入sql中。

parameterType和resultType

parameterType:指定輸入引數型別,mybatis通過ognl從輸入物件中獲取引數值拼接在sql中。 
resultType:指定輸出結果型別,mybatis將sql查詢結果的一行記錄資料對映為resultType指定型別的物件。

selectOne()和selectList()方法

selectOne查詢一條記錄,如果使用selectOne查詢多條記錄則丟擲異常: 
這裡寫圖片描述
selectList可以查詢一條或多條記錄。

新增使用者

現在我就來完成第三個需求——新增使用者。首先在user.xml對映檔案中新增如下配置:

<insert id="insertUser" parameterType="cn.itheima.mybatis.po.User">
    INSERT INTO `user` (username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})
</insert>
  • 1
  • 2
  • 3

如果輸入引數是pojo,那麼#{}中的名稱就是pojo類中的屬性(用到了物件圖導航的思想),而不能隨便寫了。 
然後試著在MybatisTest單元測試類編寫如下單元測試方法:

@Test
public void addUser() {
    // 建立一個SqlSession物件
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // 建立User物件
    User user = new User();
    user.setUsername("小喬");
    user.setBirthday(new Date());
    user.setSex("2");
    user.setAddress("上海");
    // 插入使用者
    sqlSession.insert("insertUser", user);
    // 釋放資源
    sqlSession.close();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

執行以上方法,發現Eclipse控制檯中列印: 
這裡寫圖片描述
雖然發出了sql語句,但是事務並沒將其提交,而是回滾了。故User物件是無法插入到資料庫user表中的。所以addUser()單元測試方法應修改為:

@Test
public void addUser() {
    // 建立一個SqlSession物件
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // 建立User物件
    User user = new User();
    user.setUsername("小喬");
    user.setBirthday(new Date());
    user.setSex("2");
    user.setAddress("上海");
    // 插入使用者
    sqlSession.insert("insertUser", user);
    // 提交事務
    sqlSession.commit();
    // 釋放資源
    sqlSession.close();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

執行以上方法,Eclipse控制檯會列印: 
這裡寫圖片描述
事務已提交,可發現數據庫user表中插入一條記錄。

MySQL自增主鍵返回

現在有這樣一個需求:想要得到MySQL資料庫給我們生成的主鍵id,即獲取主鍵。那如何實現這個需求呢?這裡要用到MySQL資料庫中的一個函式:

  • LAST_INSERT_ID():返回auto_increment自增列新記錄id值。該函式是在當前事務下取到你最後生成的id值,而我們應知道查詢操作是沒有開啟事務的,增刪改操作是需要開啟事務的。

如此一來,需要將user.xml對映檔案中的如下配置:

<insert id="insertUser" parameterType="cn.itheima.mybatis.po.User">
    INSERT INTO `user` (username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})
</insert>
  • 1
  • 2
  • 3

修改為(即新增selectKey實現將主鍵返回):

<insert id="insertUser" parameterType="cn.itheima.mybatis.po.User">
    <selectKey keyProperty="id" resultType="int" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
    INSERT INTO `user` (username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})
</insert>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • keyProperty:返回的主鍵儲存在pojo中的哪個屬性(即其對應pojo的主鍵屬性)。獲取主鍵,實際上是將主鍵取出來之後封裝到了pojo的主鍵屬性當中。
  • resultType:返回的主鍵是什麼型別(即其對應pojo的主鍵的資料型別)。
  • order:selectKey的執行順序,是相對於insert語句來說的,由於mysql的自增原理,執行完insert語句之後才將主鍵生成,所以這裡selectKey的執行順序為AFTER。

最後將addUser()單元測試方法應修改為:

@Test
public void addUser() {
    // 建立一個SqlSession物件
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // 建立User物件
    User user = new User();
    user.setUsername("大喬");
    user.setBirthday(new Date());
    user.setSex("2");
    user.setAddress("上海");
    // 插入使用者
    sqlSession.insert("insertUser", user);
    System.out.println(user.getId());
    // 提交事務
    sqlSession.commit();
    // 釋放資源
    sqlSession.close();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

執行以上方法,Eclipse控制檯會列印: 
這裡寫圖片描述

MySql使用uuid實現主鍵

使用uuid實現主鍵,需要增加通過select uuid()語句得到uuid值作為主鍵。所以需要將user.xml對映檔案中id為insertUser的Statement改置為:

<insert id="insertUser" parameterType="cn.itheima.mybatis.po.User">
<selectKey resultType="java.lang.String" order="BEFORE" 
keyProperty="id">
    select uuid()
</selectKey>
insert into user(id,username,birthday,sex,address) 
    values(#{id},#{username},#{birthday},#{sex},#{address})
</insert>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

因為是使用uuid做主鍵,所以應該先生成主鍵然後再插入資料,此時order屬性的值應是BEFORE。

刪除使用者

現在我就來完成第四個需求——刪除使用者。首先在user.xml對映檔案中新增如下配置:

<!-- 刪除使用者 -->
<delete id="deleteUser" parameterType="int">
    DELETE FROM `user` WHERE id=#{id1}
</delete>
  • 1
  • 2
  • 3
  • 4

然後在MybatisTest單元測試類編寫如下單元測試方法:

@Test
public void deleteUser() {
    // 建立一個SqlSession物件
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // 刪除使用者
    sqlSession.delete("deleteUser", 29);
    // 提交事務
    sqlSession.commit();
    // 釋放資源
    sqlSession.close();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

更新使用者

現在我就來完成第五個需求——修改使用者資訊。首先在user.xml對映檔案中新增如下配置:

<!-- 修改使用者資訊 -->
<update id="updateUser" parameterType="cn.itheima.mybatis.po.User">
    UPDATE `user` set username=#{username} WHERE id=#{id}
</update>
  • 1
  • 2
  • 3
  • 4

然後在MybatisTest單元測試類編寫如下單元測試方法:

@Test
public void updateUser() {
    // 建立一個SqlSession物件
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // 建立一個User物件
    User user = new User();
    user.setUsername("張角");
    user.setId(
            
           

相關推薦

Mybatis使用 MyBatis框架學習()——MyBatis架構入門

MyBatis框架的學習(二)——MyBatis架構與入門 2017年05月11日 23:36:27 閱讀數:7318 MyBatis框架的架構 MyBatis框架的架構如下圖: 下面作簡要概述:

MyBatis框架學習()——MyBatis架構入門

MyBatis框架的架構 MyBatis框架的架構如下圖: 下面作簡要概述: SqlMapConfig.xml,此檔案作為mybatis的全域性配置檔案,配置了mybatis的執行環境等資訊。mapper.xml檔案即sql對映檔案,檔案中配置了操作

框架學習系列 mybatis 第十篇 mapper映射文件之輸出映射

總結 www. XML 聲明 com 2.4 res rom 用戶 1: mapper映射文件輸出映射(輸入類型) 2:resultType的使用 3:resultMap的使用 3:總結&下節預告 本文是《凱哥陪你學系列-框架學習之mybatis框架學習》中第十二篇

框架學習總結-----MyBatis--- 對映檔案配置(簡述)

1.名稱空間的配置: mapper 為根元素節點,一個namespace對應一個dao, 格式:<mapper namespace="com.dy.dao.UserDao"> 2.SQL 語句的對映:圖片官方文件:圖片3.SQL這個元素用來定義可

Mybatis詳解系列()--Mybatis如何載入配置及初始化

簡介 Mybatis 是一個持久層框架,它對 JDBC 進行了高階封裝,使我們的程式碼中不會出現任何的 JDBC 程式碼,另外,它還通過 xml 或註解的方式將 sql 從 DAO/Repository 層中解耦出來,除了這些基本功能外,它還提供了動態 sql、延遲載入、快取等功能。 相比 Hibernate

SpringMVC學習()——SpringMVC架構及組件

返回 pin 可能 存在 過程 模式 擴展 攔截器 處理流 相信大家通過前文的學習,已經對SpringMVC這個框架多少有些理解了。還記得上一篇文章中SpringMVC的處理流程嗎? 這個圖大致描述了SpringMVC的整個處理流程,這個流程圖還是相對來說比較容易懂的,下面

自動化框架學習,判斷定位方式

自動化學習/**判斷定位方式工具類*/public class GetByLoctorTest { /** *讀取配置文件 *@param key String 定位方式 * */ public static By getLocator(String key){

Python3 Scrapy框架學習:爬取豆瓣電影Top250

開啟專案裡的items.py檔案,定義如下變數, import scrapy from scrapy import Item,Field class DoubanItem(scrapy.Item): # define the fields for your it

Beego框架學習筆記04--Beego多對多關係表資料操作

1.Beego Orm Read方法注意事項 使用orm根據指定欄位去資料庫中檢索資訊的時候,Read方法的第一個引數應當是【承載資訊物件的指標】而不是承載資訊物件。 ... o := orm.NewOrm() var articleType models.ArticleTyp

Beego框架學習筆記02--Beego資料庫操作雜記

1.資料庫重登入相關 每次關閉電腦或者關閉資料庫伺服器之後,如果想要再次操作資料庫就必須開啟資料庫伺服器。 具體過程是先執行【~/$ mysql.server start】指令,得到資料庫伺服器啟動成功提示。 MacBook-Pro:~$ mysql.server star

TensorFlow 學習 tf Session tf Session run

                     session:with tf.Session() as sess:/ tf.InteractiveSession()初始化:tf.global_variables_initializer()with tf.Session() as sess: sess.run(tf

R語言學習(包資料集)

R語言安裝包 什麼是R語言的包? 我們可以把它視為一種擴充套件R基本功能的機制,包本身也集成了眾多的函式。在使用R的過程中如果我們要使用某些函式,而當前R裡面沒有的話,我們通常可以去查詢那些與其相關的包,那些包裡面通常已經包含了其他開發者開發好的功能,我們

WebGL------osg框架學習

  今天我們繼續來學習osg.js框架。上一篇我們介紹了DrawActor物件繪製操作類和Drawable可繪製物件類,我們大致知道了osg對Drawable可繪製物件的繪製流程管理。今天我們要繼續介紹StateBin狀態樹節點類。我們來看一下StateBin,他管理的是StateSet狀態,他將每個模型節點

基於Spring AOP和Groovy日誌模板配置的日誌記錄框架次實現使用案例

一、專案地址 說明:本框架是基於koala-project(專案地址:http://git.oschina.net/openkoala/koala)中的koala-businesslog二次開發,因為koala-project已經很久沒有維護,對於一些

cordova學習:圖示啟動螢幕設定

一、圖示設定 <icon src="res/ios/icon.png" platform="ios" width="57" height="57" density="mdpi" /> 在config.xml裡配置icon標籤設定app圖示 src:圖片存放路徑

Linux Framebuffer驅動框架軟體架構(未完待續)

/************************************************************************************************************************************/

MVC框架)----前端後端MVC、MVVM等設計模式區別聯絡

        上篇文章中提到了前端的框架分類,其中前端JS框架中有些是MVC設計模式,但是java和dotNET平臺也有自己的MVC也有自己的設計模式,這兩類有什麼區別呢,好多猿們甚是不解,旁徵博引

架構三層架構記述

二層架構的缺點: 如果功能不需要經常變化或修改,則是一個比較好而且快的實現方式. 但是在使用者介面,都是通過SqlDataSource控制元件來連線資料來源的,並將SQL語句直接寫入到各個頁面的HTML程式碼中 因此帶來的問題是: SQL語句與HTML程式碼的混合程式設計,

經典三層框架初識()---Spring 2.2入門案例2補充

咱們前面說的案例,要給UserServiceImpl中的成員屬性UserDao賦值,用的是在UserServiceImpl中建立setter方法.然後在配置檔案中配置如下的標籤 <bean id="userservice" class="service.impl.UserServiceIm

經典三層框架初識()---Spring 2.1入門案例1

前面我們簡單介紹了一個spring.我們這裡主要用spring framew這個框架.主要處理業務邏輯層.我們發現理論恨多,但是其實開發起來程式碼是很簡單的.我們來說一個入門案例. 這裡說的入門案例,主要想說下ioc:  控制反轉,將物件建立和依賴管理的許可權反轉給spri