MyBatis持久层框架的用法知识小结

MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

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应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。

1.使用Generator自动生成Dao层,Model层和Mapper层。

MyBatis Generator下载地址:http://www.mybatis.org/generator/

MyBatis Generator中文介绍:http://generator.sturgeon.mopaas.com/

以下用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

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
 <!-- 配置属性文件 用来在配置文件中引入变量 El表达式 -->
 <!-- 如果是用cmd方式运行 这里应该写url方式写全路径 因为找不到classpath 对于resource来说 -->
 <!--
 <properties url="file:///D:/workspaces/mybatisGen/bin/generatorConfig.properties"/>
 -->
 <!-- 数据库驱动包位置 -->
 <!-- SQL Server数据驱动包 -->
 <classPathEntry location="D:\JavaProject\generator\sqljdbc4-4.0.jar" />
 <!-- Oracle数据驱动包 -->
 <!--
 <classPathEntry location="D:\Java\m2\repository\com\oracle\ojdbc14\10.2.0.1.0\ojdbc14-10.2.0.1.0.jar" />
 -->
 <!-- MySQL数据驱动包 -->
 <!--
 <classPathEntry location="D:\JavaProject\generator\mysql-connector-java-5.1.34.jar" />
 -->
 <!-- 此处指定生成针对MyBatis3的DAO-->
 <!--
  id: 必须配置。这个上下文的惟一标识符。该值将被用在一些错误消息。
  defaultModelType:用来定义生成模型类型策略。
  1.conditional 默认策略,为每个表生成一个Model class
  2.flat:将所有的表中生成一个Model class,即这个类将保存所有表中字段
  3.hierarchical :如果表有一个主键,该模型将生成一个主键类,另一个类,用于容纳任何BLOB列在表中,和另一个类,用于容纳其余的字段。这个是一个适当的继承类之间的关系。
 targetRuntime:此属性用于指定运行时目标生成的代码。
  1.MyBatis3 默认值 将生成对象兼容MyBatis版本3.0和更高版本,和JSE 5.0和更高版本
  (例如Java模型和mapper接口将使用泛型类型)。
  “by example”方法在这些生成的对象支持几乎无限的动态where子句。
  此外,Java对象与这些生成器生成支持许多JSE 5.0特性包括参数化的类型和注释。
  2.Ibatis2Java2
  3.Ibatis2Java5
 -->
 <context id="MySQLTables" targetRuntime="MyBatis3" defaultModelType="conditional">
 <!--
 <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" />
 -->
 <!--
  用来生成注释
  1. suppressAllComments 默认是false 此属性用于指定在生成的代码是否将包括任何注释。如果设置为true 则不生成注释
  2. suppressDate 默认是false 此属性用于指定在生成的注释是否将包括MBG代时间戳。
 -->
 <commentGenerator>
  <property name="suppressAllComments" value="true" />
 </commentGenerator>
 <!-- 数据库链接URL、用户名、密码 -->
 <!-- MySQL数据库链接URL、用户名、密码 -->
 <!--
 <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3310/test" userId="test" password="1234">
  </jdbcConnection>
 -->
 <!-- Oracle数据库链接URL、用户名、密码 -->
 <!--
 <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:orcl" userId="test" password="1234">
 </jdbcConnection>
 -->
 <!-- SQL Server数据库链接URL、用户名、密码 -->
  <jdbcConnection driverClass="com.microsoft.sqlserver.jdbc.SQLServerDriver" connectionURL="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test" userId="test" password="1234">
  </jdbcConnection>
 <!-- H2
  <entry key="jdbc.url">jdbc:h2:tcp://localhost/test</entry>
  <entry key="jdbc.driver">org.h2.Driver</entry>
 -->
 <!-- SQLServer2000
  <entry key="jdbc.url">jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=[database]</entry>
  <entry key="jdbc.driver">com.microsoft.jdbc.sqlserver.SQLServerDriver</entry>
 -->
 <!-- SQLServer2005
  <entry key="jdbc.url">jdbc:sqlserver://192.168.0.98:1433;DatabaseName=[database]</entry>
  <entry key="jdbc.driver">com.microsoft.sqlserver.jdbc.SQLServerDriver</entry>
 -->
 <!-- JTDs for SQLServer
  <entry key="jdbc.url">jdbc:jtds:sqlserver://192.168.0.102:1433/[database];tds=8.0;lastupdatecount=true</entry>
  <entry key="jdbc.driver">net.sourceforge.jtds.jdbc.Driver</entry>
 -->
 <!-- PostgreSql
  <entry key="jdbc.url">jdbc:postgresql://localhost/[database]</entry>
  <entry key="jdbc.driver">org.postgresql.Driver</entry>
 -->
 <!-- Sybase
  <entry key="jdbc.url">jdbc:sybase:Tds:localhost:5007/[database]</entry>
  <entry key="jdbc.driver">com.sybase.jdbc.SybDriver</entry>
 -->
 <!-- DB2
  <entry key="jdbc.url">jdbc:db2://localhost:5000/[database]</entry>
  <entry key="jdbc.driver">com.ibm.db2.jdbc.app.DB2Driver</entry>
 -->
 <!-- HsqlDB
  <entry key="jdbc.url">jdbc:hsqldb:mem:generatorDB</entry>
  <entry key="jdbc.driver">org.hsqldb.jdbcDriver</entry>
 -->
 <!-- Derby
  <entry key="jdbc.url">jdbc:derby://localhost/databaseName</entry>
  <entry key="jdbc.driver">org.apache.derby.jdbc.ClientDriver</entry>
 -->
 <!-- java类型解析器 可选配置 -->
 <!--
  <javaTypeResolver type="">
  type属性: 这可用于指定一个用户提供的Java类型解析器。这个类必须实现接口org.mybatis.generator.api。
  JavaTypeResolver,必须有一个公共的默认构造函数。属性还可以接受特殊的值默认在这种情况下,将使用默认的实现(这同样的效果不指定类型)。
  该标签支持的属性:
  forceBigDecimals:默认是false 是否强制使用BigDecimal来表示所有的十进制和数值字段。
  •如果规模很大,长度大于18,将使用BigDecimal类型。
  •如果其长度为10到18,则Java类型解析器将java.lang.Long来代替了。
  •如果长度为5到9,然后Java类型解析器将替换为一个Java.lang.integer。
  •如果其长度小于5,则Java类型解析器将以java.lang.Short替代。
 -->
 <javaTypeResolver>
  <property name="forceBigDecimals" value="false" />
 </javaTypeResolver>
 <!-- 生成vo对象 -->
 <!--
  < javaModelGenerator >元素用于定义Java模型生成的属性。
  Java模型生成器建立主键类,记录类,和查询示例类相匹配的表进行自省。这个元素是所需的子元素<上下文>元素。
  支持的属性:
  constructorBased:
  此属性用于选择是否MyBatis生成器将生成一个类的构造函数,它接受一个值类中的每个字段。同时,SQL结果地图将建成投入使用构造函数而不是“setter”每个字段。
  这个属性是只适用于MyBatis3和将被忽略了iBATIS2。
  默认值是false。
  immutable:
  不可变,此属性用于选择是否MyBatis生成器将产生不可变模型类——这意味着类不会有“setter”方法和构造函数会接受类中每个字段的值。默认为false。
  trimStrings:
  此属性用于选择MyBatis生成器是否添加代码来修剪的字符字段从数据库返回的空白空间。
  这很有用,如果您的数据库将数据存储在字符字段而不是VARCHAR字段。MyBatis生成器将插入代码来削减字符字段。
  默认值是false。
 -->
 <!-- 生成实体类的包名和位置,这里配置将生成的实体类放在com.ouc.model这个包下 -->
 <javaModelGenerator targetPackage="com.ouc.model" targetProject="D:\JavaProject\generator\src">
  <property name="enableSubPackages" value="true" />
  <property name="trimStrings" value="true" />
 </javaModelGenerator>
 <!-- 生成用于查询的mapping对象 -->
 <!-- 生成的SQL映射文件包名和位置,这里配置将生成的SQL映射文件放在com.ouc.mapping这个包下 -->
 <sqlMapGenerator targetPackage="com.ouc.mapping" targetProject="D:\JavaProject\generator\src">
  <property name="enableSubPackages" value="true" />
 </sqlMapGenerator>
 <!-- 生成DAO的类文件以及配置文件 -->
 <!--
  < javaClientGenerator >元素是用来定义Java客户机代码生成器的属性。
  Java客户机生成器用来建立Java接口和类,以便可以方便地使用生成的Java模型和XML映射文件。
  对于iBATIS2目标环境,这些生成的对象采用形式的DAO接口和实现类。
  对于MyBatis,生成的对象采用mapper形式的接口。
  这个元素是一个可选的子元素。
  如果你不指定这个元素,MyBatis生成器(MBG)不会生成Java客户端接口和类。
  其中的type属性:
  如果targetRuntime 为MyBatis3
  XMLMAPPER:生成的对象将Java接口MyBatis 3.x mapper基础设施。接口将会依赖生成的XML映射器文件。一般都是使用这个XMLMAPPER.
 -->
 <!-- 生成DAO的包名和位置,这里配置将生成的dao类放在com.ouc.dao这个包下 -->
 <javaClientGenerator type="XMLMAPPER" targetPackage="com.ouc.dao" targetProject="D:\JavaProject\generator\src">
  <property name="enableSubPackages" value="true" />
 </javaClientGenerator>
 <!--
  <table>元素用于选择数据库中的一个表。选择的表将导致为每个表生成以下对象:
  •一个MyBatis / iBATIS•格式化的SQL的映射文件
  •一组类,形成了“模型”表包括:
  •一个类来匹配•表的主键(如果表有一个主键)。
  •表中字段匹配的,不是在主键,而非BLOB字段。这个类将扩展主键,如果有一个。
  •一个类来持有任何表中的BLOB字段(如果有的话)。这个类将扩展其中一个的前面两个类取决于表的配置。
  •一个类,用于生成动态where子句,在不同的“by Example”方法(selectByExample,deleteByExample)。
  •(可选)DAO接口和类
  tableName:必须配置 指定表的名称
  domainObjectName:生成javabean对象的基本名称。如果未指定,MBG将自动基于表名生成。
  这个名字(无论是在这里指定,或自动生成)将被用来作为域类名和DAO类的名字。
  enableInsert:是否生成插入语句。默认是true
  enableSelectByPrimaryKey:是否通过主键生成选择语句。不管是否有这种设置,如果该表没有一个主键将不会生成。
  enableUpdateByPrimaryKey:是否通过主键生成更新语句。如果该表没有主键,不管是否设置该属性,语句将不会生成。
  enableDeleteByPrimaryKey:是否通过主键生成删除语句。如果该表没有主键,不管这种设置该属性,语句将不会生成。
  enableDeleteByExample:是否通过example对象生成删除语句。这个声明使得许多不同的动态删除在运行时生成。
  enableCountByExample:是否通过example对象生成计算行数语句。该语句将返回一个表中的行数相匹配的example。
  enableUpdateByExample:是否通过example对象生成更新语句。该语句将更新一个表中相匹配的记录。
  selectByPrimaryKeyQueryId:这个值将被添加到选择列表中选择通过主键的声明在本表格:“' <值>作为QUERYID”。这可以用于识别查询在DBA在运行时跟踪工具。如果你需使用,你应该指定一个唯一的id为每个不同的查询生成MBG。
  selectByExampleQueryId:这个值将被添加到选择列表中选择通过例子的声明在本表格:“' <值>作为QUERYID”。这可以用于识别查询在DBA在运行时跟踪工具。如果你需使用,你应该指定一个唯一的id为每个不同的查询生成MBG。
  enableSelectByExample:是否应该生成通过example的选择语句。这个声明使得许多不同的动态查询是在运行时生成。
  modelType:此属性用于覆盖默认的模型类型,如果你想对这张表这么做。如果未指定,MBG将生成的域对象基于上下文默认的模型类型。
  该模型类型定义了如何将生成MBG域类。
  一些模型类型MBG将生成一个单一的域类为每个表,和其他可能产生不同的类MBG取决于表的结构。
  escapeWildcards:排除通配符。这意味着无论SQL通配符(' _ '和' % ')的模式和表名都应该避免在搜寻列。
  这是一些驱动要求如果模式或表包含一个SQL通配符(例如,如果一个表的名字是MY_TABLE,一些驱动要求的下划线字符进行转义)。
 -->
 <!-- 要生成那些表(更改tableName和domainObjectName就可以) -->
 <table tableName="V_SupplyUser" domainObjectName="VSupplyUser" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
 <table tableName="WJ_GateList" domainObjectName="WJGateList" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
 </context>
</generatorConfiguration>

打开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配置文件如下:

<?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>
<settings>
<setting name="cacheEnabled" value="true" />
<setting name="lazyLoadingEnabled" value="true" />
<setting name="multipleResultSetsEnabled" value="true" />
<setting name="useColumnLabel" value="true" />
<setting name="useGeneratedKeys" value="false" />
<setting name="autoMappingBehavior" value="PARTIAL" />
<setting name="defaultExecutorType" value="SIMPLE" /><!-- SIMPLE REUSE BATCH -->
<!-- <setting name="defaultExecutorType" value="BATCH" /> -->
<setting name="defaultStatementTimeout" value="" />
<setting name="safeRowBoundsEnabled" value="false" />
<setting name="mapUnderscoreToCamelCase" value="false" />
<setting name="localCacheScope" value="SESSION" />
<!-- <setting name="jdbcTypeForNull" value="OTHER" /> -->
<setting name="jdbcTypeForNull" value="NULL" />
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />
</settings>
<typeAliases>
<!-- 模块 -->
<typeAlias alias="User" type="com.ouc.mkhl.platform.authority.model.User"/>
<typeAlias alias="Role" type="com.ouc.mkhl.platform.authority.model.Role"/>
<typeAlias alias="Equipment" type="com.ouc.mkhl.platform.basedata.model.Equipment"/>
<typeAlias alias="Factory" type="com.ouc.mkhl.platform.basedata.model.Factory"/>
</typeAliases>
<typeHandlers>
<typeHandler handler="com.ouc.openplatform.dao.mybatis.SerializableTypeHandler"/>
</typeHandlers>
</configuration>

序列化特殊值处理:SerializableTypeHandler

package com.ouc.openplatform.dao.mybatis;
import java.io.Serializable;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
/**
* @author WuPing
*/
public class SerializableTypeHandler extends BaseTypeHandler<Serializable> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Serializable parameter, JdbcType jdbcType)
throws SQLException {
ps.setObject(i, parameter);
}
@Override
public Serializable getNullableResult(ResultSet rs, String columnName)
throws SQLException {
return (Serializable)rs.getObject(columnName);
}
@Override
public Serializable getNullableResult(ResultSet rs, int columnIndex)
throws SQLException {
return (Serializable)rs.getObject(columnIndex);
}
@Override
public Serializable getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
return (Serializable)cs.getObject(columnIndex);
}
}

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

<resultMap id="UserBaseResultMap" type="User" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="userName" property="userName" jdbcType="VARCHAR" />
<result column="password" property="password" jdbcType="VARCHAR" />
<result column="email" property="email" jdbcType="VARCHAR" />
<result column="trueName" property="trueName" jdbcType="VARCHAR" />
<result column="sex" property="sex" jdbcType="VARCHAR" />
<result column="age" property="age" jdbcType="INTEGER" />
<result column="telephone" property="telephone" jdbcType="VARCHAR" />
</resultMap>

model类:User

package com.ouc.mkhl.platform.authority.model;
import java.io.Serializable;
//用户信息
public class User implements Serializable {
 private static final long serialVersionUID = 1098321123L;
 private Integer id; //用户Id
 private String userName; //用户名
 private String password; //未加密密码
 private String email; //邮箱
 private String trueName; //真实姓名
 private String sex; //性别
 private Integer age; //年龄
 private String telephone; //手机
 public Integer getId() {
 return id;
 }
 public void setId(Integer id) {
 this.id = id;
 }
 public String getUserName() {
 return userName;
 }
 public void setUserName(String userName) {
 this.userName = userName == null ? null : userName.trim();
 }
 public String getPassword() {
 return password;
 }
 public void setPassword(String password) {
 this.password = password == null ? null : password.trim();
 }
 public String getEmail() {
 return email;
 }
 public void setEmail(String email) {
 this.email = email == null ? null : email.trim();
 }
 public String getTrueName() {
 return trueName;
 }
 public void setTrueName(String trueName) {
 this.trueName = trueName == null ? null : trueName.trim();
 }
 public String getSex() {
 return sex;
 }
 public void setSex(String sex) {
 this.sex = sex == null ? null : sex.trim();
 }
 public Integer getAge() {
 return age;
 }
 public void setAge(Integer age) {
 this.age = age;
 }
 public String getTelephone() {
 return telephone;
 }
 public void setTelephone(String telephone) {
 this.telephone = telephone == null ? null : telephone.trim();
 }
}

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="selectUsers" resultMap="UserBaseResultMap">
select id,userName,email from user
</select> 

(2) insert插入:saveUser

此处数据库表使用主键自增,主键为id。

① fetchSize:设置一个值后,驱动器会在结果集数目达到此数值后,激发返回,默认为不设值,由驱动器自己决定。

② statementType:statement,preparedstatement,callablestatement。预准备语句、可调用语句。

③ useGeneratedKeys:使用JDBC的getGeneratedKeys方法来获取数据库自己生成的主键(MySQL、SQLSERVER等关系型数据库会有自动生成的字段)。

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

<insert id="saveUser" parameterType="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})
</insert> 

(3)update更新:动态更新SQL:updateUser

<update id="updateUser" parameterType="User" >
update user
<set >
<if test="userName != null" >
userName = #{userName,jdbcType=VARCHAR},
</if>
<if test="password != null" >
password = #{password,jdbcType=VARCHAR},
</if>
<if test="email != null" >
email = #{email,jdbcType=VARCHAR},
</if>
<if test="trueName != null" >
trueName = #{trueName,jdbcType=VARCHAR},
</if>
<if test="sex != null" >
sex = #{sex,jdbcType=VARCHAR},
</if>
<if test="age != null" >
age = #{age,jdbcType=INTEGER},
</if>
<if test="telephone != null" >
telephone = #{telephone,jdbcType=VARCHAR},
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>

(4)delete删除:deleteUser

<delete id="deleteUser" parameterType="Integer">
delete from user
where id = #{id,jdbcType=INTEGER}
</delete> 

(5)sql: Sql元素用来定义一个可以复用的SQL语句段,供其它语句调用。

<sql id="UserBaseColumnList" >
userName, password, email, telephone
</sql>
<select id="getUsers" resultMap="UserBaseResultMap">
select
<include refid="UserBaseColumnList" />
from user
</select> 

(6)参数:parameters:MyBatis可以使用基本数据类型和Java的复杂数据类型。

基本数据类型,String,int,date等。

使用基本数据类型,只能提供一个参数,所以需要使用Java实体类,或Map类型做参数类型。通过#{}可以直接得到其属性。

① 基本数据类型参数:String

<select id="getUserByName" resultType="User" parameterType="String" >
select id, userName, email from user
where userName = #{userName,jdbcType=VARCHAR}
</select>

Java代码:

public User getUserByName(String name); // 根据用户名获取用户信息

② Java实体类型参数:User

<insert id="saveUser" parameterType="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})
</insert>

Java代码:

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

③ Map参数:Map<String, Object> recordMap

<select id="selectChildGroupTotalNum" resultType="Integer" >
select count(*) from groupinfo
<trim prefix="WHERE" prefixOverrides="AND|OR">
and id in
<foreach collection="idStr" item="ids" open="(" separator="," close=")">
#{ids}
</foreach>
<if test="name!= null and name!='' " >
and name LIKE CONCAT(CONCAT('%', #{name}),'%')
</if>
<if test="description!= null and description!='' " >
AND description LIKE CONCAT(CONCAT('%', #{description}),'%')
</if>
<if test="type != null and type!=-1 " >
AND type = #{type,jdbcType=INTEGER}
</if>
<if test="category != null and category!=-1 " >
AND category = #{category,jdbcType=INTEGER}
</if>
</trim>
</select>

Java代码:

//获取子组总记录数
public int selectChildGroupTotalNum(Map<String, Object> recordMap);
Map<String, Object> recordMap = new HashMap<String, Object>();
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 id="selectSensorNobySensorName" resultType="Integer" useCache="false" flushCache="true">
select SensorNo from sensorconfig
where Name = #{0} and TestunitNo = #{1} and LABCODE = #{2}
</select>

Java代码:

//根据参数名查询参数ID
public int selectSensorNobySensorName(String sensorName, int testUnitNo, String labCode);

方法二:接口参数上添加@Param注解。

<select id="selectByUserNameAndVCode" resultMap="UserBaseResultMap">
select id, userName from user
<trim prefix="WHERE" prefixOverrides="AND|OR">
<if test="userName!= null and userName!='' ">
and userName LIKE CONCAT(CONCAT('%', #{userName}),'%')
</if>
<if test="supplierno!= null and supplierno!='' ">
and supplierNo LIKE CONCAT(CONCAT('%', #{supplierno}),'%')
</if>
and supplierNo != 'test'
</trim>
LIMIT #{startIndex},#{pageSize}
</select>

Java代码:

// 根据用户名和V码查询用户信息
public List<User> 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 id="selectTotalNumByAccountType" resultType="Integer" >
select count(*) from user
<trim prefix="WHERE" prefixOverrides="AND|OR">
and id not in
<foreach collection="idStr" item="ids" open="(" separator="," close=")">
#{ids}
</foreach>
<if test="userName!= null and userName!='' ">
and userName LIKE CONCAT(CONCAT('%', #{userName}),'%')
</if>
<if test="supplierno!= null and supplierno!='' ">
and supplierNo LIKE CONCAT(CONCAT('%', #{supplierno}),'%')
</if>
<if test="trueName!= null and trueName!='' ">
and trueName LIKE CONCAT(CONCAT('%', #{trueName}),'%')
</if>
AND accountType = #{accountType}
</trim></select>

以上所述是小编给大家介绍的MyBatis持久层框架的用法知识小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Java持久层框架MyBatis简单实例

    什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .iBATIS一词来源于"internet"和"abatis"的组合,是一个基于Java的持久层框架.iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO). MyBatis 本是apache的一个开源项目iB

  • Mybatis中#{}和${}传参的区别及#和$的区别小结

    最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, 比如说用#{},和 ${}传参的区别, 使用#传入参数是,sql语句解析是会加上"",比如 select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是 select * from table where name = '小李',就是会当成字符串来解析,这样相比于$的好处是比较明显对的吧,#{}传参能防止sql注入,如果

  • 浅谈mybatis中的#和$的区别

    1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". 2. $将传入的数据直接显示生成在sql中.如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为ord

  • MyBatis持久层框架的用法知识小结

    MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录. MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google c

  • Mybatis持久层框架入门之CRUD实例代码详解

    目录 1.MyBatis第一个程序 1.1.代码演示 1.2.问题说明 2.CRUD操作 2.1.namespace 2.2.select 2.3.insert 2.4.update 2.5.delete 2.6.拓展思维 1.MyBatis第一个程序 思路流程:搭建环境–>导入Mybatis—>编写代码—>测试 1.1.代码演示 ​ 1.搭建实验数据库 CREATE DATABASE `mybatis`; USE `mybatis`; DROP TABLE IF EXISTS `use

  • Java持久层框架Mybatis入门详细教程

    mybatis介绍 mybatis它是轻量级持久层框架,由ibatis演化而来.它自动连接数据库,将数据库的结果集封装到对象中POJO. POJO: 一个简单的Java类,这个类没有实现/继承任何特殊的java接口或者类,不遵循任何主要java模型,约定或者框架的java对象.在理想情况下,POJO不应该有注解. JavaBean: JavaBean是可序列化的,实现了serializable接口 具有一个无参构造器 有按照命名规范的set和gett,is(可以用于访问布尔类型的属性)方法 My

  • java持久层框架mybatis防止sql注入的方法

    sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如"or '1'='1'"这样的语句,有可能入侵参数校验不足的应用程序.所以在我们的应用中需要做一些工作,来防备这样的攻击方式.在一些安全性很高的应用中,比如银行软件,经常使用将sql语句全部替换为存储过程这样的方式,来防止sql注入,这当然是一种很安全的方式,但我们平时开发中,可能不需要这种死板的方式. mybatis框架作为一款半自动化的持久层框架,其sql语句都要我们自己来手

  • 解析MyBatis源码实现自定义持久层框架

    目录 自定义框架设计 自定义框架实现 使用端 框架端 自定义框架设计 使用端 : 提供核⼼配置⽂件: sqlMapConfig.xml : 存放数据源信息,引⼊mapper.xml Mapper.xml : sql语句的配置⽂件信息 框架端: 1.读取配置⽂件 读取完成以后以流的形式存在,我们不能将读取到的配置信息以流的形式存放在内存中,不好操作,可以创建JavaBean来存储 (1)Configuration : 存放数据库基本信息.Map<唯⼀标识,Mapper>, 唯⼀标识:namesp

  • SpringBoot集成JPA持久层框架,简化数据库操作

    目录 与SpringBoot2.0整合 1.核心依赖 2.配置文件 3.实体类对象 4.JPA框架的用法 5.封装一个服务层逻辑 测试代码块 源代码地址 与SpringBoot2.0整合 1.核心依赖 <!-- JPA框架 --> <dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-data-jpa<

  • Java手写持久层框架的详细代码

    目录 前言 JDBC操作回顾及问题分析 1.定义配置xml文件 2.读取配置文件 3.定义sql操作接口SqlSession 4.编写数据库执行逻辑 5.调用测试 ⾃定义框架优化 总结 本文适合有一定java基础的同学,通过分析jdbc存在的问题,进行手写自定义持久层框架,可以更加清楚常用的mybatis等开源框架的原理. 前言 本文适合有一定java基础的同学,通过自定义持久层框架,可以更加清楚常用的mybatis等开源框架的原理. JDBC操作回顾及问题分析 学习java的同学一定避免不了接

  • Spring Boot 整合持久层之MyBatis

    目录 整合MyBatis 1. 创建项目 2. 创表实体类等 3. 创建数据库访问层 4. 创建 BookMapper.xml 5. 创建Service和BookController 6. 配置 pom.xml 文件 整合MyBatis MyBatis 是一款优秀的持久层框架,原名 iBatis ,2010年迁移到 Goole Code 并改名为 MyBatis ,2013年迁移到 GitHub 上.MyBatis 支持定制化 SQL .存储过程及高级映射.MyBatis 几乎避免了所有的 JD

  • 持久层ORM框架Hibernate框架的使用及搭建方式

    目录 前言 一.Hibernate的优点? 二.Hibernate的缺点 三.搭建Hibernate项目架构 四.Hibernate核心接口的介绍 五.封装Hibernate的工具类 六.常用的CRUD操作 七.主键生成机制 八.Hibernate的类型 总结 前言 hibernate的概念: hibernate是一个ormapping框架(ORM框架,全自动ORM框架) hibernate是一个数据库的操作框架即持久层框架 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行

随机推荐