• 简单说说SpringMVC


    距离上一次开发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">&#xe600;</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简单的增删改查功能的实现,希望对大家有帮助~

  • 相关阅读:
    Fiddler基础与HTTP状态码
    Fiddler与F12设置代理
    人和机器猜拳游戏
    ng-model 取不到值
    git的使用
    笔记
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
  • 原文地址:https://www.cnblogs.com/guojia314/p/9721600.html
Copyright © 2020-2023  润新知