基于Mybatis的配置文件入门必看篇

Mybatis 配置文件入门

从这篇文章开始,我们将从其核心配置文件入手,对Mybatis支持的核心配置文件进行简单详细的描述。

从下面这段代码是我们在使用mybatis前的配置初始化过程

我们通过阅读其源码来逐步了解内部实现原理。

// Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与数据库进行交互
 private static SqlSessionFactory getSessionFactory() {
  SqlSessionFactory sessionFactory = null;
  String resource = "configuration.xml";
  try {
   sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));
  } catch (IOException e) {
   e.printStackTrace();
  }
  return sessionFactory;
 }

我们进入到SqlSessionFactoryBuilder类里面

查看其源码:

/**
 *    Copyright 2009-2016 the original author or authors.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package org.apache.ibatis.session;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.Properties;

import org.apache.ibatis.builder.xml.XMLConfigBuilder;
import org.apache.ibatis.exceptions.ExceptionFactory;
import org.apache.ibatis.executor.ErrorContext;
import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory;
/**
 * Builds {@link SqlSession} instances.
 *
 * @author Clinton Begin
 */
public class SqlSessionFactoryBuilder {

  public SqlSessionFactory build(Reader reader) {
    return build(reader, null, null);
  }

  public SqlSessionFactory build(Reader reader, String environment) {
    return build(reader, environment, null);
  }

  public SqlSessionFactory build(Reader reader, Properties properties) {
    return build(reader, null, properties);
  }

  public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
      return build(parser.parse());
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
      ErrorContext.instance().reset();
      try {
        reader.close();
      } catch (IOException e) {
        // Intentionally ignore. Prefer previous error.
      }
    }
  }

  public SqlSessionFactory build(InputStream inputStream) {
    return build(inputStream, null, null);
  }

  public SqlSessionFactory build(InputStream inputStream, String environment) {
    return build(inputStream, environment, null);
  }

  public SqlSessionFactory build(InputStream inputStream, Properties properties) {
    return build(inputStream, null, properties);
  }

  public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
      return build(parser.parse());
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
      ErrorContext.instance().reset();
      try {
        inputStream.close();
      } catch (IOException e) {
        // Intentionally ignore. Prefer previous error.
      }
    }
  }

  public SqlSessionFactory build(Configuration config) {
    return new DefaultSqlSessionFactory(config);
  }

}

在这个类中,支持多种构造SqlSessionFactory的方法。可以只传入mybatis配置文件,也可以同时传入properties配置文件替代mybatis配置文件中的<properties>元素标签,另外也支持传入环境参数envirmont参数。

我们跟随着源码继续往下看:

 public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
      return build(parser.parse());
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
      ErrorContext.instance().reset();
      try {
        reader.close();
      } catch (IOException e) {
        // Intentionally ignore. Prefer previous error.
      }
    }
  }

这里创建了一个XMLConfigBuilder类实例,通过他来对mybatis配置文件(一个xml配置文件)进行解析。

解析的代码入口如下所示:

public Configuration parse() {
    if (parsed) {
      throw new BuilderException("Each XMLConfigBuilder can only be used once.");
    }
    parsed = true;
    parseConfiguration(parser.evalNode("/configuration"));
    return configuration;
  }

  private void parseConfiguration(XNode root) {
    try {
      Properties settings = settingsAsPropertiess(root.evalNode("settings"));
      //issue #117 read properties first
      propertiesElement(root.evalNode("properties"));
      loadCustomVfs(settings);
      typeAliasesElement(root.evalNode("typeAliases"));
      pluginElement(root.evalNode("plugins"));
      objectFactoryElement(root.evalNode("objectFactory"));
      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
      reflectorFactoryElement(root.evalNode("reflectorFactory"));
      settingsElement(settings);
      // read it after objectFactory and objectWrapperFactory issue #631
      environmentsElement(root.evalNode("environments"));
      databaseIdProviderElement(root.evalNode("databaseIdProvider"));
      typeHandlerElement(root.evalNode("typeHandlers"));
      mapperElement(root.evalNode("mappers"));
    } catch (Exception e) {
      throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    }
  }

从这里看出,配置文件是以configuration为根节点,在根节点之下有多个子节点,它们分别为:settings、properties、typeAliases、plugins、objectFactory、objectWrapperFactory、environments、databaseIdProvider、typeHandlers、mappers。

MyBatis核心配置文件标签简介

XML 映射配置文件

MyBatis的配置文件包含了影响MyBatis行为甚深的设置(settings)和属性(properties)信息。文档的顶层结果如下:

configuration配置

properties属性

setting设置

typeAliases类型命名

typeHandlers类型处理器

objectFactory对象工厂

plugins插件

environments环境

environment环境变量

transactionManager事务管理器

dataSource数据源

databaseIdProyider数据库厂商标识

mappers映射

properties

属性都是可外部配置且可动态替换的,既可以在典型的Java属性文件中配置,亦可通过properties元素的子元素来传递。

例如:

<!--
  mybatis的核心配置文件
   1.数据库的连接信息(连接池)
  -->
  <properties resource="jdbc.properties"></properties>

其中的属性就可以在整个配置文件中使用来替换需要动态配置的属性值。

比如:

  <!-- 默认连接池 -->
  <dataSource type="POOLED">
       <property name="driver" value="${driverClass}"/>
       <property name="url" value="${url}"/>
       <property name="username" value="${userid}"/>
       <property name="password" value="${password}"/>
   </dataSource>

properties属性:将数据库连接参数单独配置在jdbc.properties中,只需要在mybatis.xml文件中加载jdbc.properties的属性值。 在mybatis.xml中就不需要对数据库连接参数硬编码(硬编码是指将可变变量用一个固定值来代替的方法)。在properties 元素体内定义的属性首先被读取。然后会读取properties元素中resource或url加载属性,它会覆盖已读取的同名属性。

注意:如果在properties标签里面定义的属性被${}所引用了,对#{}不管用。那么它不会读取parameterType里面的参数值。比如properties里面定义了id属性,值为40,在映射文件中引用该值,${id}那么我从parameterType里面传值时,不管我传基本类型还是引用类型进去都不会覆盖这个${id}值。始终都会读取40.

属性也可以被传递到SqlSessionBuilder.build()方法中。

例如:

SqlSessionFactoryBuilder源码:

 public SqlSessionFactory build(Reader reader, Properties properties) {
    return build(reader, null, properties);
  }

  public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
      return build(parser.parse());
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
      ErrorContext.instance().reset();
      try {
        reader.close();
      } catch (IOException e) {
        // Intentionally ignore. Prefer previous error.
      }
    }
  }

typeAliases

类型别名是为Java类型设置一个短的名字。它只和XML配置有关,存在意义仅在于用来减少类完全限定名的冗余。

例如:

 <!-- 给类定义别名 -->
  <typeAliases>
   <typeAlias type="cn.et.lesson02.annotion.Food" alias="food"/>
   <typeAlias alias="Author" type="domain.blog.Author"/>
    <typeAlias alias="Blog" type="domain.blog.Blog"/>
  </typeAliases>

当这样配置时,Blog可以用在任何使用domain.blog.Blog的地方。

也可以指定一个包名,MyBatis会在包名下面搜索需要的Java Bean

比如:

<typeAliases> <package name="domain.blog"/> </typeAliases>

每一个包domain.blog中的Java Bean,在没有注解的情况下,会使用Bean的首字母小写的非限定类名来作为它的别名。比如domain.blog.Author的别名为author;若有注解,则别名为其注解值。

看下面的例子:

@Alias("author") public class Author { ... }

mapper标签(映射配置):加载映射文件

<mappers>
   <!--
    通过resource加载单个映射文件
     加载单个类路径下的映射文件
      使用相对于类路径的资源:
   -->
   <mapper resource="cn/et/lesson01/FoodMapper.xml"/>
   <!--
     使用类路径加载单个映射文件
        <mapper url="cn.domarvel.dao.UserMapper"/>
         注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。并且还有一个前提是:使用的是mapper代理方法
    -->
    <!--
      自动批量加载指定包下的所有Mapper接口配置文件
        <package name="cn.domarvel.dao"/>
                     注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。并且还有一个前提是:使用的是mapper代理方法
     -->
  </mappers>

Mapper XML文件

MyBatis的真正强大在于他的映射语句,也是它的魔力所在,由于它的异常强大,映射器的XML文件就显得相对简单。如果拿它跟具有相同功能的JDBC代码进行对比,你会立即发现省掉了将近95%的代码。MyBatis就是针对SQL构建的,并且比普通的方法做的更好。

mapper标签:映射文件的根节点,在根节点中支持九个元素。

namespace是用于绑定Dao接口的,当你的namespace绑定接口后,你可以不用写接口实现类,mybatis会通过该绑定自动帮你找到对应要执行的SQL语句

注意:接口中的方法与映射文件中的SQL语句的ID一一对应

<mapper namespace="a">
</mapper>
<mapper namespace="cn.et.lesson02.xml.FoodMapper" >
</mapper>

SQL映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):

cache:给定命名空间的缓存配置

cache-ref:其命名空间缓存配置的引用。

resultMap:是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。

parameterMap:已废弃,老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除,这里不会记录。

sql:可被其他语句引用的可重用语句块。

insert:映射插入语句

update:映射更新语句

delete:映射更新语句

select:映射查询语句

select

查询语句是MyBatis中最常用的元素之一,光能把数据存到数据库中价值并不大,如果还能重新取出来才有用,多数应用也都是查询比修改要频繁。对每个插入、更新或删除操作,通常对应多个查询操作。这是MyBatis的基本原则之一,也是将焦点和努力放在查询和结果映射的原因。简单查询的select元素时非常简单的。

比如

<select id="selectPerson" parameterType="int" resultType="hashmap"> SELECT * FROM PERSON WHERE ID = #{id} </select>

这个语句被称作selectPerson,接收一个int(或Integer)类型的参数,并返回一个HashMap类型的对象,其中的键是列名,值便是结果行中的对应值。

注意参数符号:#{id}

select元素有很多属性允许你配置,来决定每条语句的作用细节。

SELECT多条件查询

parameterType用于传递参数多参数可以使用传入对象以及map的方式传递多个参数。

#{}表示传递的参数值 类同jdbc的? ${}表示直接将参数值替换类同'%值%'

比如:

<select id=“selectPerson” parameterType=“map”    resultType=“person”>
 SELECT * FROM PERSON WHERE ID = #{id} and name like ‘%${name}%'
</select>

Map中必须存在id和name的键值对

SELECT调用存储过程

创建存储过程prg_add(p1 in number,p2 in number,p3 out number)

Mybatis映射文件中使用select调用存储过程

<select id=“prgAdd" statementType="CALLABLE">  <![CDATA[
{call pro_hello (
 #{p1,mode=IN,jdbcType=NUMBER},
 #{p2,mode=IN,jdbcType=NUMBER},
 #{result,mode=OUT,jdbcType=NUMBER})}
   ]]>
 </select>  

测试调用过程

Map<String, String> param = new HashMap<String, String>();
param.put(“p1”, 1);  param.put(“p2”, 2);
String returnValue = (String) session.selectOne(" prgAdd ", param);
System.out.println("result=" + param.get("result"));
System.out.println("returnValue=" + returnValue);  

insert、update和delete

数据更变语句insert、update和delete的实现非常接近

<insert id="insertAuthor" parameterType="domain.blog.Author" flushCache="true" statementType="PREPARED" keyProperty="" keyColumn="" useGeneratedKeys="" timeout="20">
<update id="updateAuthor" parameterType="domain.blog.Author" flushCache="true" statementType="PREPARED" timeout="20">
<delete id="deleteAuthor" parameterType="domain.blog.Author" flushCache="true" statementType="PREPARED" timeout="20">

insert、update和delete参数

parameterType:入参的全限定类名或类型别名

keyColumn:设置数据表自动生成的主键名。对特定数据库(如PostgreSQL),若自动生成的主键不是第一个字段则必须设置

keyProperty:默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中

useGeneratedKey:取值范围true|false(默认值)设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。

MySQL和SQLServer执行auto-generated key field,因此当数据库设置好自增长主键后,可通过JDBC的getGeneratedKeys方法获取。但像Oralce等不支持auto-generated key field的数据库就不能用这种方法获取主键了

flushCache:取值范围true(默认值)|false,设置执行该操作后是否会清空二级缓存和本地缓存

timeout:默认为unset(依赖jdbc驱动器的设置),设置执行该操作的最大时限,超时将抛异常

databaseId:取值范围oracle|mysql等,表示数据库厂家,元素内部可通过`<if test="_databaseId = 'oracle'">`来为特定数据库指定不同的sql语句

selectKey

对于不支持自动生成类型的数据库或可能不支持自动生成主键JDBC驱动来说,MyBatis有另外一种方法来生成主键。

这里有一个简单的示例,它可以生成一个随机ID(最好不要这么做,但这里展示了MyBatis处理问题的灵活性及其所关心的广度):

<insert id="saveFood" >

	<!--
	 selectKey 在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式。
	 		   SelectKey需要注意order属性,像Mysql一类支持自动增长类型的数据库中,
	 		   order需要设置为after才会取到正确的值。像Oracle这样取序列的情况,需要设置为before,否则会报错。
	 	keyProperty:selectKey 语句结果应该被设置的目标属性。
	 	order:可设置为 BEFORE 或 AFTER,如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。
	 								如果设置为 AFTER,那么先执行插入语句,然后是 执行selectKey元素
		statementType:和前面的相 同,MyBatis 支持 STATEMENT ,PREPARED 和CALLABLE 语句的映射类型,
					       分别代表 PreparedStatement 和CallableStatement 类型。	

		注意:selectKey操作会将操作查询结果赋值到insert元素的parameterType的入参实例下对应的属性中。并提供给insert语句使用
	 -->
 	<selectKey keyProperty="foodId" order="BEFORE" resultType="int" statementType="STATEMENT">
 		select FOOD_SEC.Nextval from dual
 	</selectKey>
	 insert into food values(#{foodId},#{foodName},#{price})
 </insert>

在上面的示例中,selectKey元素将会首先运行,food的id会被设置,然后插入语句会被调用,这给了你一个和数据库中来处理自动生成的主键类似的行为,避免了使Java代码变得复杂

SQL

这个元素可以被用来定义可重用的SQL代码段,可以包含在其他语句中,它可以被静态地(在加载参数)参数化,不同的属性值太高包含的实例变化。

比如:

<sql id="userColumns">
${alias}.id,${alias}.username,${alias}.password
</sql>

这个SQL片段可以被包含在其他语句中,例如:

<select id="selectUsers" resultType="map"> select <include refid="userColumns">
<property name="alias" value="t1"/></include>, <include refid="userColumns"><property name="alias" value="t2"/>
</include> from some_table t1 cross join some_table t2 </select>

属性值可以用于包含的refid属性或者包含的字句里面的属性值。

Result Map

resultMap 元素时MyBatis中最重要最强大的元素。它就是让你远离90%的需要从结果集中取出数据的JDBC代码的那个东西,而且在一些情形下允许你做一些JDBC不支持的事情。事实上,编写相似于对复杂语句联合映射这些等同的代码,也许可以跨过上千行的代码。ResultMap的设计就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。

	<!--
 	resultMap
		基本作用:建立SQL查询结果字段与实体属性的映射关系
	 	属性
	 		id属性 ,resultMap标签的标识。
	 		type属性 ,返回值的全限定类名,或类型别名。
	 	autoMapping 属性 ,值范围true(默认值)|false,设置是否启动自动映射功能,
	 		自动映射功能就是自动查找与字段名小写同名的属性名,并调用setter方法。而设置为false后,
	 		则需要在resultMap内明确注明映射关系才会调用对应的setter方法。

 		子元素:
 			id元素 ,用于设置主键字段与领域模型属性的映射关系
			result元素 ,用于设置普通字段与领域模型属性的映射关系
				property	需要映射到JavaBean 的属性名称。 	

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

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

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

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

 			association联合
 						联合元素用来处理“一对一”的关系。需要指定映射的Java实体类的属性,属性的javaType(通常MyBatis 自己会识别)。
 						对应的数据库表的列名称。如果想覆写的话返回结果的值,需要指定typeHandler。
						不同情况需要告诉MyBatis 如何加载一个联合。MyBatis 可以用两种方式加载:

 							select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活;
							resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。

 	 -->
 	<resultMap type="grade" id="gradeMap" autoMapping="true" >
 		<!--
 			因为 autoMapping="false"(默认是true) 所以要明确注明映射关系  如果为true则会自动映射   不需要写下面这行代码
 			<result column="gid" property="gid"/>
 			还有下面这种方法
 				需要gid为主键的情况下使用

 			列和属性的关系  主键使用id 非主键使用result
 			<id column="gid" property="gid"/>
 		-->
 		<!-- 将查询的结果gname赋给gname1 -->
 		<id column="gid" property="gid"/>
 		<result column="gname" property="gname"/>
 	</resultMap>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot使用Mybatis&Mybatis-plus文件映射配置方法

    简介: Springboot使用Mybatis&Mybatis-plus 两者文件映射配置略有不同,之前我用的是Mybatis,但公司用Mybatis-plus:自己新建了一个Springboot项目,代码运行时一直报错not found not found,明明配置了mybatis相关信息的扫描路径,但是就是not found:检查修改了很多地方但都是无用功,最终发现是Plus惹的祸. 1.使用Mybatis <dependency> <groupId>org.mybat

  • Spring整合SpringMVC + Mybatis基础框架的配置文件详解

    前言 新建一个普通的Maven项目 基本目录结构 ├── src # │ ├── main # │ │ └── java # java代码目录 │ │ └── resources # 配置文件目录, 存放下面Spring配置文件 │ ├── test # 单元测试目录 ├── web # web目录 │ └── WEB-INF # web.xml 配置文件目录 1. Mybatis层编写 1.在 resources 目录下新建数据库配置文件 database.properties jdbc.dr

  • MyBatis使用注解开发和无主配置文件开发的情况

    MyBatis使用注解开发时就不在需要和接口对应的映射文件了 主要有以下几个注解 @Select() @Insert @Update() @Delete() 代码演示 项目结构: 数据库表设计 实体类 User public class User implements Serializable { private long userId; private String userName; private Date birthday; private String sex; private Str

  • IDEA创建MyBatis配置文件模板的方法步骤

    Mybatis的配置文件不像Spring的配置文件,在Maven当中添加过依赖之后就可以在下面这个地方打开,需要自己去手动去编写配置文件,但是自己编写的话会记不住要引入的DTD,所以就需要自己创建一个模板. 下图是我的添加模板过程 代码区添加的代码如下 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Co

  • 详解Mybatis核心配置文件

    Mybatis核心配置文件 记录在mybatis核心配置文件中,常用的配置选项: 下边是之前的配置选项: <?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"

  • MyBatis全局配置文件详解

    目录 MyBatis全局配置文件 settings 设置 typeAliases 类型命名 存在的问题: @Alias("") environments 环境 transactionManager 事务管理器 JDBC:JdbcTransactionFactory databaseIdProvider 数据库厂商标识 DB_VENDOR 变短 sql映射文件 总结 MyBatis全局配置文件 MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性

  • 基于Mybatis的配置文件入门必看篇

    Mybatis 配置文件入门 从这篇文章开始,我们将从其核心配置文件入手,对Mybatis支持的核心配置文件进行简单详细的描述. 从下面这段代码是我们在使用mybatis前的配置初始化过程 我们通过阅读其源码来逐步了解内部实现原理. // Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与数据库进行交互 private static SqlSessionFactory getSessionFactory() { SqlSessio

  • JavaScript基础教程——入门必看篇

    JavaScript他是一种描述性语言,其实他并不难学,只要用心学,一定会学好,我相信大家在看这篇文章的时候,一定也学过HTML吧,使用JavaScript就是为了能和网页有更好的交互,下面切入主题. 一. JavaScript 1.什么是JavaScript JavaScript是一种描述性语言,也是一种基于对象(Object)和事件驱动(Event Driven)的,并具有安全性的脚本语言. 2.JavaScript的特点 JavaScript主要用来向HTML页面添加交互行为. JavaS

  • EL表达式入门必看篇(推荐)

    为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法. JSP EL语言定义 E L(Expression Language)目的:为了使JSP写起来更加简单. 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法.它是一种简单的语言,基于可用的命名空间(PageContext 属性).嵌套属性和对集合.操作符(算术型.关系型和逻辑型)的访问符.映射

  • PowerShell管道入门必看篇(管道例子大全)

    PowerShell的一个重中之重的功能就是管道(pipeline),本文从浅入深,一步一步详解管道的使用方法和例子,来看看有没有你所不知道的吧,如果全知道,恭喜你已经很厉害啦--适用于所有PowerShell应用小白与技术老鸟.另外欢迎各位技术大牛来补充讨论学习~ 1. 管道(pipeline)是什么 在Shell中一个重要的基本概念就是管道(pipeline),即在一组命令中,输出的命令结果成为下一个命令的输入参数.管道的概念与真实生活中的生产线比较相似:在不同的生产环节进行连续的再加工,如

  • JavaScript_object基础入门(必看篇)

    之前写Java时老是有点蒙,大部分都是用jQuery,但原理还不是很清楚,最近一段时间在系统的学习JavaScript,有什么问题或错误请指出,多谢..................... Object所有类的基础类 var obj = new Object(); var obj = {}; //实例化对象 给对象设置属性分为两种: 1.使用直接量的方式:对象.属性/方法,这种方式直观.易懂 obj.name = '张三'; obj.age = 20; obj.sex = '男'; obj.s

  • JUnit单元测试入门必看篇

    什么是单元测试 写了个类,要给别人用,会不会有bug?怎么办?测试一下. 用main方法测试好不好?不好! 不能一起运行! 大多数情况下需要人为的观察输出确定是否正确 为什么要进行单元测试 重用测试,应付将来的实现的变化. 提高士气,明确知道我的东西是没问题的. JUnit4 HelloWorld 需要导入JUnit和hamcrest包 new project 建立类 建立testcase assertThat 使用hamcrest的匹配方法 放弃旧的断言,使用hamcrest断言 a)   a

  • 对dbunit进行mybatis DAO层Excel单元测试(必看篇)

    DAO层测试难点 可重复性,每次运行单元测试,得到的数据是重复的 独立性,测试数据与实际数据相互独立 数据库中脏数据预处理 不能给数据库中数据带来变化 DAO层测试方法 使用内存数据库,如H2.优点:无需清空无关数据:缺点:单元测试中需要进行数据库初始化过程,如果初始化过程复杂,单元测试工作量增大 使用dbunit.优点:数据库初始化简单,大大减轻单元测试工作量:缺点:目前官方提供jar包只支持xml格式文件,需要自己开发Excel格式文件 基于dbunit进行DAO单元测试 应用环境:Spri

  • 新手如何快速入门Python(菜鸟必看篇)

    学习任何一门语言都是从入门(1年左右),通过不间断练习达到熟练水准(3到5年),少数人最终能精通语言,成为执牛耳者,他们是金字塔的最顶层.虽然万事开头难,但好的开始是成功的一半,今天这篇文章就来谈谈如何开始入门Python.只要方向对了,就不怕路远. 设定目标 当你决定入门 Python 时,需要一个清晰且短期内可实现的目标,比如通过学习找一份初级程序员工作,目标明确后,你需要了解企业对初级程序员有哪些技能要求,下面是我从拉勾网找的一个初级 Python 工程师的任职要求: 1.熟悉 Pytho

  • ActiveMQ简单入门(新手必看篇)

    一.创建一个简单的Hello World案例 首先需要导入activemq-all-5.14.5.jar包,写生产端: package com.ietree.mq.helloworld; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.DeliveryMode; import javax.jms.Destination; import javax.jms.MessageProduc

  • AugularJS从入门到实践(必看篇)

    前 言 前端 AngularJS是为了克服HTML在构建应用上的不足而设计的.(引用百度百科) AngularJS使用了不同的方法,它尝试去补足HTML本身在构建应用方面的缺陷.AngularJS通过使用我们称为指令(directives)的结构,让浏览器能够识别新的语法.(引用百度百科) 例如: 使用双大括号{{}}语法进行数据绑定: 使用DOM控制结构来实现迭代或者隐藏DOM片段: 支持表单和表单的验证: 能将逻辑代码关联到相关的DOM元素上: 能将HTML分组成可重用的组件. 本篇学习主要

随机推荐