Mybatis使用 MyBatis框架的學習(二)——MyBatis架構與入門
MyBatis框架的學習(二)——MyBatis架構與入門
2017年05月11日 23:36:27 閱讀數:7318MyBatis框架的架構
MyBatis框架的架構如下圖:
下面作簡要概述:
- SqlMapConfig.xml,此檔案作為mybatis的全域性配置檔案,配置了mybatis的執行環境等資訊。mapper.xml檔案即sql對映檔案,檔案中配置了操作資料庫的sql語句,此檔案需要在SqlMapConfig.xml中載入。
- 通過mybatis環境等配置資訊構造SqlSessionFactory(即會話工廠)。
- 由會話工廠建立sqlSession即會話,操作資料庫需要通過sqlSession進行。
- mybatis底層自定義了Executor執行器介面操作資料庫,Executor介面有兩個實現,一個是基本執行器、一個是快取執行器。
- MappedStatement也是mybatis一個底層封裝物件,它包裝了mybatis配置資訊及sql對映資訊等。mapper.xml檔案中一個sql對應一個MappedStatement物件,sql的id即是MappedStatement的id。
- MappedStatement對sql執行輸入引數進行定義,包括HashMap、基本型別、pojo,Executor通過MappedStatement在執行sql前將輸入的java物件對映至sql中,輸入引數對映就是JDBC程式設計中對preparedStatement設定引數。
- 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,其目錄結構為:
開發需求
現在我們明確需求,即實現以下功能:
- 根據使用者id查詢一個使用者資訊
- 根據使用者名稱稱模糊查詢使用者資訊列表
- 新增使用者
- 更新使用者
- 刪除使用者
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方式去獲取,表示式就是屬性.屬性.屬性....
方式。
一般情況下建議使用#{}
,特殊情況下必須要用${}
,比如:
- 動態拼接sql中動態組成排序欄位,要通過
${}
將排序欄位傳入sql中。 - 動態拼接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