中科软学习总结

本文总结了Java开发中的多种技术点,包括RESTful API设计,Mysql数据库操作,如建表、修改列、查看注释,Java 8的::语法,数据验证正则表达式,Jackson序列化配置,@JsonIgnoreProperties和@JsonInclude的使用,以及Lombok注解的介绍。同时,还涵盖了Spring中@Value注解的使用,日志注解@Log4j,MyBatis的where标签和自定义排序,以及JSON处理和Git命令。

1.RestFul风格是一种URL规则,传递参数的时候不用?改用/

@RestMapping(“/list/{id}”)通过@PathVariable()可以接收url中传过来的参数,@RestMapping(“/list/{id}”)中接收参数使用大括号加上变量名称@PathVariable(“id”)中的变量名称要和@RestMapping(“/list/{id}”)中的变量名称相同

2.  Mysql中建表时给字段添加注释:①CREATE TABLE groups(gid INT PRIMARY KEY AUTO_INCREMENT COMMENT '设置主键自增')②查看表注释:SHOW  CREATE TABLE communication_group③查看列注释:SHOW FULL COLUMNS FROM groups

3. 这个::是java 8里引入lambda后的一种用法,表示引用,比如静态方法的引用String::valueOf;
比如构造器的引用,ArrayList::new

4.各种校验:

//联系电话校验
String regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(16[([0-3]|[5-9])])|(17[([0-3]|[5-9])])|(18[0,5-9]))\\d{8}$";
//联系邮箱校验
String check = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";

5. @JsonIgnoreProperties(ignoreUnknown = true),将这个注解写在类上之后,就会忽略类中不存在的字段若这个字段存在则不会忽略。这个注解还可以指定要忽略的字段不管是空还是非空。使用方法如下@JsonIgnoreProperties({ "internalId", "secretKey" })@JsonIgnore此注解用于属性或者方法上(最好是属性上),序列化和反序列化就会忽略该属性(不管该属性是空还是非空),以上的三个注解都是在序列化和反序列化的时候起作用。

@JsonInclude()注解该注解只对javaBean序列化为json对象时起作用,反序列化的时候不起作用

使用jackson进行序列化时,往往会遇到后台某个实体对象的属性为null,当序列化成json时对应的属性也为null;这样在某些前端组件上应用该json对象会报错。(例如:echarts) 

下面总结了两种方法,解决了当属性为null时不参与序列化:

方法一:

1.实体上使用如下注解  @JsonInclude(Include.NON_NULL)  将该标记放在属性上,如果该属性为NULL则不参与序列化 ;如果放在类上边,那对这个类的全部属性起作用。具体取值有:
//Include.Include.ALWAYS 默认 
//Include.NON_DEFAULT 属性为默认值不序列化 
//Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化 
//Include.NON_NULL 属性为NULL 不序列化 
注:使用了该注解,那么在import时需要把一下两个类引入到源文件中
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

2.代码上使用如下方法:

ObjectMapper mapper = new ObjectMapper();

mapper.setSerializationInclusion(Include.NON_NULL); 

User user = new User(1,"",null); 
String outJson = mapper.writeValueAsString(user); 
System.out.println(outJson);

         通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化 。具体取值有:
//Include.Include.ALWAYS 默认 
//Include.NON_DEFAULT 属性为默认值不序列化 
//Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化 
//Include.NON_NULL 属性为NULL 不序列化 

 

6. 学习JackJson

7. MySql相关

①当某一列发生变化需要修改的时候执行如下面的语句(前提是列名没有发生变化,只是数据类型和约束发生了变化):

 

ALTER TABLE HRSC_ORDER_BATCH MODIFY COLUMN FAIL_REAS  INT(3) COMMENT '失败原因【批量派出失败原因:字典值';

②如果想在一个已经建好的表中添加一列,可以用诸如:

alter table t1 add column addr varchar(20) not null;

这条语句会向已有的表t1中加入一列addr,这一列在表的最后一列位置。如果我们希望添加在指定的一列,可以用:

alter table t1 add column addr varchar(20) not null COMMENT ‘注释的东西’ after user1;

注意,上面这个命令的意思是说添加addr列到user1这一列后面。如果想添加到第一列的话,可以用:

alter table t1 add column addr varchar(20) not null first;

 

将表web1.new_table change中,列名def改为unit

alter table web1.new_table change  def unit char;

 

将表web1.new_table change中,列名def的列删除

alter table web1.new_table drop column def ;

if等的用法:

 

8.@Value("${db.driverclass}"):获取配置文件(.properties结尾)的db.driverclass的值,并自动注入到类的某个setter方法上

有的时候我们定义了Properties文件,并且使用Spring的PropertyPlaceholderConfigurer类在Spring配置文件中以占位符的方式替换数据库等配置文件,那么万一我们想将这些属性也同时注入到某个bean中呢?

这里做个说明,网上很多资料说的<util:properties>方式我们这里不做介绍,有兴趣的自己去看。我们这里只介绍使用PropertyPlaceholderConfigurer管理起来的方式。

       其实很简单,比如你在db.properties中配置的db.driverclass=com.mysql.jdbc.Driver,则在我们的bean的某个set方法上可以用@Value("${db.driverclass}")来完成注入,

       也可以在成员变量上注入。

      例子代码如:

     @Service

      public class DatabaseInfo {

     private String driverClass;     //也可以在这里注入

             private void setDriverClass(String dc) {

this.driverClass = dc;

             }

      }

9. lombok 注解:
          lombok 提供的注解不多,可以参考官方视频的讲解和官方文档。
          Lombok 注解在线帮助文档:http://projectlombok.org/features/index.
          下面介绍几个我常用的 lombok 注解:
              @Data   :注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
              @Setter:注解在属性上;为属性提供 setting 方法
              @Getter:注解在属性上;为属性提供 getting 方法
              @Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
              @NoArgsConstructor:注解在类上;为类提供一个无参的构造方法
              @AllArgsConstructor:注解在类上;为类提供一个全参的构造方法

lombok是一个可以帮助我们简化java代码编写的工具类,尤其是简化javabean的编写,即通过采用注解的方式,消除代码中的构造方法,getter/setter等代码,使我们写的类更加简洁,当然,这带来的副作用就是不易阅读…不过,还是能看得懂吧,废话不多说,先看一下lombok支持的一些常见的注解。

@NonNull

@Cleanup

@Getter/@Setter

@ToString

@EqualsAndHashCode

@NoArgsConstructor/@RequiredArgsConstructor /@AllArgsConstructor

@Data

@Value

@SneakyThrows

@Synchronized

@Log

 

@NonNull

这个注解可以用在成员方法或者构造方法的参数前面,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常,举个例子来看看:

//成员方法参数加上@NonNull注解public String getName(@NonNull Person p){

    return p.getName();

}

实际效果相当于:

public String getName(@NonNull Person p){

    if(p==null){

        throw new NullPointerException("person");

    }

    return p.getName();

}

用在构造方法的参数上效果类似,就不再举例子了。

@Cleanup

这个注解用在变量前面,可以保证此变量代表的资源会被自动关闭,默认是调用资源的close()方法,如果该资源有其它关闭方法,可使用@Cleanup(“methodName”)来指定要调用的方法,就用输入输出流来举个例子吧:

public static void main(String[] args) throws IOException {

     @Cleanup InputStream in = new FileInputStream(args[0]);

     @Cleanup OutputStream out = new FileOutputStream(args[1]);

     byte[] b = new byte[1024];

     while (true) {

       int r = in.read(b);

       if (r == -1) break;

       out.write(b, 0, r);

     }

 }

实际效果相当于:

public static void main(String[] args) throws IOException {

     InputStream in = new FileInputStream(args[0]);

     try {

       OutputStream out = new FileOutputStream(args[1]);

       try {

         byte[] b = new byte[10000];

         while (true) {

           int r = in.read(b);

           if (r == -1) break;

           out.write(b, 0, r);

         }

       } finally {

         if (out != null) {

           out.close();

         }

       }

     } finally {

       if (in != null) {

         in.close();

       }

    }

}

是不是简化了很多。

@Getter/@Setter

这一对注解从名字上就很好理解,用在成员变量前面,相当于为成员变量生成对应的get和set方法,同时还可以为生成的方法指定访问修饰符,当然,默认为public,直接来看下面的简单的例子:

public class Programmer{

    @Getter

    @Setter

    private String name;

 

    @Setter(AccessLevel.PROTECTED)

    private int age;

 

    @Getter(AccessLevel.PUBLIC)

    private String language;

}实际效果相当于:

public class Programmer{

    private String name;

    private int age;

    private String language;

 

    public void setName(String name){

        this.name = name;

    }

 

    public String getName(){

        return name;

    }

 

    protected void setAge(int age){

        this.age = age;

    }

 

    public String getLanguage(){

        return language;

    }

}这两个注解还可以直接用在类上,可以为此类里的所有非静态成员变量生成对应的get和set方法。

@ToString/@EqualsAndHashCode

这两个注解也比较好理解,就是生成toString,equals和hashcode方法,同时后者还会生成一个canEqual方法,用于判断某个对象是否是当前类的实例,生成方法时只会使用类中的非静态和非transient成员变量,这些都比较好理解,就不举例子了。 
当然,这两个注解也可以添加限制条件,例如用@ToString(exclude={“param1”,“param2”})来排除param1和param2两个成员变量,或者用@ToString(of={“param1”,“param2”})来指定使用param1和param2两个成员变量,@EqualsAndHashCode注解也有同样的用法。

@NoArgsConstructor/@RequiredArgsConstructor /@AllArgsConstructor

这三个注解都是用在类上的,第一个和第三个都很好理解,就是为该类产生无参的构造方法和包含所有参数的构造方法,第二个注解则使用类中所有带有@NonNull注解的或者带有final修饰的成员变量生成对应的构造方法,当然,和前面几个注解一样,成员变量都是非静态的,另外,如果类中含有final修饰的成员变量,是无法使用@NoArgsConstructor注解的。 
三个注解都可以指定生成的构造方法的访问权限,同时,第二个注解还可以用@RequiredArgsConstructor(staticName=”methodName”)的形式生成一个指定名称的静态方法,返回一个调用相应的构造方法产生的对象,下面来看一个生动鲜活的例子:

@RequiredArgsConstructor(staticName = "sunsfan")@AllArgsConstructor(access = AccessLevel.PROTECTED)@NoArgsConstructorpublic class Shape {

    private int x;

    @NonNull

    private double y;

    @NonNull

    private String name;

}实际效果相当于:

public class Shape {

    private int x;

    private double y;

    private String name;

 

    public Shape(){

    }

 

    protected Shape(int x,double y,String name){

        this.x = x;

        this.y = y;

        this.name = name;

    }

 

    public Shape(double y,String name){

        this.y = y;

        this.name = name;

    }

 

    public static Shape sunsfan(double y,String name){

        return new Shape(y,name);

    }

}

@Data/@Value

呃!! 
@Data注解综合了3,4,5和6里面的@RequiredArgsConstructor注解,其中@RequiredArgsConstructor使用了类中的带有@NonNull注解的或者final修饰的成员变量,它可以使用@Data(staticConstructor=”methodName”)来生成一个静态方法,返回一个调用相应的构造方法产生的对象。这个例子就也省略了吧… 
@Value注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。

@SneakyThrows

这个注解用在方法上,可以将方法中的代码用try-catch语句包裹起来,捕获异常并在catch中用Lombok.sneakyThrow(e)把异常抛出,可以使用@SneakyThrows(Exception.class)的形式指定抛出哪种异常,很简单的注解,直接看个例子:

public class SneakyThrows implements Runnable {

    @SneakyThrows(UnsupportedEncodingException.class)

    public String utf8ToString(byte[] bytes) {

        return new String(bytes, "UTF-8");

    }

 

    @SneakyThrows

    public void run() {

        throw new Throwable();

    }

}

实际效果相当于:

public class SneakyThrows implements Runnable {

    @SneakyThrows(UnsupportedEncodingException.class)

    public String utf8ToString(byte[] bytes) {

        try{

            return new String(bytes, "UTF-8");

        }catch(UnsupportedEncodingException uee){

            throw Lombok.sneakyThrow(uee);

        }

    }

 

    @SneakyThrows

    public void run() {

        try{

            throw new Throwable();

        }catch(Throwable t){

            throw Lombok.sneakyThrow(t);

        }

    }

}

@Synchronized

这个注解用在类方法或者实例方法上,效果和synchronized关键字相同,区别在于锁对象不同,对于类方法和实例方法,synchronized关键字的锁对象分别是类的class对象和this对象,而@Synchronized得锁对象分别是私有静态final对象LOCK和私有final对象lock,当然,也可以自己指定锁对象,例子也很简单,往下看:

public class Synchronized {

    private final Object readLock = new Object();

 

    @Synchronized

    public static void hello() {

        System.out.println("world");

    }

 

    @Synchronized

    public int answerToLife() {

        return 42;

    }

 

    @Synchronized("readLock")

    public void foo() {

        System.out.println("bar");

    }

}实际效果相当于:

public class Synchronized {

   private static final Object $LOCK = new Object[0];

   private final Object $lock = new Object[0];

   private final Object readLock = new Object();

 

   public static void hello() {

     synchronized($LOCK) {

       System.out.println("world");

     }

   }

 

   public int answerToLife() {

     synchronized($lock) {

       return 42;

     }

   }

 

   public void foo() {

     synchronized(readLock) {

       System.out.println("bar");

     }}}

@Log

这个注解用在类上,可以省去从日志工厂生成日志对象这一步,直接进行日志记录,具体注解根据日志工具的不同而不同,同时,可以在注解中使用topic来指定生成log对象时的类名。不同的日志注解总结如下(上面是注解,下面是实际作用):

@CommonsLogprivate static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);@JBossLogprivate static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class);@Logprivate static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());@Log4jprivate static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);@Log4j2private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);@Slf4jprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);@XSlf4jprivate static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);

关于lombok的注解先写到这里,当然,还有其他一些注解需要大家自己去摸索,同时lombok一直在扩展,将来肯定会加入更多的注解元素,拭目以待了。

myBatis中where标签的使用:

where标记的作用类似于动态sql中的set标记,他的作用主要是用来简化sql语句中where条件判断的书写的,如下所示:

<select id="selectByParams" parameterType="map" resultType="user">

select * from user

<where>

<if test="id != null ">id=#{id}</if>

<if test="name != null and name.length()>0" >and name=#{name}</if>

<if test="gender != null and gender.length()>0">and gender = #{gender}</if>

</where>

</select>     

  在上述SQL中加入ID的值为null的话,那么打印出来的SQL为:select * from user where name="xx" and gender="xx"

where 标记会自动将其后第一个条件的and或者是or给忽略掉

如果直接用Where,不用标签则会打出:select * from user where and name="xx" and gender="xx"报错,所以用<where>标签,相当于用where 1=1...;

 

mysql如何用order by 自定义排序

原表 user:

id  name   roleId

1    aaa     1

2    bbb     2

3    ccc     3

4    ddd     4

5    eee     51,MySQL可以通过field()函数自定义排序,格式:field(value,str1,str2,str3,str4),value与str1、str2、str3、str4比较,返回1、2、3、4,如遇到null或者不在列表中的数据则返回0.

例如:select * from user order by field(roleId,2,3,4,1,5);

结果:

id  name   roleId

2    bbb     2

3    ccc     3

4    ddd     4

1    aaa     1

5    eee     5

2,locate(substr,str)函数返回子串substr在字符串str中第一次出现的位置,可以根据该函数进行排序

例如:select * from user order by locate(id,'2,3,1,5,4');

结果:

id  name   roleId

2    bbb     2

3    ccc     3

1    aaa     1

5    eee     5

4    ddd     4

MyBatis写sql注意事项:


括号必须放在外边,不能<foreach collection="certNos" item="certNo" separator=",">(#{certNo})</foreach>,但是批量保存确实这样

 

拼接的模糊查询经典例子


去重

mySql的一种异常信息:

column in where clause is ambiguous MySQL异常,在多表连接查询中,若连接条件字段在多个表中同名,却没有使用全限定名称,如 logicdeleteFlag,执行时会报这个异常,MySQL没办法识别这个字段指的是哪个表的字段。必须使用全限定名称,如:tableName.logicdeleteFlag(若没有相同的字段可以不给权限,建议都给权限,避免出错)。

6. JSON.parseObject,是将Json字符串转化为相应的对象;JSON.toJSONString则是将对象转化为Json字符串。在前后台的传输过程中,Json字符串是相当常用的:如下所示,其中Staff是员工对象/** * json字符串转化为对象 */ String jsonString = "{name:'Antony',age:'12',sex:'male',telephone:'88888'}"; Staff staff = JSON.parseObject(jsonString, Staff.class); System.out.println(staff.toString()); /** * 对象转化为json字符串 */ String jsonStr = JSON.toJSONString(staff); System.out.println(jsonStr);

JSON.parseObject 的时候,会去填充名称相同的属性。对于Json字符串中没有,而model类有的属性,会为null;对于model类没有,而Json字符串有的属性,不做任何处理。

7.foreach中获取元素在集合中的位置


8.项目开发中git的一些语句:

①查看当前git的版本git rev-parse head

9.StringBuffer获取某个位置的字符

StringBuffer s = new StringBuffer(“1,2,3”),获取3

Char s =s.charAt(s.length()-1),字符串只有==方法没有equals方法

//删除某个索引的字符,假设删除s中的3

s.deleteCharAt(s.length()-1)

10. 集合与数组的相互转化:

List,Set转换为数组的方法:网络路径:https://www.cnblogs.com/annieBaby/p/4889406.html
toArray函数有两种形式,一种无参数,一种带参数,注意带参数形式中,要指明数组的大小。

参考代码:

public void convertCollectionToArray() {

 List list = new ArrayList();

 Object[] objectArray1 = list.toArray();

 String[] array1 = list.toArray(new String[list.size()]);

 

 Set set = new HashSet();

 Object[] objectArray2 = set.toArray();

 String[] array2 = set.toArray(new String[set.size()]);

}

反过来,数组转换为List,Set。

 Integer[] numbers = {7, 7, 8, 9, 10, 8, 8, 9, 6, 5, 4};

 // To convert an array into a Set first we convert it to a List. Next

 // with the list we create a HashSet and pass the list as the constructor.

 List list = Arrays.asList(numbers);

 Set set = new HashSet(list);

注意:对于int[]数组不能直接这样做,因为asList()方法的参数必须是对象。应该先把int[]转化为Integer[]。对于其他primitive类型的数组也是如此,必须先转换成相应的wrapper类型数组。

1

2

3

4

5

6

7

8

 int[] numbers = {7, 7, 8, 9, 10, 8, 8, 9, 6, 5, 4};

 int size = numbers.length;

 Integer[] array = new Integer[size];

 for (int i = 0; i < numbers.length; i++) {

  Integer integer = numbers[i];

  array[i] = integer;

  }

 List list = Arrays.asList(array);

 

9.Spring中@Resource与@Autowired与@Component注解的总结:http://blog.youkuaiyun.com/wxw520zdh/article/details/52733811###;

 10.myBatis实现批量修改经典例子

<update id="updateOrderEndDateAndSate">
    UPDATE HRSC_ORDER
    <trim prefix=" SET " suffixOverrides=",">
        <trim prefix=" ORDER_END_DATE = CASE " suffix=" END,">
            <foreach collection="orderList" item="item">
                <if test="item.orderEndDate != null">
                WHEN ORDER_ID = #{item.orderId} THEN #{item.orderEndDate}
            </if>
            </foreach>
        </trim>
        <trim prefix=" ORDER_STATE = CASE " suffix=" END,">
            <foreach collection="orderList" item="item">
                <if test="item.orderState != null">
                WHEN ORDER_ID = #{item.orderId} THEN #{item.orderState}
            </if>
            </foreach>
        </trim>
        <trim prefix=" LEAVE_OPER_TIME = CASE " suffix=" END,">
            <foreach collection="orderList" item="item">
                <if test="item.leaveOperTime != null">
                    WHEN ORDER_ID = #{item.orderId} THEN #{item.leaveOperTime}
                </if>
            </foreach>
        </trim>
        <trim prefix=" REVOKE_REASON = CASE " suffix=" END,">
            <foreach collection="orderList" item="item">
                <if test="item.revokeReason != null">
                    WHEN ORDER_ID = #{item.orderId} THEN #{item.revokeReason}
                </if>
            </foreach>
        </trim>
    </trim>
    WHERE ORDER_ID IN
    <foreach collection="orderList" item="item" open="(" separator="," close=")">
        #{item.orderId}
    </foreach>
</update>

 myBatis实现查询,一对多的情况,一个人(身份证号唯一确定一个人)一种险种(社保月度明细id和险种一一对应)对应一条问题人员数据(所得都是一个业务月份),现在需要查询的结果为一个人一条数据,将险种和问题人员状态封装成一个对象QuestionPerTypeState,查询代码如下,查询语句没有任何变化,都是查询一条,一条的,只是有了resultMap

 

<select id="findQuestionPerList" resultMap="findQuestionPerMap">
     SELECT
     E.CERT_NO,Q.SINS_DET_ID,Q.QUESTION_PER_STATE
     FROM
     SINS_EMP_INFO E
     JOIN
     SINS_QUESTION_PER Q
     ON
     E.SINS_EMP_ID=E.SINS_EMP_ID
     WHERE
     1=1
     <if test="isEffect !=null">AND E.IS_EFFECT=#{isEffect} AND Q.IS_EFFECT=#{isEffect}</if>
     <if test="sinsAcctId !=null">AND Q.SINS_ACCT_ID =#{sinsAcctId}</if>
     <if test="natMon !=null">AND Q.NAT_MON=#{natMon}</if>
 </select>
 <!-- 使用resultMap映射实体类和字段之间的一一对应关系-->
 <resultMap id="findQuestionPerMap" type="com.sinosoft.cpyy.model.apply.SinsQuestionPer">
     <id property="certNo" column="CERT_NO"/>#主键
     <collection property="questionPerTypeStates" ofType="com.sinosoft.cpyy.model.apply.QuestionPerTypeState">#一般集合属性
         <id property="sinsDetId" column="SINS_DET_ID"/>#主键
         <result property="questionPerState" column="QUESTION_PER_STATE"/>#一般属性
     </collection>
 </resultMap>
<resultMap></resultMap>应用
<!--查询社保实时数据-->
<select id="findActualData" parameterType="com.sinosoft.cpyy.model.actualData.ActualData"
        resultMap="findProductMap">
    SELECT
    e.EMP_NAME,e.CERT_NO,e.PER_COM_CODE,e.HOUSEHOLD_PROY,m.EXECUTE_AREA_ID,m.NAT_MON natMonNew,m.APPLY_MON
    applyMonNew,m.SINS_STATE,m.PRODUCT_ID, m.STATE,m.PER_RADIX,m.UNIT_PAY,m.PER_PAY,m.PAY_FEE_WAY,
    a.UNIT_SINS_NO,a.SINS_ACCT_NAME,q.DATA_SOURCE,q.QUESTION_PER_TYPE,m.BUSI_CUST_NAME,
    m.SIGN_SUPP_NAME,CONCAT(e.CERT_NO,'+',m.NAT_MON) title,m.CRE_ROLE_ID
    FROM
    SINS_MONTHLY_DET m
    JOIN
    SINS_EMP_INFO e
    ON
    m.SINS_EMP_ID =e.SINS_EMP_ID
    JOIN
    SINS_ACCT_INFO a
    ON
    m.CUST_SINS_ID = a.SINS_ACCT_ID
    LEFT JOIN
    SINS_QUESTION_PER q
    ON m.SINS_DET_ID = q.SINS_DET_ID
    WHERE
    1=1
    <if test="isEffect !=null">AND m.IS_EFFECT=#{isEffect} AND e.IS_EFFECT=#{isEffect} AND a.IS_EFFECT=#{isEffect}
        AND (q.IS_EFFECT =#{isEffect} OR q.IS_EFFECT IS NULL)
    </if>
    <if test="certNos !=null and certNos.size>0">AND CONCAT(e.CERT_NO,'+',m.NAT_MON) IN
        (<foreach collection="certNos" item="certNo" separator=",">
           #{certNo}
       </foreach>)
    </if>
    <if test="empName !=null and empName !=''">AND e.EMP_NAME lIKE CONCAT('%',#{empName},'%')</if>
    <if test="productIdList !=null and productIdList.size>0">AND
        m.PRODUCT_ID IN(
        <foreach collection="productIdList" item="productId" separator=",">
            #{productId}
        </foreach>
        )
    </if>
    <if test="natMonNew !=null and natMonNew !=''">AND m.NAT_MON =#{natMonNew}</if>
    <if test="applyMonNew !=null and applyMonNew !=''">AND m.APPLY_MON =#{applyMonNew}</if>
    <if test="executeAreaId !=null and executeAreaId !=''">AND m.EXECUTE_AREA_ID=#{executeAreaId}</if>
    <if test="state != null and state !=''">AND m.STATE =#{state}</if>
    <if test="custId !=null and custId !=''">AND m.CUST_ID =#{custId}</if>
    <if test="signSuppId !=null and signSuppId !=''">AND m.SIGN_SUPP_ID =#{signS uppId}</if>
    <if test="custSinsId !=null and custSinsId !=''">AND m.CUST_SINS_ID =#{custSinsId}</if>
    <if test="unitSinsNo !=null and unitSinsNo !=''">AND a.UNIT_SINS_NO =#{unitSinsNo}</if>
    GROUP BY e.CERT_NO,m.NAT_MON,m.APPLY_MON,m.PRODUCT_ID
</select>
<!-- 使用resultMap映射实体类和字段之间的一一对应关系-->
<resultMap id="findProductMap" type="com.sinosoft.cpyy.model.actualData.ActualData">
    <id property="title" column="title"/>
    <result property="creRoleId" column="CRE_ROLE_ID"/>
    <result property="certNo" column="CERT_NO"/>
    <result property="empName" column="EMP_NAME"/>
    <result property="perComCode" column="PER_COM_CODE"/>
    <result property="householdProy" column="HOUSEHOLD_PROY"/>
    <result property="executeAreaId" column="EXECUTE_AREA_ID"/>
    <result property="natMonNew" column="natMonNew"/>
    <result property="applyMonNew" column="applyMonNew"/>
    <result property="sinsState" column="SINS_STATE"/>
    <result property="state" column="STATE"/>
    <result property="payFeeWay" column="PAY_FEE_WAY"/>
    <result property="unitSinsNo" column="UNIT_SINS_NO"/>
    <result property="sinsAcctName" column="SINS_ACCT_NAME"/>
    <result property="dataSource" column="DATA_SOURCE"/>
    <result property="questionPerType" column="QUESTION_PER_TYPE"/>
    <result property="busiCustName" column="BUSI_CUST_NAME"/>
    <result property="signSuppName" column="SIGN_SUPP_NAME"/>
    <collection property="actualProductList" ofType="com.sinosoft.cpyy.model.actualData.ActualProduct">
        <id property="productId" column="PRODUCT_ID"/>
        <result property="perRadix" column="PER_RADIX"/>
        <result property="perPay" column="PER_PAY"/>
        <result property="unitPay" column="UNIT_PAY"/>
    </collection>
</resultMap>

 

 

 

 

第一部分 虚拟化与云计算概念 第一天(上午) 主题 基本概念 大纲 l 虚拟化概论 l 虚拟化的关键技术 l 虚拟化的业界动态 l 云计算概论 l 云计算架构 l 云计算的关键技术与挑战 l 云计算的典型厂商的技术架构介绍 第二部分 XEN/KVM虚拟化技术 第一天(下午)~第二天(上午) 主题 虚拟化技术 大纲 l Xen的原理与实现 l Xen的安装 l Xen的配置和管理工具 l 虚拟操作系统的文件存储系统 l 常见问题处理 l 试验:XEN使用 l KVM的原理与实现 l 试验:KVM使用 第三部分 开源云计算平台部署 第二天(下午)~第四天 主题 Eucalyptus云计算系统实践 大纲 l Eucalyptus平台简介 l Eucalyptus部署及管理 n ◦Installing Eucalyptus (from source and binary packages) n ◦Eucalyptus configuration n ◦Hypervisor configuration n ◦Network configuration (networking modes, multi-cluster networking) n ◦Managing Eucalyptus n ◦Advanced networking and security n ◦Auto-scaling n ◦Hybrid clouds ("cloud bursting") n ◦Troubleshooting l Eucalyptus操作 n ◦Account creation n ◦Obtaining and using credentials n ◦Instance Management: n ◦Listing, running, and terminating instances n ◦Accessing and using instances n ◦Using Elasticfox n ◦Image Management (bundling, uploading and registering images) n ◦Networking and security (allocating and associating IP addresses, security groups) n ◦Storage Management: Using block storage via the Storage Controller (creating volumes, creating snapshots, creating volumes from snapshots) n ◦Using put-get bucket storage via Walrus l 试验:部署Eucalyptus,建立私有云计算平台。 l 试验:发布镜像
第一章 流体力学概述 1、Introduction to Fluid Mechanics流体力学简介 2、Governing Equations of Fluid Mechanics流体力学控制方程 3、Potential Flow位流 4、Boundary Layer and Viscous Flows边界层与粘性流 5、External Flows外流 6、Internal Flows内流 7、Heat Transfer传热学 第二章 CFD概述 1、Introduction to CFD 计算流体力学简介 2、Mathematical Equations of CFD计算流体力学的数学方程 3、Overview of CFD Solution Methodologies计算流体力学求解方法 4、Discretization 方程离散 5、Solution Methods 求解方法 6、Postprocessing and Visualization后处理与可视化 7、Modeling Turbulent Flows湍流模拟 8、Designing Meshes for CFD Calculations网格设计 9、Case Studies算例学习 第三章 Gambit几何建模 1、Introduction to GAMBIT + Demo Gambit简介 2、Tutorial – Creating and Meshing a Basic Geometry基本几何的建立与网格生成 3、Introduction to Geometry Operations 几何建模简介 4、Exercise 1练习1 5、CAD/CAE Data Import and Geometry Cleanup CAD/CAE数据导入与几何简化 6、Tutorial 算例 7、Semi-Automated Cleanup Tools + Demo半自动几何简化工具 8、Tutorial 算例 第四章 Gambit网格生成 1、Edge and Face Meshing 边与面的网格生成 2、Exercise 2 – 2D Geometry and Mesh Generation二维几何与网格生成 3、Volume Meshing 体网格生成 4、Exercise 3 – 3D Geometry and Mesh Generation三维几何与网格生成 5、Mesh Control & Size Functions网格控制与SF 6、Exercise 4 算例 7、Meshing Strategy & Tips网格生成策略与技巧 8、Tutorial 算例 第五章 TGrid网格生成简介 1、面网格修正 2、边界层网格生成 3、体网格生成 第六章 FLUENT解算器 1、Introduction to ANSYS—Fluent 简介 2、Lecture – Introduction to CFD Analysis CFD分析简介 3、Demonstration: Overview of the CFD Process CFD流程 4、Tutorial Session – Tutorial #1 (3D Mixing Elbow) 算例 5、Lecture – Solver Basics 解算器基础 6、Lecture – Boundary Conditions边界条件 7、Tutorial Session 算例 8、Lecture – Solver Settings 解算器设置 9、Tutorial Session 算例 10、Lecture – Turbulence Modeling 湍流模拟 11、Tutorial Session 算例 12、Lecture – Heat Transfer Modeling 传热模拟 13、Lecture – User Defined Functions 用户自定义UDF 14、Lecture (Optional) –Multiphase Modeling 多相流简模型 15、Lecture (Optional) – Moving Zone Models 运动区域模拟 16、Tutorial Session 算例 17、案例分析
一、虚拟化评估与规划 1、微软虚拟化概述 2、虚拟化管理概述 3、评估现有的虚拟化环境 4、规划Hyper-V R2角色 二、安装和配置Hyper-V R2服务器角色 1、安装Hyper-V R2服务器角色 2、配置Hyper-V R2设置和虚拟网络 三、创建和配置虚拟硬盘和虚拟机 1、创建和配置虚拟硬盘 2、创建和配置虚拟机 3、管理虚拟机快照 4、虚拟机的连接应用 5、规划虚拟化的应用 四、Hyper-V R2与SCVMM 2008 R2的整合 1、规划SCVMM 2008 R2 2、安装VMM服务和管理控制台 3、管理主机和主机组 五、使用SCVMM 2008 R2创建和部署虚拟机 1、使用SCVMM 2008 R2创建新的虚拟机 2、将物理服务器转换为虚拟机 3、转换和迁移虚拟机 4、克隆虚拟机 六、使用SCVMM 2008 R2管理虚拟机 1、SCVMM 2008 R2管理任务概述 2、创建和管理检查点 七、配置和管理VMM库 1、VMM库概述 2、管理配置文件和模板 3、实现VMM库的高可用性 八、内容二 :配置用户角色和虚拟机管理器自服务平台 1、配置用户角色 2、安装和配置VMM管理器自服务平台 九、使用离线虚拟机维修工具维护软件更新 1、离线虚拟机维修工具概述 2、配置WSUS和离线虚拟机维修工具 十、虚拟机备份和还原策略 1、虚拟机和VMM数据库的备份和还原选项概述 2、为备份Hyper-V架构实施DPM 2007 SP1 十一、为服务器虚拟化实施高可用性 1、故障转移群集概述 2、使用Hyper-V实施故障转移群集 3、使用SCVMM 2008 R2实施高可用性 十二、服务器虚拟化监视和报告 1、SCVMM 2008 R2监视工作 2、SCOM和SCVMM的集成 3、配置性能和资源优化 十三、使用RDS实现桌面虚拟化 1、远程桌面服务概述 2、实施远程桌面会话主机 3、实施远程桌面连接代理 4、实施远程桌面虚拟化主机 十四、扩大本组织以外的远程桌面服务 1、配置远程桌面网关服务 2、配置远程桌面WEB访问
培训目标: 掌握表格、数据录入技巧,控制数据的正确录入和安全性的操作,专业表格修饰技巧及特殊的数字格式设置;运用函数进行复杂数据计算、进行表间关联和索引;掌握数据透视表中的计算和分析;掌握图表设置中的技巧,及特殊图表制作,运用动态图表展示数据;了解Excel中数据分析工具,认识宏,并运用宏提高工作效率。 课程大纲: 第一章、Excel数据处理基本技巧 第一节Excel中的表格基本操作技巧 快捷键应用介绍 表格区域命名 多工作表的快速定位 工作表的链接 第二节、快速准确输入数据 数字、日期输入技巧 快速填充特殊技巧 导入外部数据 第三节、大型表格的编辑、打印技巧 第二章、表格数据安全控制 第一节、利用有效性控制表格内容输入 利用序列控制输入内容 设置序列跨工作表数据源引用 有效性提示文字 第二节、工作表和单元格的保护、隐藏 第三章、编辑美观专业的表格 第一节、表体的特殊格式的修饰应用 特殊数字格式 第二节、增强条件格式 选用条件格式规则 运用公式自定义条件格式 第四章、高效准确的公式计算 第一节、Excel 中公式建立方法和相关工具 自动求和的灵活应用 合并计算多张工作表数据 第二节、深层次理解公式中引用关系 第四章、函数的高级应用 第一节、常用条件统计函数的应用 通配符在条件统计函数中的应用 Sumifs、Countifs、Average复杂条件统计 Round函数 第二节、逻辑函数 If条件函数的嵌套应用 And、Or函数与If的组合应用 第三节、查找引用函数的使用 利用Vlookup函数建立查询系统、实现工作表关联 Index与Match函数的基本使用 Offset函数的基本使用 第四节、文本类函数的使用 EXACT检查两个文本值是否相同 Left、Right、MID提取字符 Find函数 第五节、日期函数使用 Date、DateDif 第六节、数组函数 SUMPRODUCT 第五章、图表常用类型设计 第一节、图表类型用途分析 第二节、图表布局设置 第三节、图表处理 对空值的处理 对隐藏行列数据的处理 断开图表与源数据的关系 图表标题来自某单元格 处理图例 使用时间刻度坐标轴 多行分类坐标轴 第四节、迷你图设计 迷你图与常规图表区别 创建与格式化迷你图 第五节、图表分析工具 趋势线 误差线 涨跌柱线 第六节、特殊图表的制作 双Y轴 复合饼图 第七节、动态图表 建立辅助数据区 Vlookup、Index、Offset函数引用数据 建立图表 应用按钮,让图表变换更直观 第六章、数据统计基础工具应用 第一节、排序特殊用功能 第二节、数据筛选 高级筛选:提取数据、删除数据 按颜色筛选 第三节、分类汇总 嵌套分类汇总 定位复制汇总数据 第七章、数据透视分析 第一节、数据透视表工具介绍 数据透视表的规范要求 不规范数据表格的处理 第二节、在数据透视表上实现分组 按日期、地区、产品类别分组 组合的注意事项 第三节、数据透视表的格式化 修改字段名称 设置字段的数字格式 显示/隐藏明晰数据 显示/隐藏汇总数据 套用报表样式 第四节、数据透视表使用技巧 如何设置空值和错误值在单元格中的显示方式 如何设置刷新数据 复制数据透视表中的值 第五节、多工作表数据汇总 单页字段 自定义字段 第六节、利用透视表从不同角度分析数据 第八章、数据分析 第一节、变量求解 单变量求解 双变量求解 第二节、规划求解 模型的搭建 运算报告分析 第三节、模拟运算 第九章、宏的简介 第一节、宏的概念和作用 第二节、宏的安全性 第三节、宏的录制和管理 宏的命名和执行环境 录制及注意事项 宏的快捷键与删除 第四节、执行宏 常规启动执行 自定义命令按钮执行
课程简介 : ArcGIS Server包含了一系列软件和集中管理的GIS Web应用程序的开发框架。本高级课程介绍了ArcGIS Server Web应用程序开发框架(ADF),并教授学员如何开发ArcGIS Server Web应用程序以使用多种GIS服务。学员将学习有用的类库、API及ArcGIS Server开发流程。在课程练习中,学员将创建应用程序,使用ADF Web控件来整合多种数据源、执行查询、执行新添的geoprocessing任务。学员还将学到如何使用自定义按钮和工具来扩展Web ADF,以及如何使用server对象扩展模块扩展GIS服务器。 学员收益: 理解ArcGIS Server Web ADF的组成 学习如何使用Web地图应用程序模板 在Web应用程序中使用ArcGIS Server API 使用ASP.NET Web控件开发自定义Web应用程序 开发自定义命令和工具 使用task框架创建和部署自定义web任务 使用server对象扩展模块 培训内容: 建立Web ADF应用程序:Web ADF开发者资源;Web地图应用程序模板的组织;使用Web地图应用程序模板的优点。 使用Web ADF控件:ResourceManager控件;Mapping控件;web控件与MapControl控件关联;ImageBlending选项。 Web ADF编程:使用数据源、资源和函数;普通数据源API。 图形数据源编程:元素与要素图形图层;几何体;渲染;符号化;刷新图形图层。 ArcGIS Server数据源编程:SOAP和ArcObjects API;Value和Proxy对象;网络和本地资源;在COM与Web ADF类型间转换;管理状态。 创建自定义命令和工具:扩展Web ADF工具条;客户端与服务器动作;ToolEventArgs;Postbacks和callbacks;使用CallbackResults。 Web ADF任务框架:TaskManager和TaskResults;配置任务。 创建自定义任务:Itask;扩展FloatingPanelTask;使用TaskResults;整合任务至Visual Studio和ArcGIS Server Manager。 Geoprocessing:GeoprocessingFunctionaility; GPServer; Geoprocessor;geoprocessing任务的定制与使用。 扩展GIS服务器:COM有用对象;服务器对象扩展;部署服务器对象扩展的条件;在Web应用程序上使用服务器对象扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值