`
yugouai
  • 浏览: 497549 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Spring的高级用法

 
阅读更多
一、Mapping的使用
Mapping是Spring的映射,可以映射到JSP代码与Java方法或类的调用,如在上传文件中,页面Form中的配置应该是这样:
<form:form name="addByUploadFile" action="${ctx}/tracerecorddetails/addByUploadFile.do" method="post" enctype="multipart/form-data"  modelAttribute="traceRecordDetails">

<div ><label>导入文件:</label><input type="file" name="file" id="file" style="width: 300px;"/></div>

<button id="submitButtonId" onclick="getReferenceForm(this).submit();" class="btn3" >设置</button>

</form:form>


需要注意的是Form标签里不能嵌套Form标签,若如果需要有两个功能的同步,如:1.需要将信息保存到数据库;2.同时上传文件需要到指定文件目录。这两个操作需要在同一个页面里完成,当然可以在页面里分开来写,但是要注意的是submit()是把整个页面提交,同时刷新页面,一般要实现两个操作,最好在逻辑代码中实现。

Mapping的方法如下:
@RequestMapping(value="/addByUploadFile", method = RequestMethod.POST)
	public String addByUploadFile(@RequestParam("file") MultipartFile file,TraceRecordDetails traceRecordDetails,BindingResult errors, HttpServletRequest request, ModelMap model){}

注意的是value="/yourMappingFuntion";

二、Spring中数据库的操作,如insert操作:
1.在dao中编写insert方法
2.在daoImpl中实现insert功能,这里一般是继承一个公共数据库操作的类,此处叫:BaseSpringJdbcDao,由名称就可以知道,这是一个基类,供数据库操作使用,在里面的insert方法如下:
/**
	 * 适用sqlserver:identity,mysql:auto_increment 自动生成主键
	 * KeyHolder:接口用于检索键,通常用于自动生成的键作为潜在的JDBC的插入语句返回
	 */
	public int insertWithGeneratedKey(Object entity, String insertSql) {
		KeyHolder keyHolder = new GeneratedKeyHolder();
		int affectedRows = getNamedParameterJdbcTemplate().update(insertSql, new BeanPropertySqlParameterSource(entity) , keyHolder);
		setIdentifierProperty(entity, keyHolder.getKey().longValue());
		return affectedRows;
	}
	/**
	 * 设置实体的主键值
	 */
	public void setIdentifierProperty(Object entity, Object id) {
		try {
			BeanUtils.setProperty(entity, getIdentifierPropertyName(), id);
		} catch (Exception e) {
			throw new IllegalStateException("cannot set property value:"+id+" on entityClass:"+entity.getClass()+" by propertyName:"+getIdentifierPropertyName(),e);
		}
	}

这个insert方法的用处在于,数据库的主键是自递增的,通过调用该方法可以返回一个实体类,这个实体类就是你需要保存数据的类,你可以在其他模块里面调用实体类的属性,通过javaBean。

三、Spring实现文件上传
通过使用MultipartFile类实现,首先介绍一下MultipartFile类:MultipartFile是一个结合Jsp用来上传文件的功能类,实现文件上传相对容易。
1.在JSP中定义JSTL中,定义下面标签,一般是在form中定义:
<form:form name="addByUploadFile" action="${ctx}/tracerecorddetails/addByUploadFile.do" method="post" enctype="multipart/form-data"  modelAttribute="traceRecordDetails">

<div ><label>导入文件:</label><input type="file" name="file" id="file" style="width: 300px;"/></div>

<tr align="center" valign="middle">
        <td height="60" colspan="2"><input type="submit" ID="BtnOK" value="确认上传"></td>
    </tr>

action是需要映射到的实体类,method="post"意思是在action映射的类中返回一个页面,也就是post,当然还有是get,enctype="multipart/form-data"就是定义了上传文件的表示,在div中定义导入文件,这个就不说了。

2.值得注意的是,在上传文件的时候一般有保存指定路径的需求。路径是一个比较容易弄错的概念,例如,我们保存的路径是:/data/rsync/trace_passport/,由于该目录不一定存在,所以在点击上传button的时候,一般会出现目录error的问题,这个需要我们编写一个完整的目录,使用File类中的mkdir,值得注意的是,我们不能用这样:
// 创建目录 
        File dir = new File(path); 
        if (!dir.exists()) { 
            dir.mkdir(); 
        } 
这是因为这个只是会生成data目录,这是因为没有生成父目录,当出现这样的情况的时候需要使用一下这种方法:new File(filepath).getParentFile().mkdirs();
这样子就父目录和子目录都生成了。

3.上面已经写好了Jsp代码,我们要写的逻辑代码如下:
@RequestMapping(value="/addByUploadFile", method = RequestMethod.POST)
	public String addByUploadFile(@RequestParam("file") MultipartFile file,BindingResult errors, HttpServletRequest request, ModelMap model) throws Exception{
		
		LOGGER.info("addByUploadFile:"+ file.getOriginalFilename());
		Assert.notNull(file);
		Assert.isTrue(!file.isEmpty());
		String filepath = "/data/rsync/trace_passport/" + savedDetails.getTraceId() + "/"+System.currentTimeMillis()+".txt";
		new File(filepath).getParentFile().mkdirs();
		
		DataOutputStream out = new DataOutputStream(new FileOutputStream(filepath));
		InputStream is = null;	//输入流
		try {
			is = file.getInputStream();
			IOUtils.copy(is, out);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}finally{
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(out);
		}			
		
		LOGGER.info("upload file save in path:" + filepath);
		return "redirect:/tracerecorddetails/enterUploadFile.do";
	}

redirect是提交完毕后返回进来时候的页面。
上面的代码有几个值得关注的点:
1)使用Assert判断某些类是不是空,这样可以在调试的时候省去很多工作。
2)在IO流操作的时候有很好的技巧,有写开发人员喜欢使用byte操作读写,其实在IOUtils类中给了我们很多很方便的方法,如:复制输入输出流、自动检测流是否为空等。IOUtils.closeQuietly(is);
IOUtils.closeQuietly(out);
这里就是自动判断了是否为空,流是否已经关闭,这样就不用写一堆的if语句了。

四、SQL语句技巧
  由于本人主要是做数据分析,所以对工作最多的是多表操作,下面介绍两个比较常用的SQL语句用法,一种是join,另外一种就是case when。

Join操作:

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行
举例如下:
--------------------------------------------
表A记录如下:
aID     aNum
1     a20050111
2     a20050112
3     a20050113
4     a20050114
5     a20050115
表B记录如下:
bID     bName
1     2006032401
2     2006032402
3     2006032403
4     2006032404
8     2006032408
--------------------------------------------
1.left join
sql语句如下:
 
select * from A
left join B 
on A.aID = B.bID

结果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404
5     a20050115    NULL     NULL
(所影响的行数为 5 行)
结果说明:
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL.
--------------------------------------------
2.right join
sql语句如下:
select * from A
right join B 
on A.aID = B.bID

结果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404
NULL     NULL     8     2006032408
(所影响的行数为 5 行)
结果说明:
仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.
--------------------------------------------
3.inner join
sql语句如下:
select * from A
innerjoin B 
on A.aID = B.bID

结果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404
结果说明:
很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.
--------------------------------------------
注:
LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。
语法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2
说明:table1, table2参数用于指定要将记录组合的表的名称。
field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
compopr参数指定关系比较运算符:"=", "<", ">", "<=", ">=" 或 "<>"。
如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误.

case when的用法
1.case when最大的用处就是行列转换,下面介绍case when的用法:

Case具有两种格式。简单Case函数和Case搜索函数。
--简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END

--Case搜索函数
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END


这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。
还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
如:
有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):
大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。
显示格式:
语文 数学 英语
及格 优秀 不及格
select
(case when 语文>=80 then '优秀'
when 语文>=60 then '及格'
else '不及格') as 语文,
(case when 数学>=80 then '优秀'
when 数学>=60 then '及格'
else '不及格') as 数学,
(case when 英语>=80 then '优秀'
when 英语>=60 then '及格'
else '不及格') as 英语,
from table xxx;


CASE 可能是 SQL 中被误用最多的关键字之一。虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法。例如,你可以在 WHERE 子句中使用 CASE。
首先让我们看一下 CASE 的语法。在一般的 SELECT 中,其语法如下:
SELECT <myColumnSpec> =
            CASE
            WHEN <A> THEN <somethingA>
            WHEN <B> THEN <somethingB>
            ELSE <somethingE>
            END

在上面的代码中需要用具体的参数代替尖括号中的内容。下面是一个简单的例子:
USE pubs
            GO
            SELECT
            Title,
            'Price Range' =
            CASE
            WHEN price IS NULL THEN 'Unpriced'
            WHEN price < 10 THEN 'Bargain'
            WHEN price BETWEEN 10 and 20 THEN 'Average'
            ELSE 'Gift to impress relatives'
            END
            FROM titles
            ORDER BY price
            GO

这是 CASE 的典型用法,但是使用 CASE 其实可以做更多的事情。比方说下面的 GROUP BY 子句中的 CASE:
SELECT 'Number of Titles', Count(*)
            FROM titles
            GROUP BY
            CASE
            WHEN price IS NULL THEN 'Unpriced'
            WHEN price < 10 THEN 'Bargain'
            WHEN price BETWEEN 10 and 20 THEN 'Average'
            ELSE 'Gift to impress relatives'
            END
            GO

你甚至还可以组合这些选项,添加一个 ORDER BY 子句,如下所示:
USE pubs
            GO
            SELECT
            CASE
            WHEN price IS NULL THEN 'Unpriced'
            WHEN price < 10 THEN 'Bargain'
            WHEN price BETWEEN 10 and 20 THEN 'Average'
            ELSE 'Gift to impress relatives'
            END AS Range,
            Title
            FROM titles
            GROUP BY
            CASE
            WHEN price IS NULL THEN 'Unpriced'
            WHEN price < 10 THEN 'Bargain'
            WHEN price BETWEEN 10 and 20 THEN 'Average'
            ELSE 'Gift to impress relatives'
            END,
            Title
            ORDER BY
            CASE
            WHEN price IS NULL THEN 'Unpriced'
            WHEN price < 10 THEN 'Bargain'
            WHEN price BETWEEN 10 and 20 THEN 'Average'
            ELSE 'Gift to impress relatives'
            END,
            Title
            GO

注意,为了在 GROUP BY 块中使用 CASE,查询语句需要在 GROUP BY 块中重复 SELECT 块中的 CASE 块。
除了选择自定义字段之外,在很多情况下 CASE 都非常有用。再深入一步,你还可以得到你以前认为不可能得到的分组排序结果集。
语法:
CASE expr WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr]
END


在简单的CASE表达式中,ORACLE会搜索expr 等于comparison_expr的第一对when then,然后返回return_expr.如果没有满足条件的when then 并且存在ELSE子句,那么ORACLE会返回else_expr,否则会返回空值。
您不能为所有这些return_expr和else_expr指定文字的NULL。


但我试了一下,


Id       AGE
- ----------
1         20
1         22
2         10
2        200
3         30
3         40


SQL> select id,age,case id when '1' then 'aaa' when '2' then 'bbb' else NULL end  from test;

结果
I        AGE CAS
- ---------- ---
1         20 aaa
1         22 aaa
2         10 bbb
2        200 bbb
3         30
3         40
分享到:
评论
1 楼 yu_duo 2012-08-31  
不错,学习了~~

相关推荐

    Spring高级应用之注入嵌套Bean编程开发技术共1页

    在Spring框架中,高级应用涉及了众多复杂但强大的特性,其中注入嵌套Bean编程开发技术是提高代码组织和模块化的重要手段。嵌套Bean是指在一个Bean定义中引用或包含其他Bean,这种结构允许我们创建更复杂的对象图,...

    Spring5高级编程第五版 英文版

    《Spring5高级编程第五版》是一本深入探讨Spring框架核心特性和高级用法的专业书籍,主要面向已经具备一定Java和Spring基础的开发者。本指南旨在帮助读者深化对Spring的理解,提升开发效率,以及掌握最新的Spring5...

    spring高级源码笔记.pdf

    Spring Boot则简化了Spring应用的初始化和配置,而Spring Cloud则是微服务开发的一套工具集,提供了服务发现、配置中心、断路器等功能。 4. **Spring的发展历程**:Spring的诞生是对早期Java EE中EJB的反思和改进。...

    Spring高级篇.pdf

    Spring框架是Java编程语言的一个开源、全面的轻量级应用开发框架,它为Java应用程序的开发提供了全面、广泛的基础性支持。在学习Spring框架时,首先需要了解其主要模块,这些模块可以分为几个核心领域: 1. 核心...

    Java进阶教程数据层全栈方案SpringData高级应用视频教程

    而且在课程的最后部分加入了一个综合案例,可以将前面章节所学知识点应用到一个项目中,帮助学生理解消化。 配图(持久层技术,无界面) 课程主要内容 第一章 SpringData概述 1.持久层开发的问题 2.SpringData简介 第二...

    Spring高级教程

    《Spring高级教程》是针对Java开发者的深度学习资料,它主要涵盖了Spring框架的高级特性和实战应用,包括了与Struts2和Hibernate的整合等内容。本教程旨在帮助开发者提升Spring框架的使用技能,以实现更高效、更稳定...

    Spring 高级编程

    《Spring高级编程》一书由Spring之父推荐,是一份深度解析Spring框架的珍贵资源,尤其适合于希望深入了解Spring架构及高级特性的开发者。本文将根据文档提供的信息,提炼并扩展其中的关键知识点。 ### Spring框架...

    Spring高级之注解驱动开发视频教程

    从应用场景分析,到基本用法的入门案例,再到高级特性的分析及使用,最后是执行原理的源码分析。让学生通过学习本套课程不仅可以知其然,还可以知其所以然。最终通过一个综合案例,实现灵活运用Spring框架中的各个...

    Spring Boot高级.rar

    Spring Boot是Java开发领域的一款非常流行的微服务框架,它由Pivotal团队开发,旨在简化Spring应用的初始搭建以及开发过程。Spring Boot的核心理念是“约定优于配置”,它通过默认配置来减少大量的XML配置,使得...

    Spring高级源码学习笔记.zip

    本笔记旨在深入解析Spring的高级源码,帮助程序员从应用层面过渡到源码级的理解。 Spring的核心组件包括Bean容器、AOP代理、数据访问/集成、MVC、Web服务等。首先,我们来探讨Bean容器,它是Spring的基础,负责管理...

    Spring框架高级编程源代码

    《Spring框架高级编程源代码》第十章主要涵盖了Spring框架中的核心特性和高级应用,这些内容对于深入理解Spring以及提升开发效率至关重要。在这个章节中,我们可以期待学习到以下几个关键知识点: 1. **AOP(面向切...

    Spring高级框架课程笔记.pdf

    Spring高级框架课程笔记 本文档是一份 Spring 高级框架课程笔记,涵盖了 Spring 框架的各个方面,包括 IoC、AOP、Spring MVC、Spring Boot、Spring Cloud 等。下面是本文档的详细知识点总结: 一、Spring 框架的...

    spring高级程序设计code

    通过学习和实践《Spring高级程序设计Code》中的内容,开发者可以深入了解Spring框架的各个方面,并提升在实际项目中的应用能力。这份资源涵盖了Spring的诸多核心概念和实践技巧,对于提升个人技能和解决复杂业务场景...

    SpringCloud微服务高级

    通过这个高级教程,学习者不仅可以掌握SpringCloud的基础用法,还能了解到微服务架构的设计原则和优化技巧,为构建高效、稳定的分布式系统打下坚实基础。同时,代码目录下的"图片"和"代码"部分,将通过可视化和示例...

    多年积累spring高级资料

    这份"多年积累spring高级资料"集合了Spring框架的深度学习资源,涵盖了从基础到高级的各种主题,对于提升Spring技能有着极大的帮助。 Spring的核心特性包括依赖注入(Dependency Injection, DI),它允许开发者在...

    Spring高级开发代码

    根据题目描述“Spring高级开发代码”,我们可以推测本文将涵盖Spring框架在实际项目中的高级应用技巧,主要包括以下几个方面: 1. **Spring Boot自动化配置**: - **原理与实践**:Spring Boot通过自动配置机制来...

    spring高级开发技术

    《Spring高级开发技术》 Spring框架作为Java领域最流行的轻量级开源框架之一,它以其模块化、松耦合的设计理念,以及强大的依赖注入和面向切面编程能力,深受开发者喜爱。本指南将深入探讨Spring的高级开发技术,...

    高级开发spring面试题和答案.pdf

    在Spring框架中,面试常涉及的关键知识点包括Spring的IoC(控制反转)、依赖注入、Bean的生命周期、AOP(面向切面...以上知识点都是Spring面试中可能涉及的核心内容,理解和掌握这些将有助于应对高级开发岗位的面试。

    spring高级源码分析

    《Spring高级源码分析》是针对Java开发人员深入理解Spring框架的一份宝贵资源。Spring作为Java企业级应用的基石,其强大的功能和灵活性源于其深厚的设计理念和精巧的源码实现。本分析将深入探讨Spring的核心机制,...

Global site tag (gtag.js) - Google Analytics