距离上一次开发SpringMVC项目已经过去了大半年,有些细节已经开始遗忘,今天复习一下
先从标签说起:
和struts有各种配置文件不同,spring用标签开发。
1.@Controller
在SpringMVC中,控制器Controller负责处理由DispatcherServlet分发的请求
他把用户请求的数据经过业务处理层处理之后封装成一个model,然后再把该model
返回给对应的view进行展示。在SpringMVC中提供一个非常简便的定义Controller
的方法,你无需继承特定的类或实现特定的接口,
只需要使用@Controller标记一个类是controller,然后使用@RequestMapping,@RequestParam
等一些注解用以定义URL请求和Controller方法之间的映射,这样Controller就能被外界访问到
此外,Controller不会直接依赖于 HttpServletRequest 和 HttpServlet对象,他们可以通过Controller的 方法参数灵活的获取到。
@Controller用于标记一个类上,使用他标记的类就是一个Spring'MVC Controller对象
分发处理器将会扫描用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解
@Controller只是定义了一个控制器类,而使用@RequestMapping注解的方法才是真正处理请求的
处理器,单单使用@Controller标记在一个类上还不能真正意义上说他就是SpringMVC的一个控制类
因为这个时候Spring还不认识他,那么要如何做Spring才能认识她呢?
这个时候就需要我们把这个控制器类交给Spring来管理,有两种方式
(1)在SpringMVC配置文件中定义MyController的bean对象
(2)在SpringMVC配置文件中告诉Spring该到哪里去找标记为@Controller的Controller控制器
<!--方式一-->
<bean class="com.host.app.web.controller.MyController"/>
<!--方式二-->
<context:component-scan base-package="com.host.app.web">
//路径写到controller的上一层(扫描包详见下面解析)
2.@RequestMapping
RequestMapping是一个用来处理请求地址映射的注解,可用于类和方法上。
用于子类上表示类中的所有响应请求的方法都是以该地址作为父路径
RequestMapping注解有六个属性,下面我们把他分成三类进行说明(下面有相应实例)
1.value,method
value:指定请求的实际地址,指定的地址可以是URL Temple模式(后面将会说明)
method:指定请求的method类型,GET,POST,PUT,DELETE等
@RequestMapping(value="",method={"",""},header={},param={"",""})
参数:
value:设置访问地址
method:设置访问方式,常用的method=RequestMethod.POST和
method=RequestMethod.GET
headers:头域,可以设置浏览器支持的格式
params:访问参数设置
注解作用:
用来定义访问url,可以是方法级别的,也可以是类级别的,两者可以协同工作,缩小选择范围
也可以隐藏代码的真实路径,更加具有安全性和可读性
3.@Autowired
注解作用:
可以对成员变量,方法和构造函数进行标注,来完成自动装配工作,可以消除get/set方法
action里get/set注入
5.@PathVariable
用于将请求URL中的模板变量映射到功能处理方法的参数上,即将取出url模板中的变量作为参数
@PathVariable
注解作用:
用于方法中的参数,表示方法参数绑定到地址URL的模板
6.@RequestParam
@RequestParam主要用于在SpringMVC后台控制层获取参数,
类似一种是request.getParameter("name"),他有三个常用参数,
defaultValue="0" ; required=false , value="isApp" ; defaultValue表示设置默认值,
required通过boolean设置是否必须要传入的参数,value值表示接受的传入的参数类型
@RequestParam(required= , value="",defaultValue="")
参数:
required:参数是否必须,boolean类型:默认为true
value:传递的参数名称。String类型,可选项,有值则对应方法的参数
defaultValue:参数没有传递时为参数默认指定的值
7.@ResponseBody
作用:该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter
转换为适当格式后,写入到Response对象的body数据区
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json,xml等)、
8.@ResponseBody注解作用:
直接放在方法上,表示返回类型将会直接作为http响应字节流输出,可以用于Ajax
9.@Service-表示业务处理层(一般在serviceImpl)
说明:@Service负责注册一个bean到spring上下文中,bean的ID默认为类名称开头字母小写
10.@Transactional
事务管理模式
spring支持编程式事务管理和声明式事务管理两种方式
编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager
对于编程式事务管理,spring推荐使用TransactionTemple
声明式事务管理建立在AOP之上,,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事物,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需要在配置文件中做相关的事务规则声明(或通过基于@Transaction注解的方式),便可以将事务规则应用到业务逻辑中。
显然声明式事务管理要优于编程式事务管理,这正式spring倡导的非侵入式的开发方式,声明式事务管理使业务代码不受到污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。和编程式事务相比,声明式事务3唯一不足的地方是后者最细粒度只能作用到方法级别,无法做到编程式事务那样可以做到代码块级别,但是即便有这样的需求,也存在很多变通的方法如可以将需要进行事务管理的代码块独立为方法等等
声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解,显然基于注解的方式更简单易用,更清爽
TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事事务,如果当前没有事务,则创建一个新的事务,这是默认值。
TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起
TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务,如果没有则以非事务的方式继续运行
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,把当前事务挂起
TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果存在当前事务,则抛出异常
TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事事务,没有事务则抛出异常
TransactionDefinition.PROPAGATION_NESTED如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行,
如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED
属性:
Propagation可选的事务传播行为设置
ReadOnly:读写或只读事务,默认读写(boolean)
readOnly=true 只读,不能更新,删除
//设置超时时间
@Transactional(propagation=Propagation.REQUIRED,timeout=30)
注:
@Transactional注解应该只被应用到public方法上,这是由SpringAOP的本质决定的,
如果你在protected,private或者默认可见性的方法上使用@Transactional注解将被忽略
也不会抛出任何异常
在Service类前加上@Transactional,声明这个service所有方法需要事务管理
每一个业务方法开始时都会打开一个事务
11.@SelectProvider
@SelectProvider注解用于生成查询用的sql语句,有别于@Select注解,@SelectProvider指定一个Class及其方法,并且通过调用Class上的这个方法来获得sql语句,在我们这个例子中,获取查询sql方法是SqlProvider selectUser
@SelectProvider中type参数指定的class类,必须要能够通过无参数的构造函数来初始化,
@SelectProvider中method参数指定的方法必须是public的,返回值必须为String,可以为static
注:如果在getUser方法中,对userId方法使用了@Param注解,那么相应selectUser方法必须
接受Map<String,Object>作为参数
如果参数使用了@Param注解,那么参数在Map中以@Param的值为key
ps:很多人(包括我)在刚开始开发spring时,对那些xxxAction.class都报有一丝敬畏之心,但实际上,只有你在这个class里添加了@Controller标签,他才会成为真正意义上的action,可以控制页面跳转和与前台交互数据,接下来放一一个登录demo的栗子帮助理解springMV西
action:登录功能代码丢了,这个我日后补上
然后!controller 和 jsp 的地址一定要能对上,controller要记得初始化你想要跳转到页面(就像下面的22~24行、52~55行),否则会出现空页面情况
1 package com.javen.modules.Test.web; 2 3 import java.util.List; 4 import java.util.Map; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.stereotype.Controller; 7 import org.springframework.ui.Model; 8 import org.springframework.web.bind.annotation.RequestMapping; 9 import org.springframework.web.bind.annotation.RequestParam; 10 import com.javen.common.controller.BaseController; 11 import com.javen.common.utils.MessageUtils; 12 import com.javen.modules.Test.dao.model.Table; 13 import com.javen.modules.Test.service.TestService; 14 15 @Controller 16 @RequestMapping("/wf/test") 17 public class TestController extends BaseController{ 18 19 @Autowired 20 private TestService service; 21 22 @RequestMapping("") 23 public String log(){ 24 return "test/testLog"; 25 } 26 27 @RequestMapping("/list") 28 public String list(Model model, 29 @RequestParam(value="name",required=false,defaultValue="") String name, 30 @RequestParam(value="sex",required=false,defaultValue="") String sex, 31 @RequestParam(value="cp", required=false, defaultValue="1") int currPage){ 32 List<Map<String,String>> list = service.getList(name, sex, currPage,2); 33 int cnt =service.getCnt(name,sex); 34 model.addAttribute("cnt",cnt); 35 if(cnt < 1){ 36 alertInfo(MessageUtils.getMessage("INF0003", "鎶辨瓑锛岃�閲嶆柊杈撳叆"), model); 37 }else { 38 if("".equals(sex)){ 39 sex = "3"; 40 model.addAttribute("sex", sex); 41 } 42 model.addAttribute("offset", (currPage-1)*2); 43 model.addAttribute("currPage", currPage); 44 model.addAttribute("name", name); 45 model.addAttribute("list", list); 46 } 47 48 return "test/testList"; 49 50 } 51 52 @RequestMapping("/add") 53 public String add(){ 54 55 return "test/testAdd"; 56 } 57 58 @RequestMapping(value = "/add/exec") 59 public String a (Table table,Model model){ 60 int b = service.get(table); 61 if(b > 0){ 62 alertError(MessageUtils.getMessage("ERR0016", "閲嶅�"), model); 63 return "forward:/wf/test/add"; 64 } 65 table.setDegree("纭曞+"); 66 table.setGradUni("鍝堝皵婊ㄧ悊宸ュぇ瀛�"); 67 table.setMail("1225165@qq.com"); 68 table.setTelNumber("13055465421"); 69 70 boolean add = service.addTable(table); 71 if (add) { 72 alertSuccess(MessageUtils.getMessage("INF0001", "鎴愬姛"), model); 73 alertSucc(model, 2); 74 } else { 75 alertError(MessageUtils.getMessage("ERR0016", "澶辫触"), model); 76 77 } 78 79 80 return "forward:/wf/test/add"; 81 82 83 } 84 }
乱码是我把文件乱保存出现了解码错误吧,都是些自己设定的报错或者提示信息,不影响功能
service:
package com.javen.modules.Test.service; import java.util.List; import java.util.Map; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.javen.common.service.BaseService; import com.javen.modules.Test.dao.mapper.TableMapper; import com.javen.modules.Test.dao.model.Table; import com.javen.modules.Test.dao.model.TableExample; import com.javen.modules.Test.dao.model.TableExample.Criteria; @Service @Transactional(readOnly=true) public class TestService extends BaseService{ @Transactional(propagation = Propagation.SUPPORTS) public int getCnt(String name ,String sex){ TableMapper mapper = readonlySQLSession.getMapper(TableMapper.class); TableExample example = new TableExample(); Criteria criteria = example.createCriteria(); if(!"".equals(name)){ criteria.andNameLike(name); }if(!"".equals(sex)){ criteria.andSexEqualTo(sex); } return mapper.countByExample(example); } @Transactional(propagation=Propagation.SUPPORTS) public List<Map<String, String>> getList(String name, String sex, int currPage, int size) { TableMapper mapper = readonlySQLSession.getMapper(TableMapper.class); int offset=(currPage-1)*size; return mapper.getList(name,sex,offset,size); } @Transactional(propagation=Propagation.SUPPORTS) public int get(Table table) { TableMapper mapper = readonlySQLSession.getMapper(TableMapper.class); return mapper.getmapper(table); } @Transactional(propagation=Propagation.SUPPORTS) public boolean addTable(Table table) { TableMapper mapper = writableSQLSession.getMapper(TableMapper.class); return mapper.insertSelective(table)>0; } }
连db部分是自动生成的文件,这里我挑有用的复制了
1 package com.javen.modules.Test.dao.mapper; 2 3 import com.javen.modules.Test.dao.model.Table; 4 import com.javen.modules.Test.dao.model.TableExample; 5 6 import java.util.List; 7 import java.util.Map; 8 9 import org.apache.ibatis.annotations.Delete; 10 import org.apache.ibatis.annotations.DeleteProvider; 11 import org.apache.ibatis.annotations.Insert; 12 import org.apache.ibatis.annotations.InsertProvider; 13 import org.apache.ibatis.annotations.Param; 14 import org.apache.ibatis.annotations.Result; 15 import org.apache.ibatis.annotations.Results; 16 import org.apache.ibatis.annotations.Select; 17 import org.apache.ibatis.annotations.SelectProvider; 18 import org.apache.ibatis.annotations.Update; 19 import org.apache.ibatis.annotations.UpdateProvider; 20 import org.apache.ibatis.type.JdbcType; 21 22 public interface TableMapper { 23 @SelectProvider(type=TableSqlProvider.class, method="countByExample") 24 int countByExample(TableExample example); 25 26 @DeleteProvider(type=TableSqlProvider.class, method="deleteByExample") 27 int deleteByExample(TableExample example); 28 29 @Delete({ 30 "delete from table", 31 "where id = #{id,jdbcType=INTEGER}" 32 }) 33 int deleteByPrimaryKey(Integer id); 34 35 @Insert({ 36 "insert into table (id, name, ", 37 "tel_number, degree, ", 38 "sex, grad_uni, mail, ", 39 "password)", 40 "values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, ", 41 "#{telNumber,jdbcType=VARCHAR}, #{degree,jdbcType=VARCHAR}, ", 42 "#{sex,jdbcType=CHAR}, #{gradUni,jdbcType=VARCHAR}, #{mail,jdbcType=VARCHAR}, ", 43 "#{password,jdbcType=VARCHAR})" 44 }) 45 int insert(Table record); 46 47 @InsertProvider(type=TableSqlProvider.class, method="insertSelective") 48 int insertSelective(Table record); 49 50 @SelectProvider(type=TableSqlProvider.class, method="selectByExample") 51 @Results({ 52 @Result(column="id", property="id", jdbcType=JdbcType.INTEGER, id=true), 53 @Result(column="name", property="name", jdbcType=JdbcType.VARCHAR), 54 @Result(column="tel_number", property="telNumber", jdbcType=JdbcType.VARCHAR), 55 @Result(column="degree", property="degree", jdbcType=JdbcType.VARCHAR), 56 @Result(column="sex", property="sex", jdbcType=JdbcType.CHAR), 57 @Result(column="grad_uni", property="gradUni", jdbcType=JdbcType.VARCHAR), 58 @Result(column="mail", property="mail", jdbcType=JdbcType.VARCHAR), 59 @Result(column="password", property="password", jdbcType=JdbcType.VARCHAR) 60 }) 61 List<Table> selectByExample(TableExample example); 62 63 @Select({ 64 "select", 65 "id, name, tel_number, degree, sex, grad_uni, mail, password", 66 "from table", 67 "where id = #{id,jdbcType=INTEGER}" 68 }) 69 @Results({ 70 @Result(column="id", property="id", jdbcType=JdbcType.INTEGER, id=true), 71 @Result(column="name", property="name", jdbcType=JdbcType.VARCHAR), 72 @Result(column="tel_number", property="telNumber", jdbcType=JdbcType.VARCHAR), 73 @Result(column="degree", property="degree", jdbcType=JdbcType.VARCHAR), 74 @Result(column="sex", property="sex", jdbcType=JdbcType.CHAR), 75 @Result(column="grad_uni", property="gradUni", jdbcType=JdbcType.VARCHAR), 76 @Result(column="mail", property="mail", jdbcType=JdbcType.VARCHAR), 77 @Result(column="password", property="password", jdbcType=JdbcType.VARCHAR) 78 }) 79 Table selectByPrimaryKey(Integer id); 80 81 @UpdateProvider(type=TableSqlProvider.class, method="updateByExampleSelective") 82 int updateByExampleSelective(@Param("record") Table record, @Param("example") TableExample example); 83 84 @UpdateProvider(type=TableSqlProvider.class, method="updateByExample") 85 int updateByExample(@Param("record") Table record, @Param("example") TableExample example); 86 87 @UpdateProvider(type=TableSqlProvider.class, method="updateByPrimaryKeySelective") 88 int updateByPrimaryKeySelective(Table record); 89 90 @Update({ 91 "update table", 92 "set name = #{name,jdbcType=VARCHAR},", 93 "tel_number = #{telNumber,jdbcType=VARCHAR},", 94 "degree = #{degree,jdbcType=VARCHAR},", 95 "sex = #{sex,jdbcType=CHAR},", 96 "grad_uni = #{gradUni,jdbcType=VARCHAR},", 97 "mail = #{mail,jdbcType=VARCHAR},", 98 "password = #{password,jdbcType=VARCHAR}", 99 "where id = #{id,jdbcType=INTEGER}" 100 }) 101 int updateByPrimaryKey(Table record); 102 103 104 105 @SelectProvider(type=TableSqlProvider.class, method="getCntsql") 106 int getCnt(String name, String sex); 107 108 @SelectProvider(type=TableSqlProvider.class, method="getListsql") 109 List<Map<String, String>> getList( 110 @Param("name") String name, 111 @Param("sex") String sex, 112 @Param("offset") int offset, 113 @Param("size") int size); 114 115 116 @SelectProvider(type=TableSqlProvider.class, method="getmappersql") 117 int getmapper(Table table); 118 }
还有
1 package com.javen.modules.Test.dao.mapper; 2 3 import static org.apache.ibatis.jdbc.SqlBuilder.BEGIN; 4 import static org.apache.ibatis.jdbc.SqlBuilder.DELETE_FROM; 5 import static org.apache.ibatis.jdbc.SqlBuilder.FROM; 6 import static org.apache.ibatis.jdbc.SqlBuilder.INSERT_INTO; 7 import static org.apache.ibatis.jdbc.SqlBuilder.ORDER_BY; 8 import static org.apache.ibatis.jdbc.SqlBuilder.SELECT; 9 import static org.apache.ibatis.jdbc.SqlBuilder.SELECT_DISTINCT; 10 import static org.apache.ibatis.jdbc.SqlBuilder.SET; 11 import static org.apache.ibatis.jdbc.SqlBuilder.SQL; 12 import static org.apache.ibatis.jdbc.SqlBuilder.UPDATE; 13 import static org.apache.ibatis.jdbc.SqlBuilder.VALUES; 14 import static org.apache.ibatis.jdbc.SqlBuilder.WHERE; 15 16 import com.javen.modules.Test.dao.model.Table; 17 import com.javen.modules.Test.dao.model.TableExample.Criteria; 18 import com.javen.modules.Test.dao.model.TableExample.Criterion; 19 import com.javen.modules.Test.dao.model.TableExample; 20 21 import java.util.List; 22 import java.util.Map; 23 24 import org.springframework.util.StringUtils; 25 26 public class TableSqlProvider { 27 28 public String countByExample(TableExample example) { 29 BEGIN(); 30 SELECT("count(*)"); 31 FROM("table"); 32 applyWhere(example, false); 33 return SQL(); 34 } 35 36 public String deleteByExample(TableExample example) { 37 BEGIN(); 38 DELETE_FROM("table"); 39 applyWhere(example, false); 40 return SQL(); 41 } 42 43 public String insertSelective(Table record) { 44 BEGIN(); 45 INSERT_INTO("table"); 46 47 if (record.getId() != null) { 48 VALUES("id", "#{id,jdbcType=INTEGER}"); 49 } 50 51 if (record.getName() != null) { 52 VALUES("name", "#{name,jdbcType=VARCHAR}"); 53 } 54 55 if (record.getTelNumber() != null) { 56 VALUES("tel_number", "#{telNumber,jdbcType=VARCHAR}"); 57 } 58 59 if (record.getDegree() != null) { 60 VALUES("degree", "#{degree,jdbcType=VARCHAR}"); 61 } 62 63 if (record.getSex() != null) { 64 VALUES("sex", "#{sex,jdbcType=CHAR}"); 65 } 66 67 if (record.getGradUni() != null) { 68 VALUES("grad_uni", "#{gradUni,jdbcType=VARCHAR}"); 69 } 70 71 if (record.getMail() != null) { 72 VALUES("mail", "#{mail,jdbcType=VARCHAR}"); 73 } 74 75 if (record.getPassword() != null) { 76 VALUES("password", "#{password,jdbcType=VARCHAR}"); 77 } 78 79 return SQL(); 80 } 81 82 public String selectByExample(TableExample example) { 83 BEGIN(); 84 if (example != null && example.isDistinct()) { 85 SELECT_DISTINCT("id"); 86 } else { 87 SELECT("id"); 88 } 89 SELECT("name"); 90 SELECT("tel_number"); 91 SELECT("degree"); 92 SELECT("sex"); 93 SELECT("grad_uni"); 94 SELECT("mail"); 95 SELECT("password"); 96 FROM("table"); 97 applyWhere(example, false); 98 99 if (example != null && example.getOrderByClause() != null) { 100 ORDER_BY(example.getOrderByClause()); 101 } 102 103 return SQL(); 104 } 105 106 public String updateByExampleSelective(Map<String, Object> parameter) { 107 Table record = (Table) parameter.get("record"); 108 TableExample example = (TableExample) parameter.get("example"); 109 110 BEGIN(); 111 UPDATE("table"); 112 113 if (record.getId() != null) { 114 SET("id = #{record.id,jdbcType=INTEGER}"); 115 } 116 117 if (record.getName() != null) { 118 SET("name = #{record.name,jdbcType=VARCHAR}"); 119 } 120 121 if (record.getTelNumber() != null) { 122 SET("tel_number = #{record.telNumber,jdbcType=VARCHAR}"); 123 } 124 125 if (record.getDegree() != null) { 126 SET("degree = #{record.degree,jdbcType=VARCHAR}"); 127 } 128 129 if (record.getSex() != null) { 130 SET("sex = #{record.sex,jdbcType=CHAR}"); 131 } 132 133 if (record.getGradUni() != null) { 134 SET("grad_uni = #{record.gradUni,jdbcType=VARCHAR}"); 135 } 136 137 if (record.getMail() != null) { 138 SET("mail = #{record.mail,jdbcType=VARCHAR}"); 139 } 140 141 if (record.getPassword() != null) { 142 SET("password = #{record.password,jdbcType=VARCHAR}"); 143 } 144 145 applyWhere(example, true); 146 return SQL(); 147 } 148 149 public String updateByExample(Map<String, Object> parameter) { 150 BEGIN(); 151 UPDATE("table"); 152 153 SET("id = #{record.id,jdbcType=INTEGER}"); 154 SET("name = #{record.name,jdbcType=VARCHAR}"); 155 SET("tel_number = #{record.telNumber,jdbcType=VARCHAR}"); 156 SET("degree = #{record.degree,jdbcType=VARCHAR}"); 157 SET("sex = #{record.sex,jdbcType=CHAR}"); 158 SET("grad_uni = #{record.gradUni,jdbcType=VARCHAR}"); 159 SET("mail = #{record.mail,jdbcType=VARCHAR}"); 160 SET("password = #{record.password,jdbcType=VARCHAR}"); 161 162 TableExample example = (TableExample) parameter.get("example"); 163 applyWhere(example, true); 164 return SQL(); 165 } 166 167 public String updateByPrimaryKeySelective(Table record) { 168 BEGIN(); 169 UPDATE("table"); 170 171 if (record.getName() != null) { 172 SET("name = #{name,jdbcType=VARCHAR}"); 173 } 174 175 if (record.getTelNumber() != null) { 176 SET("tel_number = #{telNumber,jdbcType=VARCHAR}"); 177 } 178 179 if (record.getDegree() != null) { 180 SET("degree = #{degree,jdbcType=VARCHAR}"); 181 } 182 183 if (record.getSex() != null) { 184 SET("sex = #{sex,jdbcType=CHAR}"); 185 } 186 187 if (record.getGradUni() != null) { 188 SET("grad_uni = #{gradUni,jdbcType=VARCHAR}"); 189 } 190 191 if (record.getMail() != null) { 192 SET("mail = #{mail,jdbcType=VARCHAR}"); 193 } 194 195 if (record.getPassword() != null) { 196 SET("password = #{password,jdbcType=VARCHAR}"); 197 } 198 199 WHERE("id = #{id,jdbcType=INTEGER}"); 200 201 return SQL(); 202 } 203 204 protected void applyWhere(TableExample example, boolean includeExamplePhrase) { 205 if (example == null) { 206 return; 207 } 208 209 String parmPhrase1; 210 String parmPhrase1_th; 211 String parmPhrase2; 212 String parmPhrase2_th; 213 String parmPhrase3; 214 String parmPhrase3_th; 215 if (includeExamplePhrase) { 216 parmPhrase1 = "%s #{example.oredCriteria[%d].allCriteria[%d].value}"; 217 parmPhrase1_th = "%s #{example.oredCriteria[%d].allCriteria[%d].value,typeHandler=%s}"; 218 parmPhrase2 = "%s #{example.oredCriteria[%d].allCriteria[%d].value} and #{example.oredCriteria[%d].criteria[%d].secondValue}"; 219 parmPhrase2_th = "%s #{example.oredCriteria[%d].allCriteria[%d].value,typeHandler=%s} and #{example.oredCriteria[%d].criteria[%d].secondValue,typeHandler=%s}"; 220 parmPhrase3 = "#{example.oredCriteria[%d].allCriteria[%d].value[%d]}"; 221 parmPhrase3_th = "#{example.oredCriteria[%d].allCriteria[%d].value[%d],typeHandler=%s}"; 222 } else { 223 parmPhrase1 = "%s #{oredCriteria[%d].allCriteria[%d].value}"; 224 parmPhrase1_th = "%s #{oredCriteria[%d].allCriteria[%d].value,typeHandler=%s}"; 225 parmPhrase2 = "%s #{oredCriteria[%d].allCriteria[%d].value} and #{oredCriteria[%d].criteria[%d].secondValue}"; 226 parmPhrase2_th = "%s #{oredCriteria[%d].allCriteria[%d].value,typeHandler=%s} and #{oredCriteria[%d].criteria[%d].secondValue,typeHandler=%s}"; 227 parmPhrase3 = "#{oredCriteria[%d].allCriteria[%d].value[%d]}"; 228 parmPhrase3_th = "#{oredCriteria[%d].allCriteria[%d].value[%d],typeHandler=%s}"; 229 } 230 231 StringBuilder sb = new StringBuilder(); 232 List<Criteria> oredCriteria = example.getOredCriteria(); 233 boolean firstCriteria = true; 234 for (int i = 0; i < oredCriteria.size(); i++) { 235 Criteria criteria = oredCriteria.get(i); 236 if (criteria.isValid()) { 237 if (firstCriteria) { 238 firstCriteria = false; 239 } else { 240 sb.append(" or "); 241 } 242 243 sb.append('('); 244 List<Criterion> criterions = criteria.getAllCriteria(); 245 boolean firstCriterion = true; 246 for (int j = 0; j < criterions.size(); j++) { 247 Criterion criterion = criterions.get(j); 248 if (firstCriterion) { 249 firstCriterion = false; 250 } else { 251 sb.append(" and "); 252 } 253 254 if (criterion.isNoValue()) { 255 sb.append(criterion.getCondition()); 256 } else if (criterion.isSingleValue()) { 257 if (criterion.getTypeHandler() == null) { 258 sb.append(String.format(parmPhrase1, criterion.getCondition(), i, j)); 259 } else { 260 sb.append(String.format(parmPhrase1_th, criterion.getCondition(), i, j,criterion.getTypeHandler())); 261 } 262 } else if (criterion.isBetweenValue()) { 263 if (criterion.getTypeHandler() == null) { 264 sb.append(String.format(parmPhrase2, criterion.getCondition(), i, j, i, j)); 265 } else { 266 sb.append(String.format(parmPhrase2_th, criterion.getCondition(), i, j, criterion.getTypeHandler(), i, j, criterion.getTypeHandler())); 267 } 268 } else if (criterion.isListValue()) { 269 sb.append(criterion.getCondition()); 270 sb.append(" ("); 271 List<?> listItems = (List<?>) criterion.getValue(); 272 boolean comma = false; 273 for (int k = 0; k < listItems.size(); k++) { 274 if (comma) { 275 sb.append(", "); 276 } else { 277 comma = true; 278 } 279 if (criterion.getTypeHandler() == null) { 280 sb.append(String.format(parmPhrase3, i, j, k)); 281 } else { 282 sb.append(String.format(parmPhrase3_th, i, j, k, criterion.getTypeHandler())); 283 } 284 } 285 sb.append(')'); 286 } 287 } 288 sb.append(')'); 289 } 290 } 291 292 if (sb.length() > 0) { 293 WHERE(sb.toString()); 294 } 295 } 296 297 public String getCntsql(String name,String sex){ 298 StringBuilder str = new StringBuilder(); 299 str.append("select count(*) from table where name = #{name}"); 300 return str.toString(); 301 } 302 303 public String getListsql(Map<String, String> map){ 304 StringBuilder str = new StringBuilder(); 305 str.append("select name,"); 306 str.append("sex,"); 307 str.append("tel_number,"); 308 str.append("degree,"); 309 str.append("grad_uni,"); 310 str.append("mail from table where 1 = 1"); 311 312 String name = map.get("name"); 313 if(!StringUtils.isEmpty(name)){ 314 str.append(" and name like '%"); 315 str.append(name); 316 str.append("%'"); 317 } 318 319 String sex = map.get("sex"); 320 if(!StringUtils.isEmpty(sex)){ 321 str.append(" and sex = "); 322 str.append(sex); 323 } 324 325 str.append(" limit #{offset},#{size}"); 326 return str.toString(); 327 } 328 329 public String getmappersql(Table table){ 330 StringBuilder str = new StringBuilder(); 331 str.append("select count(*) from table where name = #{name}"); 332 return str.toString(); 333 } 334 }
页面有两个,登录注册/页面和显示页面,由于是demo,所以没加任何样式,大家凑合看吧。
登录/注册:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <%@ include file="/WEB-INF/views/include/global.jsp"%> 3 <%@ page import="com.javen.common.constant.UrlConst" %> 4 <c:set target="${self.content}" property="main"> 5 <form action="${base}/wf/test" method="post"> 6 <table style="250px;height:100px" border="1" align="center"> 7 <tbody> 8 <tr> 9 <th width="80px" height="80px" >请输入用户名</th> 10 <td width="80px" height="80px" > 11 <input type="text" width="200px" placeholder="用户名" pattern="^[A-Za-z0-9_u4e00-u9fa5/]+$" title="请输入字母,数字或中文!"> 12 </td> 13 </tr> 14 <tr> 15 <th width="80px" height="80px" align="center">请输入密码</th> 16 <td width="80px" height="80px"> 17 <input type="password" width="200px" placeholder="密码" pattern="^[A-Za-z0-9]+$" title="请输入字母,数字!"> 18 </td> 19 </tr> 20 <tr> 21 <th width="80px" height="80px"></th> 22 <td width="80px" height="80px"> 23 <a href="javascript:void(0);" onclick="layer_show('登录','${base}/wf/test/list','750','600')" class="btn radius btn-secondary size-MINI ml-5">登录</a> 24 </td> 25 </tr> 26 </tbody> 27 </table> 28 29 30 </form> 31 </c:set> 32 <%@ include file="/WEB-INF/views/include/main.jsp"%>
显示:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <%@ include file="/WEB-INF/views/include/global.jsp"%> 3 <%@ page import="com.javen.common.constant.UrlConst" %> 4 <c:set target="${self.content}" property="main"> 5 <form action="${base}/wf/test/list" method="post" > 6 <div class="text-l"> 7 <label>用户名:</label> 8 <input id="name" name="name" value="${name}" type="tel" class="input-text" style="250px; " placeholder="用户名"> 9 <label>性别:</label> 10 <c:choose> 11 <c:when test="${sex == 0}"> 12 <input id="sex1" name="sex" value="0" type="radio" checked/>男 13 <input id="sex2" name="sex" value="1" type="radio"/>女 14 </c:when> 15 <c:when test="${sex == 1}"> 16 <input id="sex3" name="sex" value="0" type="radio"/>男 17 <input id="sex4" name="sex" value="1" type="radio"checked/>女 18 </c:when> 19 <c:otherwise > 20 <input id="sex5" name="sex" value="0" type="radio"/>男 21 <input id="sex6" name="sex" value="1" type="radio"/>女 22 </c:otherwise> 23 </c:choose> 24 25 <button type="submit" > 查找</button> 26 </div> 27 <div> 28 <span> 29 <a class="btn btn-primary radius" href="javascript:void(0);" onclick="layer_show('添加数据','${base}/','750','600')"><i class="Hui-iconfont"></i> 添加数据</a> 30 </span> 31 <span class="r">共有数据:<strong>${cnt}</strong> 条</span> 32 </div> 33 <table class="table table-border table-bordered table-hover table-bg"> 34 <thead> 35 <tr class="text-c"> 36 <th width="20">序号</th> 37 <th width="200">用户名</th> 38 <th width="200">密码</th> 39 <th width="200">电话</th> 40 <th width="200">学位</th> 41 <th width="200">性别</th> 42 <th width="200">毕业院校</th> 43 <th width="200">邮箱</th> 44 </tr> 45 </thead> 46 <tbody> 47 <c:forEach var="data" items="${list}" varStatus="status"> 48 <tr> 49 <td class="text-c">${offset + status.index + 1}</td> 50 <td class="text-c">${data.name}</td> 51 <td class="text-c">${data.password}</td> 52 <td class="text-c">${data.tel_number}</td> 53 <td class="text-c">${data.degree}</td> 54 <td class="text-c">${data.grad_uni}</td> 55 <td class="text-c">${data.mail}</td> 56 <td class="text-c">${data.sex}</td> 57 <%-- <input id="type_id" type="hidden" name="type_id" value="${data.type_id}"> --%> 58 <td class="text-c f-14"> 59 <a href="javascript:void(0);" onclick="layer_show('修改数据','${base}/','750','600')" class="btn radius btn-secondary size-MINI ml-5">修改</a> 60 <a href="javascript:void(0);" onclick="layer_show('删除数据','${base}/','750','600')" class="btn radius btn-danger size-MINI ml-5">删除</a> 61 62 </td> 63 </tr> 64 </c:forEach> 65 </tbody> 66 </table> 67 68 <!-- <script type="text/javascript" src="jquery/1.9.1/jquery.min.js"></script> --> 69 70 71 <script> 72 73 $(document).ready(function () { 74 $("#btnClear").click(function () { 75 $("input").val(""); 76 // $("select") .val(""); 77 }); 78 79 }); 80 81 82 83 // $(document).ready(function(){ 84 // alert("第一种方法。"); 85 // }); 86 </script> 87 <%-- <%@ include file="/WEB-INF/views/bussiness/wfActivity/activityPage.jsp"%> --%> 88 <%@ include file="/WEB-INF/views/include/pagination.jsp"%> 89 </form> 90 </c:set> 91 <%@ include file="/WEB-INF/views/include/main.jsp"%>
下面是我总结的增删改查思想,工作中或是其他场景做各种框架服务基本都是这么个流程(话说问我什么时候能入门架构。。。)
查询:
获取结果集合,
判断是否有数据(模糊查询)
如果有,
model.addAttribute()传值
返页面,
如果没有,报错
添加:
先判断是否有输入
在判断输入的值是否与与已有数据重复
创建日期 修改日期balabala
如果插入了 返回成功
如果没有,报错
修改:(删除中的逻辑删除也算是一种修改,写法类似)
判断是否输入
在判断修改的对象是否正确
如果修改返回成功
如果没有,报错
以上就是SpringMVC简单的增删改查功能的实现,希望对大家有帮助~