日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql高可用 持久层_MyBatis持久层框架使用总结 转载

發布時間:2024/10/8 数据库 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql高可用 持久层_MyBatis持久层框架使用总结 转载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。

2013年11月遷移到Github,MyBatis的Github地址:https://github.com/mybatis/mybatis-3。

iBATIS一詞來源于“internet”和“abatis”的組合,是一個基于Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)。

MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。

每個MyBatis應用程序主要都是使用SqlSessionFactory實例的,一個SqlSessionFactory實例可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個xml配置文件或者一個預定義的配置類的實例獲得。

1.使用Generator自動生成Dao層,Model層和Mapper層。

以下用mybatis-generator-core-1.3.2.jar插件加jdbc數據庫連接包自動導出持久層dao包,model包和mapper包。

需要用到的Java包有:

mybatis-generator-core-1.3.2.jar,

mysql-connector-java-5.1.34.jar,

ojdbc14-10.2.0.1.0.jar,

sqljdbc4-4.0.jar。

配置文件:?generator.xml

1 <?xml version="1.0" encoding="UTF-8"?>

2

3

4

5

6

9

10

11

12

13

14

15

16

17

20

21

22

25

26

27

42

43

44

45

48

49

54

55

56

57

58

59

60

61

62

66

67

68

72

73

74

75

76

77

81

82

86

87

91

92

96

97

101

102

106

107

111

112

116

117

121

122

123

134

135

136

137

138

139

140

155

156

157

158

159

160

161

162

163

164

165

166

167

168

179

180

181

182

183

184

215

216

217

218

219

220

View Code

打開cmd命令行,轉到配置文件所在的文件下,執行如下生成語句:

java -jar mybatis-generator-core-1.3.2.jar -configfile generator.xml -overwrite

命令執行完畢,可以看到對應路徑下生成dao包,model包和mapper包文件。

2.MyBatis框架整合

1)MyBatis使用參數配置:sqlMapConfig.xml。

①?緩存配置(Cache):cacheEnabled:全局開關:默認是true,如果它配成false,其余各個Mapper XML文件配成支持cache也沒用。

②?延遲加載:

lazyLoadingEnabled:true使用延遲加載,false禁用延遲加載,默認為true,當禁用時, 所有關聯對象都會即時加載。

aggressiveLazyLoading:true啟用時,當延遲加載開啟時訪問對象中一個懶對象屬性時,將完全加載這個對象的所有懶對象屬性。false,當延遲加載時,按需加載對象屬性(即訪問對象中一個懶對象屬性,不會加載對象中其他的懶對象屬性)。默認為true。

③?multipleResultSetsEnabled:允許和不允許單條語句返回多個數據集(取決于驅動需求)。默認為true。

④?useColumnLabel:使用列標簽代替列名稱。不同的驅動器有不同的做法。參考一下驅動器文檔,或者用這兩個不同的選項進行測試一下。

⑤?useGeneratedKeys:允許JDBC生成主鍵。需要驅動器支持。如果設為了true,這個設置將強制使用被生成的主鍵,有一些驅動器不兼容不過仍然可以執行。

⑥?autoMappingBehavior:指定MyBatis?是否并且如何來自動映射數據表字段與對象的屬性。PARTIAL將只自動映射簡單的,沒有嵌套的結果。FULL?將自動映射所有復雜的結果。

⑦?defaultExecutorType:配置和設定執行器,SIMPLE執行器執行其它語句。REUSE執行器可能重復使用prepared statements語句,BATCH執行器可以重復執行語句和批量更新。

⑧?defaultStatementTimeout:設置一個時限,以決定讓驅動器等待數據庫回應的多長時間為超時。

完整sqlMapConfig.xml配置文件如下:

1 <?xml version="1.0" encoding="UTF-8" ?>

2 /p>

3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

4 "http://mybatis.org/dtd/mybatis-3-config.dtd">

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

26

37

39

73

74

152

153

154

155

156

157

序列化特殊值處理:SerializableTypeHandler

1 package com.ouc.openplatform.dao.mybatis;

2

3 import java.io.Serializable;

4 import java.sql.CallableStatement;

5 import java.sql.PreparedStatement;

6 import java.sql.ResultSet;

7 import java.sql.SQLException;

8

9 import org.apache.ibatis.type.BaseTypeHandler;

10 import org.apache.ibatis.type.JdbcType;

11

12 /**

13 * @author WuPing

14 */

15 public class SerializableTypeHandler extends BaseTypeHandler {

16

17 @Override

18 public void setNonNullParameter(PreparedStatement ps, int i, Serializable parameter, JdbcType jdbcType)

19 throws SQLException {

20 ps.setObject(i, parameter);

21 }

22

23 @Override

24 public Serializable getNullableResult(ResultSet rs, String columnName)

25 throws SQLException {

26 return (Serializable)rs.getObject(columnName);

27 }

28

29 @Override

30 public Serializable getNullableResult(ResultSet rs, int columnIndex)

31 throws SQLException {

32 return (Serializable)rs.getObject(columnIndex);

33 }

34

35 @Override

36 public Serializable getNullableResult(CallableStatement cs, int columnIndex)

37 throws SQLException {

38 return (Serializable)cs.getObject(columnIndex);

39 }

40

41 }

View Code

2)結果集resultMap:

MyBatis中在查詢進行select映射的時候,返回類型可以用resultType,也可以用resultMap,resultType是直接表示返回類型的,而resultMap則是對外部ResultMap的引用,但是resultType跟resultMap不能同時存在。在MyBatis進行查詢映射的時候,其實查詢出來的每一個屬性都是放在一個對應的Map里面的,其中鍵是屬性名,值則是其對應的值。當提供的返回類型屬性是resultType的時候,MyBatis會將Map里面的鍵值對取出賦給resultType所指定的對象對應的屬性。所以其實MyBatis的每一個查詢映射的返回類型都是ResultMap,只是當我們提供的返回類型屬性是resultType的時候,MyBatis對自動的給我們把對應的值賦給resultType所指定對象的屬性,而當我們提供的返回類型是resultMap的時候,因為Map不能很好表示領域模型,我們就需要自己再進一步的把它轉化為對應的對象,這常常在復雜查詢中很有作用。

示例:UserBaseResultMap

model類:User

1 package com.ouc.mkhl.platform.authority.model;

2

3 import java.io.Serializable;

4

5 //用戶信息

6 public class User implements Serializable {

7

8 private static final long serialVersionUID = 1098321123L;

9

10 private Integer id; //用戶Id

11

12 private String userName; //用戶名

13

14 private String password; //未加密密碼

15

16 private String email; //郵箱

17

18 private String trueName; //真實姓名

19

20 private String sex; //性別

21

22 private Integer age; //年齡

23

24 private String telephone; //手機

25

26 public Integer getId() {

27 return id;

28 }

29

30 public void setId(Integer id) {

31 this.id = id;

32 }

33

34 public String getUserName() {

35 return userName;

36 }

37

38 public void setUserName(String userName) {

39 this.userName = userName == null ? null : userName.trim();

40 }

41

42 public String getPassword() {

43 return password;

44 }

45

46 public void setPassword(String password) {

47 this.password = password == null ? null : password.trim();

48 }

49

50 public String getEmail() {

51 return email;

52 }

53

54 public void setEmail(String email) {

55 this.email = email == null ? null : email.trim();

56 }

57

58 public String getTrueName() {

59 return trueName;

60 }

61

62 public void setTrueName(String trueName) {

63 this.trueName = trueName == null ? null : trueName.trim();

64 }

65

66 public String getSex() {

67 return sex;

68 }

69

70 public void setSex(String sex) {

71 this.sex = sex == null ? null : sex.trim();

72 }

73

74 public Integer getAge() {

75 return age;

76 }

77

78 public void setAge(Integer age) {

79 this.age = age;

80 }

81

82 public String getTelephone() {

83 return telephone;

84 }

85

86 public void setTelephone(String telephone) {

87 this.telephone = telephone == null ? null : telephone.trim();

88 }

89

90 }

View Code

3)增刪改查:

(1)select查詢:

①?id:在這個模式下唯一的標識符,可被其它語句引用。

②?parameterType:傳給此語句的參數的完整類名或別名。

③?resultType:語句返回值類型的整類名或別名。注意,如果是集合,那么這里填寫的是集合的項的整類名或別名,而不是集合本身的類名。(resultType 與resultMap 不能并用)

④?resultMap:引用的外部resultMap名。結果集映射是MyBatis 中最強大的特性。許多復雜的映射都可以輕松解決。(resultType 與resultMap 不能并用)

⑤?flushCache:如果設為true,則會在每次語句調用的時候就會清空緩存。select語句默認設為false。

⑥?useCache:如果設為true,則語句的結果集將被緩存。select語句默認設為false。

⑦?timeout :設置驅動器在拋出異常前等待回應的最長時間,默認為不設值,由驅動器自己決定。

示例:查詢所有用戶信息:selectUsers

select id,userName,email from user

(2) insert插入:saveUser

此處數據庫表使用主鍵自增,主鍵為id。

①?fetchSize:設置一個值后,驅動器會在結果集數目達到此數值后,激發返回,默認為不設值,由驅動器自己決定。

②?statementType:statement,preparedstatement,callablestatement。預準備語句、可調用語句。

③?useGeneratedKeys:使用JDBC的getGeneratedKeys方法來獲取數據庫自己生成的主鍵(MySQL、SQLSERVER等關系型數據庫會有自動生成的字段)。

④?keyProperty:標識一個將要被MyBatis設置進getGeneratedKeys的key所返回的值,或者為insert語句使用一個selectKey子元素。

insert into user (userName, password, email, trueName, sex, age, telephone)

values (#{userName,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR},

#{email,jdbcType=VARCHAR}, #{trueName,jdbcType=VARCHAR},

#{sex,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}, #{telephone,jdbcType=VARCHAR})

(3)update更新:動態更新SQL:updateUser

update user

userName = #{userName,jdbcType=VARCHAR},

password = #{password,jdbcType=VARCHAR},

email = #{email,jdbcType=VARCHAR},

trueName = #{trueName,jdbcType=VARCHAR},

sex = #{sex,jdbcType=VARCHAR},

age = #{age,jdbcType=INTEGER},

telephone = #{telephone,jdbcType=VARCHAR},

where id = #{id,jdbcType=INTEGER}

(4)delete刪除:deleteUser

delete from user

where id = #{id,jdbcType=INTEGER}

(5)sql:?Sql元素用來定義一個可以復用的SQL語句段,供其它語句調用。

userName, password, email, telephone

select

from user

(6)參數:parameters:MyBatis可以使用基本數據類型和Java的復雜數據類型。

基本數據類型,String,int,date等。

使用基本數據類型,只能提供一個參數,所以需要使用Java實體類,或Map類型做參數類型。通過#{}可以直接得到其屬性。

①?基本數據類型參數:String

select id, userName, email from user

where userName = #{userName,jdbcType=VARCHAR}

Java代碼:

public User getUserByName(String name); // 根據用戶名獲取用戶信息

②?Java實體類型參數:User

insert into user (userName, password, email, trueName, sex, age, telephone)

values (#{userName,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR},

#{email,jdbcType=VARCHAR}, #{trueName,jdbcType=VARCHAR},

#{sex,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}, #{telephone,jdbcType=VARCHAR})

Java代碼:

public int saveUser(User user); // 插入用戶信息

③?Map參數:Map recordMap

select count(*) from groupinfo

and id in

#{ids}

and name LIKE CONCAT(CONCAT('%', #{name}),'%')

AND description LIKE CONCAT(CONCAT('%', #{description}),'%')

AND type = #{type,jdbcType=INTEGER}

AND category = #{category,jdbcType=INTEGER}

Java代碼:

//獲取子組總記錄數

public int selectChildGroupTotalNum(Map recordMap);

Map recordMap = new HashMap();

recordMap.put("idStr", group.getChildgroupids().split(","));

recordMap.put("name", name);

recordMap.put("description", description);

recordMap.put("type", -1);

recordMap.put("category", -1);

childGroupTotalNum = groupDao.selectChildGroupTotalNum(recordMap);

④?多參數:

方法一:按順序傳遞參數。

select SensorNo from sensorconfig

where Name = #{0} and TestunitNo = #{1} and LABCODE = #{2}

Java代碼:

//根據參數名查詢參數ID

public int selectSensorNobySensorName(String sensorName, int testUnitNo, String labCode);

方法二:接口參數上添加@Param注解。

select id, userName from user

and userName LIKE CONCAT(CONCAT('%', #{userName}),'%')

and supplierNo LIKE CONCAT(CONCAT('%', #{supplierno}),'%')

and supplierNo != 'test'

LIMIT #{startIndex},#{pageSize}

Java代碼:

// 根據用戶名和V碼查詢用戶信息

public List selectByUserNameAndVCode(

@Param("userName") String userName,

@Param("supplierno") String supplierno,

@Param("startIndex") int startIndex, @Param("pageSize") int pageSize);

4)動態SQL語句:

selectKey標簽,if標簽,if + where的條件判斷,if + set的更新語句,if + trim代替where/set標簽,trim代替set,choose (when, otherwise),foreach標簽。動態SQL語句算是MyBatis最靈活的部分吧,用好了非常方便。

示例:selectTotalNumByAccountType

select count(*) from user

and id not in

#{ids}

and userName LIKE CONCAT(CONCAT('%', #{userName}),'%')

and supplierNo LIKE CONCAT(CONCAT('%', #{supplierno}),'%')

and trueName LIKE CONCAT(CONCAT('%', #{trueName}),'%')

AND accountType = #{accountType}

可以查看的文章:

總結

以上是生活随笔為你收集整理的mysql高可用 持久层_MyBatis持久层框架使用总结 转载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。