再念书之MyBatis,基本用法

1、environment   

永利澳门游戏网址304 1
<environments default=”development”> <environment
id=”development”> <transactionManager type=”JDBC” />
<dataSource type=”POOLED”> <property name=”driver”
value=”com.mysql.jdbc.Driver” /> <property name=”url”
value=”jdbc:mysql://localhost:3306/test” /> <property
name=”username” value=”root” /> <property name=”password”
value=”admin” /> </dataSource> </environment>
<environment id=”test”> <transactionManager
type=”JDBC”></transactionManager> <dataSource
type=”JNDI”> <property name=”driver” value=”com.mysql.jdbc.Driver”
/> <property name=”url” value=”jdbc:mysql://localhost:3306/test”
/> <property name=”username” value=”root” /> <property
name=”password” value=”admin” /> </dataSource>
</environment> </environments> View Code

 首要用于配置多个dataSource情状;在同二个条件中切换不一样的dataSource时,要求为各样数据库创造多少个SqlSessionFactory。对于每一种环境environment,我们必要配置 dataSource 和 transactionManager。

 四、MyBatis主配置文件

 

在概念sqlSessionFactory时须要钦定MyBatis主配置文件:

Xml代码  

1.  <bean id=”sqlSessionFactory” class=”org.mybatis.spring.SqlSessionFactoryBean”>  

2.      <property name=”configLocation” value=”classpath:mybatis-config.xml” />  

3.      <property name=”dataSource” ref=”dataSource” />  

4.  </bean>  

MyBatis配置文件中山大学标签configuration下子标签包涵:

configuration

|— properties

|— settings

|— typeAliases

|— typeHandlers

|— objectFactory

|— plugins

|— environments

|— |— environment

|— |— |— transactionManager

|— |— |__ dataSource

|__ mappers

 

 

 

4.1 properties属性

 

  
properties和java的.properties的安顿文件有关。配置properties的resource钦赐.properties的门径,然后再在properties标签下安插property的name和value,则足以替换.properties文件中相应属性值。

Xml代码  

1.      <!– 属性替换 –>  

2.  <properties resource=”mysql.properties”>  

3.      <property name=”jdbc.driverClassName” value=”com.mysql.jdbc.Driver”/>  

4.      <property name=”jdbc.url” value=”jdbc:mysql://localhost:3306/student_manager”/>  

5.      <property name=”username” value=”root”/>  

6.      <property name=”password” value=”limingnihao”/>  

7.  </properties>  

4.2 settings设置

   
那是MyBatis 修改操作运转进度细节的第一的步子。下方那么些表格描述了这几个设置项、含义和私下认可值。 

设置项

描述

允许值

默认值

cacheEnabled

对在此配置文件下的所有cache 进行全局性开/关设置。

true | false

true

lazyLoadingEnabled

全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。

true | false

true

aggressiveLazyLoading

当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。

true | false

true

multipleResultSetsEnabled

允许和不允许单条语句返回多个数据集(取决于驱动需求)

true | false

true

useColumnLabel

使用列标签代替列名称。不同的驱动器有不同的作法。参考一下驱动器文档,或者用这两个不同的选项进行测试一下。

true | false

true

useGeneratedKeys

允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。

true | false

false

autoMappingBehavior

指定MyBatis 是否并且如何来自动映射数据表字段与对象的属性。PARTIAL将只自动映射简单的,没有嵌套的结果。FULL 将自动映射所有复杂的结果。

NONE,

PARTIAL,

FULL

PARTIAL

defaultExecutorType

配置和设定执行器,SIMPLE 执行器执行其它语句。REUSE 执行器可能重复使用prepared statements 语句,BATCH执行器可以重复执行语句和批量更新。

SIMPLE

REUSE

BATCH

SIMPLE

defaultStatementTimeout

设置一个时限,以决定让驱动器等待数据库回应的多长时间为超时

正整数

Not Set

(null)

 

 

例如:

Xml代码  

1.  <settings>  

2.      <setting name=”cacheEnabled” value=”true” />  

3.      <setting name=”lazyLoadingEnabled” value=”true” />  

4.      <setting name=”multipleResultSetsEnabled” value=”true” />  

5.      <setting name=”useColumnLabel” value=”true” />  

6.      <setting name=”useGeneratedKeys” value=”false” />  

7.      <setting name=”enhancementEnabled” value=”false” />  

8.      <setting name=”defaultExecutorType” value=”SIMPLE” />  

9.  </settings>  

 

4.3 typeAliases类型小名

 

类型外号是Java 类型的简称。

它仅仅只是关联到XML 配置,简写冗长的JAVA 类名。举个例子:

 

Xml代码  

1.  <typeAliases>  

2.      <typeAlias alias=”UserEntity” type=”com.manager.data.model.UserEntity” />  

3.      <typeAlias alias=”StudentEntity” type=”com.manager.data.model.StudentEntity” />  

4.      <typeAlias alias=”ClassEntity” type=”com.manager.data.model.ClassEntity” />  

5.  </typeAliases>  

  
使用这几个布局,“StudentEntity”就会在其余地点代表“com.manager.data.model.StudentEntity”被运用。

  
  对于通常的Java类型,有那多少个内建的档案的次序别名。它们都以高低写不灵活的,由于重载的名字,要当心原生类型的极度处理。

 

 

 

别名

映射的类型

_byte

byte

_long

long

_short

short

_int

int

_integer

int

_double

double

_float

float

_boolean

boolean

string

String

byte

Byte

long

Long

short

Short

int

Integer

integer

Integer

double

Double

float

Float

boolean

Boolean

date

Date

decimal

BigDecimal

bigdecimal

BigDecimal

object

Object

map

Map

hashmap

HashMap

list

List

arraylist

ArrayList

collection

Collection

iterator

Iterator

 

 

 

4.4 typeHandlers类型句柄

 

不论是MyBatis在预管理语句中设置二个参数,仍然从结果集中抽取二个值时,类型管理器被用来将获得的值以适当的法门转变到Java类型。下边那一个表格描述了默许的品类管理器。

 

 

 

类型处理器

Java类型

JDBC类型

BooleanTypeHandler

Boolean,boolean

任何兼容的布尔值

ByteTypeHandler

Byte,byte

任何兼容的数字或字节类型

ShortTypeHandler

Short,short

任何兼容的数字或短整型

IntegerTypeHandler

Integer,int

任何兼容的数字和整型

LongTypeHandler

Long,long

任何兼容的数字或长整型

FloatTypeHandler

Float,float

任何兼容的数字或单精度浮点型

DoubleTypeHandler

Double,double

任何兼容的数字或双精度浮点型

BigDecimalTypeHandler

BigDecimal

任何兼容的数字或十进制小数类型

StringTypeHandler

String

CHAR和VARCHAR类型

ClobTypeHandler

String

CLOB和LONGVARCHAR类型

NStringTypeHandler

String

NVARCHAR和NCHAR类型

NClobTypeHandler

String

NCLOB类型

ByteArrayTypeHandler

byte[]

任何兼容的字节流类型

BlobTypeHandler

byte[]

BLOB和LONGVARBINARY类型

DateTypeHandler

Date(java.util)

TIMESTAMP类型

DateOnlyTypeHandler

Date(java.util)

DATE类型

TimeOnlyTypeHandler

Date(java.util)

TIME类型

SqlTimestampTypeHandler

Timestamp(java.sql)

TIMESTAMP类型

SqlDateTypeHandler

Date(java.sql)

DATE类型

SqlTimeTypeHandler

Time(java.sql)

TIME类型

ObjectTypeHandler

Any

其他或未指定类型

EnumTypeHandler

Enumeration类型

VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)。

 

 

 

你可以重写类型管理器或创办你本身的种类管理器来管理不援救的或非标准的连串。要这么做的话,轻便完毕TypeHandler接口(org.mybatis.type),然后映射新的品类管理器类到Java类型,还应该有可选的贰个JDBC类型。然后再typeHandlers中增多这些类型管理器。

新定义的品类管理器将会覆盖已经存在的拍卖Java的String类型属性和VARCHA兰德Evoque参数及结果的类型管理器。要当心MyBatis不会同审查视数据库元消息来决定接纳哪一类等级次序,所以您不能不在参数和结果映射中钦定那是VARCHA奥德赛类型的字段,来绑定到科学的花色管理器上。那是因为MyBatis直到语句被实施都不明白数据类型的那几个实际导致的。

 

Java代码  

1.  public class LimingStringTypeHandler implements TypeHandler {  

2.    

3.      @Override  

4.      public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {  

5.          System.out.println(“setParameter – parameter: ” + ((String) parameter) + “, jdbcType: ” + jdbcType.TYPE_CODE);  

6.          ps.setString(i, ((String) parameter));  

7.      }  

8.    

9.      @Override  

10.      public Object getResult(ResultSet rs, String columnName) throws SQLException {  

11.          System.out.println(“getResult – columnName: ” + columnName);  

12.          return rs.getString(columnName);  

13.      }  

14.    

15.      @Override  

16.      public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {  

17.          System.out.println(“getResult – columnIndex: ” + columnIndex);  

18.          return cs.getString(columnIndex);  

19.      }  

20.  }  

 

在布局文件的typeHandlers中增添typeHandler标签。

Xml代码  

1.  <typeHandlers>  

2.      <typeHandler javaType=”String” jdbcType=”VARCHAR” handler=”liming.student.manager.type.LimingStringTypeHandler”/>  

3.  </typeHandlers>  

4.5 ObjectFactory对象工厂

历次MyBatis 为结果对象创设二个新实例,都会用到ObjectFactory。暗中认可的ObjectFactory 与应用目标类的构造函数创建多少个实例毫无分裂,假设有已经映射的参数,那也可能应用带参数的构造函数。

万一您重写ObjectFactory 的私下认可操作,你能够透过三翻五次org.apache.ibatis.reflection.factory.DefaultObjectFactory成立一下你本身的。

ObjectFactory接口非常粗大略。它蕴涵两个创立用的点子,一个是管理暗中认可构造方法的,别的三个是管理带参数构造方法的。最终,setProperties方法能够被用来布署ObjectFactory。在初阶化你的ObjectFactory实例后,objectFactory元素体中定义的属性会被传送给setProperties方法。

 

Java代码  

1.  public class LimingObjectFactory extends DefaultObjectFactory {  

2.    

3.      private static final long serialVersionUID = -399284318168302833L;  

4.    

5.      @Override  

6.      public Object create(Class type) {  

7.          return super.create(type);  

8.      }  

9.    

10.      @Override  

11.      public Object create(Class type, List<Class> constructorArgTypes, List<Object> constructorArgs) {  

12.          System.out.println(“create – type: ” + type.toString());  

13.          return super.create(type, constructorArgTypes, constructorArgs);  

14.      }  

15.    

16.      @Override  

17.      public void setProperties(Properties properties) {  

18.          System.out.println(“setProperties – properties: ” + properties.toString() + “, someProperty: ” + properties.getProperty(“someProperty”));  

19.          super.setProperties(properties);  

20.      }  

21.    

22.  }  

 

 

 

布局文件中增加objectFactory标签

Xml代码  

1.  <objectFactory type=”liming.student.manager.configuration.LimingObjectFactory”>  

2.      <property name=”someProperty” value=”100″/>  

3.  </objectFactory>  

4.6 plugins插件

MyBatis允许你在某一点拦截已映射语句施行的调用。暗中认可景况下,MyBatis允许使用插件来阻拦方法调用:

       Executor(update, query, flushStatements, commit,rollback,
getTransaction, close, isClosed)

       ParameterHandler(getParameterObject, setParameters)

       ResultSetHandler(handleResultSets,handleOutputParameters)

       StatementHandler(prepare, parameterize, batch, update,query)

这几个类中方法的详细情形能够由此查看各种方法的签约来开采,何况它们的源代码在MyBatis的发行李包裹中有。你应该通晓你覆盖措施的一颦一笑,假令你所做的要比监视调用要多。假使您尝试修改或掩盖贰个加以的法门,你或者会打破MyBatis的着力。那是低档期的顺序的类和章程,要深谋远虑运用插件。

利用插件是它们提供的极度轻松的工夫。轻易达成拦截器接口,要分明你想遏止的钦赐签名。

4.7 environments环境

MyBatis 能够布署多少个条件。那足以扶持您SQL 映射对应种种数据库等。

4.8 mappers映射器

此间是报告MyBatis 去哪搜索映射SQL 的讲话。能够运用类路径中的能源援引,或然使用字符,输入确切的U奥德赛L援用。

例如:

Xml代码  

1.  <mappers>  

2.      <mapper resource=”com/manager/data/maps/UserMapper.xml” />  

3.      <mapper resource=”com/manager/data/maps/StudentMapper.xml” />  

4.      <mapper resource=”com/manager/data/maps/ClassMapper.xml” />  

5.  </mappers>  

 3、动态SQL

3.1 if 条件

永利澳门游戏网址304 2
<select id=”searchCourses” parameterType=”hashmap”
resultMap=”CourseResult”> SELECT * FROM COURSES WHERE TUTOR_ID=
#{tutorId} <if test=”courseName != null”> AND NAME LIKE
#{courseName} </if> <if test=”startDate != null”> AND
START_DATE > #{startDate} </if> <if test=”endDate !=
null”> AND END_DATE < #{endDate} </if> </select>
if 语句

3.2 choose when条件

永利澳门游戏网址304 3
<select id=”searchCoursesTwo” parameterType=”hashmap”
resultMap=”CourseResult”> SELECT * FROM COURSES <choose>
<when test=”searchBy == ‘Tutor'”> WHERE TUTOR_ID= #{tutorId}
</when> <when test=”searchBy == ‘CourseName'”> WHERE name
like #{courseName} </when> <otherwise> WHERE TUTOR
start_date >= now() </otherwise> </choose>
</select> choose when
条件

<choose>测验条件的值,且使用第叁个值为TRUE的子句,若无法则为True,则选取<otherwise>内的字句

3.3 where 条件

永利澳门游戏网址304 4
<select id=”searchCourses” parameterType=”hashmap”
resultMap=”CourseResult”> SELECT * FROM COURSES <where> <if
test=” tutorId != null “> TUTOR_ID= #{tutorId} </if> <if
test=”courseName != null”> AND name like #{courseName} </if>
<if test=”startDate != null”> AND start_date >= #{startDate}
</if> <if test=”endDate != null”> AND end_date <=
#{endDate} </if> </where> </select> Where 子句

<where>成分唯有在中间标签有重临内容时才会在动态语句上插入WHERE条件语句。並且,假设Where子句以AND
或然 O途观 打头,则打头的AND 或 OTiggo 将会被移除。

3.4 trim 条件

永利澳门游戏网址304 5
<select id=”searchCourses” parameterType=”hashmap”
resultMap=”CourseResult”> SELECT * FROM COURSES <trim
prefix=”WHERE” prefixOverrides=”AND | OR”>
/*东拼西凑成的词句前面加上WHERE,倘使WHERE前面有AND 或许OCR-V,将去掉。suffix末尾加上,suffixOverrides 末尾去掉*/ <if test=”
tutorId != null “> TUTOR_ID= #{tutorId} </if> <if
test=”courseName != null”> AND name like #{courseName} </if>
</trim> </select> trim
子句

 <trim> 成分和
<where>成分看似,假设放肆三个<if>条件为true,<trim>元素会插入WHERE,并且移除紧跟WHERE
前边的AND 或 OPRADO

3.5 foreach 循环

永利澳门游戏网址304 6
<select id=”searchCoursesByTutors” parameterType=”map”
resultMap=”CourseResult”> SELECT * FROM COURSES <if
test=”tutorIds != null”> <where> <foreach item=”tutorId”
collection=”tutorIds”> OR tutor_id=#{tutorId} </foreach>
</where> </if> </select> foreach子句

它能够迭代遍历一个数组或然列表,构造AND/OOdyssey条件依旧贰个IN子句。

3.6 set 条件

永利澳门游戏网址304 7
<update id=”updateStudent” parameterType=”Student”> update
students <set> <if test=”name !=
null”>name=#{name},</if> <if test=”email !=
null”>email=#{email},</if> <if test=”phone !=
null”>phone=#{phone},</if> </set> where stud_id=#{id}
</update> set子句

借使<if>条件重临了别样公文内容,<set>将会插入set关键字和其文件内容。並且会去除末尾的”,”

1.2.3.4创建MyBatis的mapper配置文件

在src/main/resource中开创MyBatis配置文件:mybatis-config.xml。
typeAliases标签:给类起三个外号。com.manager.data.model.StudentEntity类,能够利用StudentEntity取代。
Mappers标签:加载MyBatis中实体类的SQL映射语句文件。

 

Xml代码

  1. <?xml version=”1.0″ encoding=”UTF-8″ ?>  
  2. <!DOCTYPE configuration PUBLIC “-//mybatis.org//DTD Config 3.0//EN” “;  
  3. <configuration>  
  4.     <typeAliases>  
  5.         <typeAlias alias=”StudentEntity” type=”com.manager.data.model.StudentEntity”/>  
  6.     </typeAliases>  
  7.     <mappers>  
  8.         <mapper resource=”com/manager/data/maps/StudentMapper.xml” />  
  9.     </mappers>  
  10. </configuration>    

4、typeHandlers

MyBatis
对于以下的品类应用内建的类型管理器:全数的宗旨数据类型、基本项目标包装等级次序、
byte[]、java.util.Date、 java.sql.Date、 java,sql.Time、
java.sql.Timestamp、 java 枚举类型等。所以当 MyBatis
发现属性的连串属于上述项目,他会使用相应的品类管理器将值设置到PreparedStatement
中,同样地,当从 SQL 结果集创设 JavaBean 时,也可以有临近的经过。

借使,大家能够自定义二个类别管理器为大家子定义的Class服务。一旦我们贯彻了自定义的品类管理器,大家要求在 mybatis-config.xml 中注册它:

永利澳门游戏网址304 8 */
public class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber>
{ public void setNonNullParameter(PreparedStatement preparedStatement,
int i, PhoneNumber phoneNumber, JdbcType jdbcType) throws SQLException {
preparedStatement.setString(i, phoneNumber.toString()); } public
PhoneNumber getNullableResult(ResultSet resultSet, String s) throws
SQLException { return new PhoneNumber(resultSet.getString(s)); } public
PhoneNumber getNullableResult(ResultSet resultSet, int i) throws
SQLException { return new PhoneNumber(resultSet.getString(i)); } public
PhoneNumber getNullableResult(CallableStatement callableStatement, int
i) throws SQLException { return new
PhoneNumber(callableStatement.getString(i)); } } 自定义类型处理器 
永利澳门游戏网址304 9
<typeHandlers> <typeHandler
handler=”com.summersoft.ts.util.PhoneTypeHandler”/>
</typeHandlers> 注册自定义类型管理器

 时间类型:Mybatis 会将java.util.Data
类型调换到java.sql.Timestamp(时间戳)并安装。

3.2.2 set

当在update语句中动用if标签时,借使前边的if未有实践,则或促成逗号多余错误。使用set标签能够将动态的布置SET
关键字,和剔除追加到基准末尾的别的不相干的逗号。
从未有过行使if标签时,假使有三个参数为null,都会产生错误,如下示例:

Xml代码

  1. <!– 更新学生新闻 –>  
  2. <update id=”updateStudent” parameterType=”StudentEntity”>  
  3.     UPDATE STUDENT_TBL  
  4.        SET STUDENT_TBL.STUDENT_NAME = #{studentName},  
  5.            STUDENT_TBL.STUDENT_SEX = #{studentSex},  
  6.            STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},  
  7.            STUDENT_TBL.CLASS_ID = #{classEntity.classID}  
  8.      WHERE STUDENT_TBL.STUDENT_ID = #{studentID};  
  9. </update>  

 使用set+if标签修改后,要是某项为null则不举办翻新,而是保持数据库原值。如下示例:

Xml代码

  1. <!– 更新学生消息 –>  
  2. <update id=”updateStudent” parameterType=”StudentEntity”>  
  3.     UPDATE STUDENT_TBL  
  4.     <set>  
  5.         <if test=”studentName!=null and studentName!=” “>  
  6.             STUDENT_TBL.STUDENT_NAME = #{studentName},  
  7.         </if>  
  8.         <if test=”studentSex!=null and studentSex!=” “>  
  9.             STUDENT_TBL.STUDENT_SEX = #{studentSex},  
  10.         </if>  
  11.         <if test=”studentBirthday!=null “>  
  12.             STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},  
  13.         </if>  
  14.         <if test=”classEntity!=null and classEntity.classID!=null and classEntity.classID!=” “>  
  15.             STUDENT_TBL.CLASS_ID = #{classEntity.classID}  
  16.         </if>  
  17.     </set>  
  18.     WHERE STUDENT_TBL.STUDENT_ID = #{studentID};  
  19. </update>  

 4、缓存

4.1、首先级缓存:如果您选用同叁个SqlSession
接口对象调用了平等的SELECT语句,则直接会从缓存中回到结果,实际不是再查询叁次数据库。

4.2、其次级缓存:大家得以在SQL映射器XML配置文件中运用<cache
/>成分增多全局二级缓存。

  • 具有的在映射语句文件定义的<select>语句的查询结果都会被缓存
  • 装有的在映射语句文件定义的<insert>,<update>
    和<delete>语句将会刷新缓存
  • 缓存依照新近最少被使用(Least Recently Used,LRU)算法管理
  • 缓存不会被别的方式的依赖时间表的基础代谢(未有刷新时间间隔),即不协理定期刷新机制
  • 缓存将积攒 1024 个 查询办法再次回到的列表也许指标的引用
  • 缓存是线程安全的

自然大家也足以 复写暗许属性来自定义缓存的表现:

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

eviction:LRU、FIFO、SOFT、WEAK
readOnly:二个只读的缓存会向调用者再次回到被缓存对象的一份援用。一个读/写缓存cache将会回到改指标的一份拷贝。

 

 

 

一、框架基本介绍
1、概念 辅助普通SQL查询、存款和储蓄进度和高级映射,简化和促成了Java
数据长久化层的的开源…

2.1.1 id、result

id、result是最简便的炫耀,id为主键映射;result其余中央数据库表字段到实体类属性的投射。
  最简便的事例:

Xml代码

  1. <resultMap type=”StudentEntity” id=”studentResultMap”>  
  2.     <id property=”studentID” column=”STUDENT_ID”/>  
  3.     <result property=”studentName” column=”STUDENT_NAME”/>  
  4.     <result property=”studentSex” column=”STUDENT_SEX”/>  
  5.     <result property=”studentBirthday” column=”STUDENT_BIRTHDAY”/>  
  6. </resultMap>  

id、result语句属性配置细节:

 

属性

描述

 

property

需要映射到JavaBean 的属性名称。

 

column

数据表的列名或者标签别名。

 

javaType

一个完整的类名,或者是一个类型别名。如果你匹配的是一个JavaBean,那MyBatis 通常会自行检测到。然后,如果你是要映射到一个HashMap,那你需要指定javaType 要达到的目的。

 

jdbcType

数据表支持的类型列表。这个属性只在insert,update 或delete 的时候针对允许空的列有用。JDBC 需要这项,但MyBatis 不需要。如果你是直接针对JDBC 编码,且有允许空的列,而你要指定这项。

 

typeHandler

使用这个属性可以覆写类型处理器。这项值可以是一个完整的类名,也可以是一个类型别名。

 

 

 

支持的JDBC类型
       为了今日的引用,MyBatis 援助下列JDBC 类型,通过JdbcType 枚举:
BIT,FLOAT,CHAR,TIMESTAMP,OTHER,UNDEFINED,TINYINT,REAL,VARCHAR,BINARY,BLOB,NVARCHAR,SMALLINT,DOUBLE,LONGVARCHAR,VARBINARY,CLOB,NCHAR,INTEGER,NUMERIC,DATE,LONGVARBINARY,BOOLEAN,NCLOB,BIGINT,DECIMAL,TIME,NULL,CURSOR

2、SELECT

2.1、 resultType=’Student’ 当
column名和对象property名一致时,会活动把相应的column填充上对象的property,要是查询记录重临多条,Mybatis
自动用 会集类来接受。

2.2、Mybatis依据集合的类型,会选取适当的聚合达成:

对于 List,Collection,Iterable 类型,MyBatis 将返回
java.util.ArrayList
对于 Map 类型,MyBatis 将返回 java.util.HashMap
对于 Set 类型,MyBatis 将返回 java.util.HashSet
对于 SortedSet 类型,MyBatis 将返回 java.util.TreeSet

2.3、ResultType 和 ResuleMap 无法何况使用,ResultMap的 id
在此命名空间内是并世无双的 

2.4、Resulttype=”java.util.HashMap”。在这种情状下,结果聚集的列大将会作为Map中的key值,而列值作值将会作为Map的value值。假诺查询记录重回多条,Mybatis自动用会集类来接收。

2.5、我们能够从另外二个<resultMap>,扩大出三个新的<resultMap>,那样原来的属性值可以扩大过来

2.6、一对一关系查询

永利澳门游戏网址304 10
<resultMap type=”Student” id=”StudentWithAddressResult”> <id
property=”studId” column=”stud_id” /> <result property=”name”
column=”name” /> <result property=”email” column=”email” />
<result property=”phone” column=”phone” /> <result
property=”address.addrId” column=”addr_id” /> <result
property=”address.street” column=”street” /> <result
property=”address.city” column=”city” /> <result
property=”address.state” column=”state” /> <result
property=”address.zip” column=”zip” /> <result
property=”address.country” column=”country” /> </resultMap>
一对一直接关联
永利澳门游戏网址304 11
<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=”StudentWithAddressResultIn”> <id property=”studId”
column=”stud_id” /> <result property=”name” column=”name” />
<result property=”email” column=”email” /> <association
property=”address” resultMap=”AddressResult” /> </resultMap>
一对一嵌套关联
永利澳门游戏网址304 12
<resultMap type=”Student” id=”StudentWithAddressResultHasOne”>
<id property=”studId” column=”stud_id” /> <result
property=”name” column=”name” /> <result property=”email”
column=”email” /> <association property=”address”
javaType=”Address”> <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” />
</association> </resultMap> 一对一内联关联has one

2.7、一对多关系查询

永利澳门游戏网址304 13
<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” /> <collection property=”courses”
resultMap=”CourseResult” /> </resultMap> View Code

2.8、在MyBatis的安插文件中,能够不钦命输入参数。而利用#{param1}和#{param2}援用接口中方法的形参。

2.1.2 constructor

       
大家接纳id、result时候,供给定义java实体类的属性映射到数量库表的字段上。那年是接纳JavaBean完结的。当然大家也得以运用实体类的构造方法来完毕值的映射,这一年是经过构造方法参数的书写的一一来开展赋值的。
        使用construcotr成效有限(举例使用collection级联合检查询)。
        下边运用id、result实现的意义就能够改为:

Xml代码

  1. <resultMap type=”StudentEntity” id=”studentResultMap” >  
  2.     <constructor>  
  3.         <idArg javaType=”String” column=”STUDENT_ID”/>  
  4.         <arg javaType=”String” column=”STUDENT_NAME”/>  
  5.         <arg javaType=”String” column=”STUDENT_SEX”/>  
  6.         <arg javaType=”Date” column=”STUDENT_BIRTHDAY”/>  
  7.     </constructor>  
  8. </resultMap>  

        当然,大家须求定义StudentEntity实体类的构造方法:

Java代码

  1. public StudentEntity(String studentID, String studentName, String studentSex, Date studentBirthday){  
  2.     this.studentID = studentID;  
  3.     this.studentName = studentName;  
  4.     this.studentSex = studentSex;  
  5.     this.studentBirthday = studentBirthday;  
  6. }  
1.1 DateSource
  • UNPOOLED:为每八个数据库操作创设二个新的连天,使用完结就关门他。该措施适用于小圈圈数据的出现客商的简练应用程序上。
  • POOLED:Mybatis会创设二个数据库连接池,连接池中的叁个连连将会被看作数据库操作。一旦数据库操作完结,MyBatis
    会将此一而再重临给连接池。
  • JNDI:MyBatis 从在应用服务器向配置好的 JNDI 数据源 dataSource
    获取数据库连接。

三、动态SQL语句(该sql动态语句是依靠须求团结拼装sql语句,以及多表查询,使用大面积,解说各类配置文件sql语句的标签:where、if、choose、when、set、trim、otherwise、foreach等)

3、typeAliases

只要未有安装typeAliases的项目别名,对于resultType和parameterType属性值,我们需求运用JavaBean的一心限定名。所以,大家可感觉完全限定名使用别称,通过typeAliases设置:

二、SQL语句映射文件(1)resultMap

2、properties

永利澳门游戏网址304 14<properties
resource=”application.properties”> <property name=”jdbc.username”
value=”db_user” /> <property name=”jdbc.password”
value=”verysecurepwd” /> </properties> View Code

那边,要是 application.properties 文件包罗值 jdbc.username 和
jdbc.password,则上述定义的 username 和password 的值 db_user 和
verysecurepwd 将会被 application.properties 中定义的应和的 jdbc.username
和jdbc.password 值覆盖。

2.1 resultMap

        resultMap 是MyBatis中最重大最有力的成分了。你能够令你比使用JDBC
调用结果集省掉八成的代码,也得以让您做过多JDBC不辅助的事。现实上,要写叁个等同类似于交互的映照那样的犬牙交错语句,大概要上千行的代码。ResultMaps的目标,正是这么总结的口舌而无需多余的结果映射,更加多复杂的言语,除了只要一些绝对必须的言辞描述关系以外,再也无需任何的。

resultMap属性:type为java实体类;id为此resultMap的标识。

 

 resultMap能够安装的照射:

1. constructor – 用来将结果反射给一个实例化好的类的构造器

a) idArg – ID 参数;将结果集标识为ID,以有助于全局调用
b) arg –反射到构造器的常见结果

2. id – ID 结果,将结果集标志为ID,以便于全局调用

3. result – 反射到JavaBean 属性的常常结果

4. association – 复杂类型的组成;七个结果合成的类型

a) nested result mappings – 几resultMap
本人嵌套关联,也得以引用到一个别样上

5. collection –复杂类型集结a collection of complex types

6. nested result mappings – resultMap 的集合,也能够援用到一个其余上

7. discriminator – 行使多个结果值以调整利用哪个resultMap

a) case – 基本一些值的结果映射的case 景况

i. nested result mappings –一个case
意况自个儿正是二个结出映射,由此也足以满含部分均等的因素,也能够引用三个表面resultMap。

 

3.2 为JavaBean 所在的包起小名

本来也得以毫无为每几个JavaBean
单独定义别称,你可感到提供应和要求要起外号的JavaBean
所在的包,Mybatis会自动扫描包钦赐义的JavaBeans,然后分别为JavaBean注册七个小写字母开头的非完全限定的类名格局的别称。

永利澳门游戏网址304 15<typeAliases>
<package name=”com.mybatis3.domain” /> </typeAliases> View Code

设若 Student.java 和 Tutor.java 的 Bean 定义在 com.mybatis3.domain
包中,则 com.mybatis3.domain.Student的小名会被登记为 student。而
com.mybatis3.domain.Tutor 别大将会被登记为 tutor。

二、SQL语句映射文件(1)resultMap

SQL 映射XML
文件是兼具sql语句放置的地点。须要定义一个workspace,日常定义为对应的接口类的路线。写好SQL语句映射文件后,须要在MyBAtis配置文件mappers标签中援用,例如:

Xml代码

  1. <mappers>  
  2.     <mapper resource=”com/liming/manager/data/mappers/UserMapper.xml” />  
  3.     <mapper resource=”com/liming/manager/data/mappers/StudentMapper.xml” />  
  4.     <mapper resource=”com/liming/manager/data/mappers/ClassMapper.xml” />  
  5.     <mapper resource=”com/liming/manager/data/mappers/TeacherMapper.xml” />  
  6. </mappers>  

SQL 映射XML 文件一些低端的要素:

1. cache – 配置给定情势的缓存
2. cache-ref – 从别的方式中援用二个缓存
3. resultMap –
那是最复杂而却壮大的贰个因素了,它描述怎么着从结果集中加载对象
4. sql – 一个足以被别的语句复用的SQL 块
5. insert – 映射INSERT 语句
6. update – 映射UPDATE 语句
7. delete – 映射DELEETE 语句
8. select  –  映射SELECT语句

1、INSERT

id: 对招待口的不二等秘书诀名
parameterType: 输入参数
useGeneratedKeys=”true” :让数据库生成自增加的列
keyProperty=”属性名”: 将生成的值设置到里面贰个输入对象属性内

假如是Oracle数据库,未有像MySQL那样的自增机制:

永利澳门游戏网址304 16
<insert id=”insertStudent” parameterType=”Student”> <selectKey
keyProperty=”studId” resultType=”int” order=”BEFORE”> SELECT
ELEARNING.STUD_ID_SEQ.NEXTVAL FROM DUAL </selectKey> INSERT INTO
STUDENTS(STUD_ID,NAME,EMAIL, PHONE)
VALUES(#{studId},#{name},#{email},#{phone}) </insert> View Code

order=”BEFORE” 表示在插入语句产生前产生studId的值就赋给插入语句。

永利澳门游戏网址304 17
<insert id=”insertStudent” parameterType=”Student”> INSERT INTO
STUDENTS(NAME,EMAIL, PHONE) VALUES(#{name},#{email},#{phone})
<selectKey keyProperty=”studId” resultType=”int” order=”AFTER”>
SELECT ELEARNING.STUD_ID_SEQ.CURRVAL FROM DUAL </selectKey>
</insert> View Code

 order=”AFTEEscort” 表示在插入语句之后采纳触发器(trigger)来安装主键值

二、SQL语句映射文件(2)增加和删除改查、参数、缓存

2、特点

坚韧不拔层 、ORM(对象关系映射) 、轻量级、扶助SQL语句。

三、动态SQL语句

       某些时候,sql语句where条件中,需求有些平安无事剖断,比方按性别检索,假设传入的参数是空的,此时询问出的结果很或许是空的,也许大家必要参数为空时,是意识到全部的音信。那是我们能够利用动态sql,扩展多少个论断,当参数不切合供给的时候,大家得以不去推断此询问条件。
        下文均选择mysql语法和函数(比如字符串链接函数CONCAT)。 

一、框架基本介绍

2.6.2Java实体类型参数

 依照姓名和性别,检索学生列表。使用实体类做参数:

Xml代码

  1. <!– 查询学生list,like姓名、=性别,参数entity类型 –>  
  2. <select id=”getStudentListWhereEntity” parameterType=”StudentEntity” resultMap=”studentResultMap”>  
  3.     SELECT * from STUDENT_TBL ST  
  4.         WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT(‘%’, #{studentName}),’%’)  
  5.           AND ST.STUDENT_SEX = #{studentSex}  
  6. </select>  

Java代码

  1. StudentEntity entity = new StudentEntity();  
  2. entity.setStudentName(“李”);  
  3. entity.setStudentSex(“男”);  
  4. List<StudentEntity> studentList = studentMapper.getStudentListWhereEntity(entity);  
  5. for (StudentEntity entityTemp : studentList) {  
  6.     System.out.println(entityTemp.toString());  
  7. }  

3、职业原理

  • 应用程序读取mybatis的布局文件,形成布局对象。
  • 通过sqlsessionfactorybuilder读取配置对象,发生sqlsessionfactory
  • 通过sqlsessionfactory得到sqlsession
  • 通过sqlsession得到mapper映射器
  • 透过mapper读取对应的投射文件进而操作数据库
  • 处监护人务
  • 释放sqlsession

3.4 foreach

对此动态SQL 非常必需的,主是要迭代三个会见,常常是用于IN 条件。
List 实例将运用“list”做为键,数组实例以“array” 做为键。

 

3.1 为各种JavaBean单独起小名

永利澳门游戏网址304 18<typeAliases>
<typeAlias alias=”Student” type=”com.mybatis3.domain.Student” />
<typeAlias alias=”Tutor” type=”com.mybatis3.domain.Tutor” />
</typeAliases> View
Code

1.2.3.3创造SQL映射语句文件

Student类的sql语句文件StudentMapper.xml
resultMap标签:表字段与质量的投射。
Select标签:查询sql。

Xml代码

  1. <?xml version=”1.0″ encoding=”UTF-8″ ?>  
  2. <!DOCTYPE mapper PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN” “;  
  3. <mapper namespace=”com.manager.data.StudentMapper”>  
  4.   
  5.     <resultMap type=”StudentEntity” id=”studentResultMap”>  
  6.         <id property=”studentID” column=”STUDENT_ID”/>  
  7.         <result property=”studentName” column=”STUDENT_NAME”/>  
  8.         <result property=”studentSex” column=”STUDENT_SEX”/>  
  9.         <result property=”studentBirthday” column=”STUDENT_BIRTHDAY”/>  
  10.     </resultMap>  
  11.       
  12.     <!– 查询学生,依照id –>  
  13.     <select id=”getStudent” parameterType=”String” resultType=”StudentEntity” resultMap=”studentResultMap”>  
  14.         <![CDATA[ 
  15.             SELECT * from STUDENT_TBL ST 
  16.                 WHERE ST.STUDENT_ID = #{studentID}  
  17.         ]]>   
  18.     </select>  
  19.       
  20.     <!– 查询学生列表 –>  
  21.     <select id=”getStudentAll”  resultType=”com.manager.data.model.StudentEntity” resultMap=”studentResultMap”>  
  22.         <![CDATA[ 
  23.             SELECT * from STUDENT_TBL 
  24.         ]]>   
  25.     </select>  
  26.       
  27. </mapper> 
 3.3 利用申明的法子起小名

接纳注脚@Alias起小名,@Alias
申明将会覆盖配置文件中的<typeAliases>定义:

永利澳门游戏网址304 19@Alias(“StudentAlias”)
public class Student { } View
Code

2.3 insert

 一个简单易行的insert语句:

Xml代码

  1. <!– 插入学生 –>  
  2. <insert id=”insertStudent” parameterType=”StudentEntity”>  
  3.         INSERT INTO STUDENT_TBL (STUDENT_ID,  
  4.                                           STUDENT_NAME,  
  5.                                           STUDENT_SEX,  
  6.                                           STUDENT_BIRTHDAY,  
  7.                                           CLASS_ID)  
  8.               VALUES   (#{studentID},  
  9.                           #{studentName},  
  10.                           #{studentSex},  
  11.                           #{studentBirthday},  
  12.                           #{classEntity.classID})  
  13. </insert>  

 insert能够行使数据库援救的自动生成主键计谋,设置useGeneratedKeys=”true”,然后把keyProperty
设成对应的列,就化解了。譬如说上边的StudentEntity 使用auto-generated
为id 列生成主键.
 还足以选取selectKey成分。上面例子,使用mysql数据库nextval(‘student’)为自定义函数,用来生成一个key。

Xml代码

  1. <!– 插入学生 自动主键–>  
  2. <insert id=”insertStudentAutoKey” parameterType=”StudentEntity”>  
  3.     <selectKey keyProperty=”studentID” resultType=”String” order=”BEFORE”>  
  4.             select student_seq.nextval from dual  
  5.     </selectKey>  
  6.         INSERT INTO STUDENT_TBL (STUDENT_ID,  
  7.                                  STUDENT_NAME,  
  8.                                  STUDENT_SEX,  
  9.                                  STUDENT_BIRTHDAY,  
  10.                                  CLASS_ID)  
  11.               VALUES   (#{studentID},  
  12.                         #{studentName},  
  13.                         #{studentSex},  
  14.                         #{studentBirthday},  
  15.                         #{classEntity.classID})      
  16. </insert>  

insert语句属性配置细节:

 
属性 描述 取值 默认
id 在这个模式下唯一的标识符,可被其它语句引用    
parameterType 传给此语句的参数的完整类名或别名    
flushCache 如果设为true,则会在每次语句调用的时候就会清空缓存。select 语句默认设为false true|false false
useCache 如果设为true,则语句的结果集将被缓存。select 语句默认设为false true|false false
timeout 设置驱动器在抛出异常前等待回应的最长时间,默认为不设值,由驱动器自己决定
true|false false
timeout  设置驱动器在抛出异常前等待回应的最长时间,默认为不设值,由驱动器自己决定 正整数 未设置
fetchSize 设置一个值后,驱动器会在结果集数目达到此数值后,激发返回,默认为不设值,由驱动器自己决定 正整数 驱动器决定
statementType statement,preparedstatement,callablestatement。
预准备语句、可调用语句
STATEMENT
PREPARED
CALLABLE
PREPARED
useGeneratedKeys

告诉MyBatis 使用JDBC 的getGeneratedKeys 方法来获取数据库自己生成的主键(MySQL、SQLSERVER 等

关系型数据库会有自动生成的字段)。默认:false

true|false false
keyProperty

标识一个将要被MyBatis 设置进getGeneratedKeys 的key 所返回的值,或者为insert 语句使用一个selectKey

子元素。

   

 

  

selectKey语句属性配置细节:

 

属性 描述 取值
keyProperty selectKey 语句生成结果需要设置的属性。  
resultType 生成结果类型,MyBatis 允许使用基本的数据类型,包括String 、int类型。  
order 可以设成BEFORE 或者AFTER,如果设为BEFORE,那它会先选择主键,然后设置keyProperty,再执行insert语句;如果设为AFTER,它就先运行 insert 语句再运行selectKey 语句,通常是insert 语句中内部调用数据库(像Oracle)内嵌的序列机制。  BEFORE
AFTER
statementType 像上面的那样, MyBatis 支持STATEMENT,PREPARED和CALLABLE 的语句形式, 对应Statement ,PreparedStatement 和CallableStatement 响应 STATEMENT
PREPARED
CALLABLE

 

三、映射文件批注

 
大家透过映射器配置文件配置了映射语句,同不平时候创立一个截然对应的一个映射器接口。接口名跟配置文件名一样。接口所在包名也跟配置文件所在包名完全同样。在配备文件中,其取名空间namespace 应该和接口的一心限定名保持一致。

2.1.4 collection聚集

聚焦元素用来管理“一对多”的关联。须要钦赐映射的Java实体类的属性,属性的javaType(日常为ArrayList);列表中目的的体系ofType(Java实体类);对应的数据库表的列名称;
以后和过去很分裂样景观供给告诉MyBatis 怎么样加载多少个汇集。MyBatis 能够用二种办法加载:

1. select: 执行贰个别的映射的SQL 语句再次来到三个Java实体类型。较活络;
2. resultsMap:
使用二个嵌套的结果映射来管理通过join查询结果集,映射成Java实体类型。

 

比如,多少个班级有三个学生。
先是定义班级中的学生列表属性:

Java代码

  1. private List<StudentEntity> studentList;  

5、Mappers

永利澳门游戏网址304 20<mappers>
<mapper resource=”com/mybatis3/mappers/StudentMapper.xml” />
<mapper url=”file:///D:/mybatisdemo/app/mappers/TutorMapper.xml”
/> <mapper class=”com.mybatis3.mappers.TutorMapper” />
<package name=”com.mybatis3.mappers” /> </mappers> View Code

  • resource 属性用来钦点在 classpath 中的 mapper 文件。
  • url 属性用来通过一丝一毫文件系统路线也许 web U保时捷911L 地址来指向 mapper 文件
  • class 属性用来针对八个 mapper 接口
  • package 属性用来指向能够找到 Mapper 接口的包名

3.1 if标签

 

 贰个很日常的查询:

Xml代码

  1. <!– 查询学生list,like姓名 –>  
  2. <select id=”getStudentListLikeName” parameterType=”StudentEntity” resultMap=”studentResultMap”>  
  3.     SELECT * from STUDENT_TBL ST   
  4. WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT(‘%’, #{studentName}),’%’)  
  5. </select>  

但是此时纵然studentName是null或空字符串,此语句很恐怕报错或询问结果为空。此时我们利用if动态sql语句先实行判别,假设值为null或等于空字符串,大家就实行此标准的论断。

修改为:

Xml代码

  1. <!– 查询学生list,like姓名 –>  
  2. <select id=” getStudentListLikeName ” parameterType=”StudentEntity” resultMap=”studentResultMap”>  
  3.     SELECT * from STUDENT_TBL ST  
  4.     <if test=”studentName!=null and studentName!=” “>  
  5.         WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT(‘%’, #{studentName}),’%’)  
  6.     </if>  
  7. </select>  

 

 此时,当studentName的值为null或’’的时候,我们并不实行where条件的判断,所以当studentName值为null或’’值,不附带那个规格,所以查询结果是整个。

 由于参数是Java的实体类,所以大家能够把富有条件都增大上,使用时比较灵敏,
new二个那样的实体类,大家必要限制特别条件,只需求附上相应的值就能够where这个原则,相反不去赋值就能够不在where中判别。

Xml代码

  1. <!– 查询学生list,like姓名,=性别、=出生之日、=班级,使用where,参数entity类型 –>  
  2. <select id=”getStudentListWhereEntity” parameterType=”StudentEntity” resultMap=”studentResultMap”>  
  3.     SELECT * from STUDENT_TBL ST  
  4.     <where>  
  5.         <if test=”studentName!=null and studentName!=” “>  
  6.             ST.STUDENT_NAME LIKE CONCAT(CONCAT(‘%’, #{studentName}),’%’)  
  7.         </if>  
  8.         <if test=”studentSex!= null and studentSex!= ” “>  
  9.             AND ST.STUDENT_SEX = #{studentSex}  
  10.         </if>  
  11.         <if test=”studentBirthday!=null”>  
  12.             AND ST.STUDENT_BIRTHDAY = #{studentBirthday}  
  13.         </if>  
  14.         <if test=”classEntity!=null and classEntity.classID !=null and classEntity.classID!=” “>  
  15.             AND ST.CLASS_ID = #{classEntity.classID}  
  16.         </if>  
  17.     </where>  
  18. </select>  

查询,姓名中有‘李’,男,生日在‘一九八五-05-28’,班级在‘20000002’的上学的小孩子。 

Java代码

  1. StudentEntity entity = new StudentEntity();  
  2. entity.setStudentName(“李”);  
  3. entity.setStudentSex(“男”);  
  4. entity.setStudentBirthday(StringUtil.parse(“1985-05-28”));  
  5. entity.setClassEntity(classMapper.getClassByID(“20000002”));  
  6. List<StudentEntity> studentList = studentMapper.getStudentListWhereEntity(entity);  
  7. for( StudentEntity entityTemp : studentList){  
  8.     System.out.println(entityTemp.toString());  
  9. }  

    3.2 where、set、trim标签


二、配置文件含义

1.2MyBatis+Spring+MySql轻便安插

再念书之MyBatis,学习之MyBatis

2.6.3Map参数

依照姓名和性别,检索学生列表。使用Map做参数:

Xml代码

  1. <!– 查询学生list,=性别,参数map类型 –>  
  2. <select id=”getStudentListWhereMap” parameterType=”Map” resultMap=”studentResultMap”>  
  3.     SELECT * from STUDENT_永利澳门游戏网址304,TBL ST  
  4.      WHERE ST.STUDENT_SEX = #{sex}  
  5.           AND ST.STUDENT_SEX = #{sex}  
  6. </select>  

Java代码

  1. Map<String, String> map = new HashMap<String, String>();  
  2. map.put(“sex”, “女”);  
  3. map.put(“name”, “李”);  
  4. List<StudentEntity> studentList = studentMapper.getStudentListWhereMap(map);  
  5. for (StudentEntity entityTemp : studentList) {  
  6.     System.out.println(entityTemp.toString());  
  7. }  
1.2 TransactionManager
  • JDBC:应用程序本身管理业务(汤姆cat)
  • MANAGED:应用本人不去管理业务,而把事务管理交给应用所在的服务器进行管理。(JBoss、WebLogic、GlassFish)

2.5 sql

Sql成分用来定义一个足以复用的SQL 语句段,供其余语句调用。比如:

Xml代码

  1. <!– 复用sql语句  查询student表全体字段 –>  
  2. <sql id=”selectStudentAll”>  
  3.         SELECT ST.STUDENT_ID,  
  4.                    ST.STUDENT_NAME,  
  5.                    ST.STUDENT_SEX,  
  6.                    ST.STUDENT_BIRTHDAY,  
  7.                    ST.CLASS_ID  
  8.               FROM STUDENT_TBL ST  
  9. </sql>  

 
   那样,在select的言语中就能够直接引用使用了,将上面select语句改成:

Xml代码

  1. <!– 查询学生,依照id –>  
  2. <select id=”getStudent” parameterType=”String” resultMap=”studentResultMap”>  
  3.     <include refid=”selectStudentAll”/>  
  4.             WHERE ST.STUDENT_ID = #{studentID}   
  5. </select>  

 

1、概念

支撑常常SQL查询、存款和储蓄进度和高端映射,简化和促成了Java
数据悠久化层的的开源框架,主要流行的案由在于她的轻松性和易使用性。

 2.2 select

多少个select 成分特别简单。比如:

Xml代码

  1. <!– 查询学生,遵照id –>  
  2. <select id=”getStudent” parameterType=”String” resultMap=”studentResultMap”>  
  3.     SELECT ST.STUDENT_ID,  
  4.                ST.STUDENT_NAME,  
  5.                ST.STUDENT_SEX,  
  6.                ST.STUDENT_BIRTHDAY,  
  7.                ST.CLASS_ID  
  8.           FROM STUDENT_TBL ST  
  9.          WHERE ST.STUDENT_ID = #{studentID}  
  10. </select>  

那条语句就叫做‘getStudent,有多少个String参数,并赶回三个StudentEntity类型的靶子。
注意参数的标记是:#{studentID}。

 

select 语句属性配置细节: 

 
属性 描述 取值 默认
id 在这个模式下唯一的标识符,可被其它语句引用    
parameterType 传给此语句的参数的完整类名或别名    
resultType 语句返回值类型的整类名或别名。注意,如果是集合,那么这里填写的是集合的项的整类名或别名,而不是集合本身的类名。(resultType 与resultMap 不能并用)    
resultMap 引用的外部resultMap 名。结果集映射是MyBatis 中最强大的特性。许多复杂的映射都可以轻松解决。(resultType 与resultMap 不能并用)    
flushCache 如果设为true,则会在每次语句调用的时候就会清空缓存。select 语句默认设为false true|false false
useCache 如果设为true,则语句的结果集将被缓存。select 语句默认设为false true|false false
timeout 设置驱动器在抛出异常前等待回应的最长时间,默认为不设值,由驱动器自己决定
true|false false
timeout  设置驱动器在抛出异常前等待回应的最长时间,默认为不设值,由驱动器自己决定 正整数 未设置
fetchSize 设置一个值后,驱动器会在结果集数目达到此数值后,激发返回,默认为不设值,由驱动器自己决定 正整数 驱动器决定
statementType statement,preparedstatement,callablestatement。
预准备语句、可调用语句
STATEMENT
PREPARED
CALLABLE
PREPARED
resultSetType forward_only,scroll_sensitive,scroll_insensitive
只转发,滚动敏感,不区分大小写的滚动
FORWARD_ONLY
SCROLL_SENSITIVE
SCROLL_INSENSITIVE
驱动器决定

 

2.6.4多参数的完毕 

 若是想传入多个参数,则要求在接口的参数上加多@Param注解。给出一个实例:
 接口写法:

Java代码

  1. public List<StudentEntity> getStudentListWhereParam(@Param(value = “name”) String name, @Param(value = “sex”) String sex, @Param(value = “birthday”) Date birthdar, @Param(value = “classEntity”) ClassEntity classEntity);
     

SQL写法:

Xml代码

  1. <!– 查询学生list,like姓名、=性别、=出生之日、=班级,多参数格局 –>  
  2. <select id=”getStudentListWhereParam” resultMap=”studentResultMap”>  
  3.     SELECT * from STUDENT_TBL ST  
  4.     <where>  
  5.         <if test=”name!=null and name!=” “>  
  6.             ST.STUDENT_NAME LIKE CONCAT(CONCAT(‘%’, #{name}),’%’)  
  7.         </if>  
  8.         <if test=”sex!= null and sex!= ” “>  
  9.             AND ST.STUDENT_SEX = #{sex}  
  10.         </if>  
  11.         <if test=”birthday!=null”>  
  12.             AND ST.STUDENT_BIRTHDAY = #{birthday}  
  13.         </if>  
  14.         <if test=”classEntity!=null and classEntity.classID !=null and classEntity.classID!=” “>  
  15.             AND ST.CLASS_ID = #{classEntity.classID}  
  16.         </if>  
  17.     </where>  
  18. </select>  

扩充询问:

Java代码

  1. List<StudentEntity> studentList = studentMapper.getStudentListWhereParam(“”, “”,StringUtil.parse(“1985-05-28”), classMapper.getClassByID(“20000002”));  
  2. for (StudentEntity entityTemp : studentList) {  
  3.     System.out.println(entityTemp.toString());  
  4. }  

1.2.3.2创设数量访问接口

Student类对应的dao接口:StudentMapper。

Java代码

  1. public interface StudentMapper {  
  2.       
  3.     public StudentEntity getStudent(String studentID);  
  4.       
  5.     public StudentEntity getStudentAndClass(String studentID);  
  6.       
  7.     public List<StudentEntity> getStudentAll();  
  8.       
  9.     public void insertStudent(StudentEntity entity);  
  10.       
  11.     public void deleteStudent(StudentEntity entity);  
  12.       
  13.     public void updateStudent(StudentEntity entity);  
  14. }  

 3.4.2参数为Array实例的写法:

SQL语句:

Xml代码

  1. <select id=”getStudentListByClassIDs” resultMap=”studentResultMap”>  
  2.     SELECT * FROM STUDENT_TBL ST  
  3.      WHERE ST.CLASS_ID IN   
  4.      <foreach collection=”array” item=”ids”  open=”(” separator=”,” close=”)”>  
  5.         #{ids}  
  6.      </foreach>  
  7. </select>  

 接口的主意注解:

Java代码

  1. public List<StudentEntity> getStudentListByClassIDs(String[] ids);
     

 

测量试验代码,查询学生中,在三千0002、两千0003那五个班级的学员:

Java代码

  1. String[] ids = new String[2];  
  2. ids[0] = “20000002”;  
  3. ids[1] = “20000003”;  
  4. List<StudentEntity> studentList = studentMapper.getStudentListByClassIDs(ids);  
  5. for( StudentEntity entityTemp : studentList){  
  6.     System.out.println(entityTemp.toString());  
  7. }  

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注