您的位置:首页 > 编程语言 > Java开发

SpringMvc+Mybatis简单测试

2015-09-19 12:11 453 查看
博客测试:(第一次写博客)

mybatis:

SqlMapConfig.xml :

    <!-- 懒加载根据需求进行添加 -->
    <settings>
       <settingname="lazyLoadingEnabled"value="true"/>
       <settingname="aggressiveLazyLoading"value="false"/>
    </settings>
   
    <typeAliases>
       <!-- 批量定义别名,扫描多个包,添加多个package -->
       <packagename="com.oa.po"/>
    </typeAliases>
 

 

数据库连接配置文件

db.properties

jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
jdbc.username=scott
jdbc.password=123456

 

这里将application.xml分成3个文件(本人是为了方便阅读)

applicationContext-dao.xml :(配置数据源与相关配置信息)

    <!-- 加载配置文件 -->
    <context:property-placeholderlocation="classpath:db.properties"/>
 
    <!-- 数据源,使用dbcp -->
    <beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"
       destroy-method="close">
       <propertyname="driverClassName"value="${jdbc.driver}"/>
       <propertyname="url"value="${jdbc.url}"/>
       <propertyname="username"value="${jdbc.username}"/>
       <propertyname="password"value="${jdbc.password}"/>
       <propertyname="maxActive"value="10"/>
       <propertyname="maxIdle"value="5"/>
    </bean>
 
    <!-- sqlSessinFactory -->
    <beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">
       <!-- 数据库连接池 -->
       <propertyname="dataSource"ref="dataSource"/>
       <!-- 加载mybatis的全局配置文件 -->
       <propertyname="configLocation"value="classpath:mybatis/SqlMapConfig.xml"/>
    </bean>
   
    <!-- 扫描手写sqlxml包,在该包下,应该写上相关接口
-->
    <beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">
       <!-- 扫描包路径,如果需要扫描多个包,中间使用半角逗号隔开 -->
    <propertyname="basePackage"value="com.clq.mapper"></property>
       <propertyname="sqlSessionFactoryBeanName"value="sqlSessionFactory"/>
    </bean>
 

applicationContext-service.xml :(加载ServiceImp)

    <!-- spring方式注解注入-->
   <context:annotation-config/>
   <!-- 扫描所有包 -->
    <context:component-scanbase-package="com.clq.service.impl"/>

 

 

applicationContext-transaction.xml : (数据库操作行为        --不做行为拦截,可能无法实现数据的插入,删除,修改)

<!-- 事务管理器 -->
<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <propertyname="dataSource"ref="dataSource"/>
</bean>
 
<!-- 通知 -->
<tx:adviceid="txAdvice"transaction-manager="transactionManager">
    <tx:attributes>
       <!-- 传播行为 -->
       <tx:methodname="save*"propagation="REQUIRED"/>
       <tx:methodname="delete*"propagation="REQUIRED"/>
       <tx:methodname="insert*"propagation="REQUIRED"/>
       <tx:methodname="update*"propagation="REQUIRED"/>
       <tx:methodname="find*"propagation="SUPPORTS"read-only="true"/>
       <tx:methodname="get*"propagation="SUPPORTS"read-only="true"/>
       <tx:methodname="select*"propagation="SUPPORTS"read-only="true"/>
    </tx:attributes>
</tx:advice>
<!-- aop -->
<aop:config>
    <aop:advisoradvice-ref="txAdvice"pointcut="execution(*com.clq.service.impl.*.*(..))"/>
</aop:config>
 

springmvc.xml :

<!-- 配置Handler扫描包 -->
<context:component-scanbase-package="com.oa.controller"/>

<!-- 访问静态页面
<mvc:resources location="/js/" mapping="/js/**"/>
-->

<!-- 配置   映射器和适配器-->

<mvc:annotation-drivenvalidator="validator"conversion-service="conversionservice"></mvc:annotation-driven>

<!-- 转换器 自定义参数绑定,会自动调用Date-->
<beanid="conversionservice"class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
       <!-- 转换器 -->
       <propertyname="converters">
           <list>
              <!-- 自定义的类 -->
              <beanclass="com.clq.controller.converter.ItemsDateConverter"/>
           </list>
       </property>
    </bean>
   
    <!-- 校验器   需要在实体类中对属性进行限制-->
    <beanid="validator"class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
       <!-- 校验器-->
       <propertyname="providerClass"value="org.hibernate.validator.HibernateValidator"/>
       <!-- 指定校验使用的资源文件,如果不指定则默认使用classpath下的ValidationMessages.properties
-->
       <propertyname="validationMessageSource"ref="messageSource"/>
    </bean>
    <!-- 校验错误信息配置文件 -->
    <beanid="messageSource"class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
       <!-- 资源文件名-->
       <propertyname="basenames">  
        <list>
           <!-- 错误信息存放的文件 CustomValidationMessages.properties -->
            <value>classpath:CustomValidationMessages</value>
        </list>  
       </property>
       <!-- 资源文件编码格式 -->
       <propertyname="fileEncodings"value="utf-8"/>
       <!-- 对资源文件内容缓存时间,单位秒 -->
       <propertyname="cacheSeconds"value="120"/>
    </bean>

<!-- 视图解析器   -->
    <beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <!-- 配置jsp路径的前缀 -->
       <propertyname="prefix"value="/WEB-INF/jsp/"/>
       <!-- 配置jsp路径的后缀 -->
       <propertyname="suffix"value=".jsp"/>
    </bean>

 

    <!-- 文件上传 -->
    <beanid="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
       <!-- 设置上传文件的最大尺寸为5MB -->
       <propertyname="maxUploadSize">
           <value>5242880</value>
       </property>
    </bean>

 

    <!--拦截器 -->
    <mvc:interceptors>
       <!--多个拦截器,顺序执行 -->
       <!-- 登录验证拦截器   -->
       <mvc:interceptor>
           <mvc:mappingpath="/**"/>
           <beanclass="com.clq.interceptor.LoginInterceptor"></bean>
       </mvc:interceptor>
    </mvc:interceptors>

 

 web.xml:

<!-- 加载spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- 读取多个 applicationContext.xml 配置文件-->
<param-value>/WEB-INF/classes/spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

  

  <!-- springmvc前端控制器 -->

  <servlet>

  <servlet-name>springmvc</servlet-name>

  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

  <init-param>

  <param-name>contextConfigLocation</param-name>

  <param-value>classpath:spring/springmvc.xml</param-value>

  </init-param>

  </servlet>

  

  <servlet-mapping>

  <servlet-name>springmvc</servlet-name>

  <url-pattern>*.action</url-pattern>

  </servlet-mapping>

  

  <!-- post乱码过虑器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

 

Validator 校验:

配置文件 :CustomValidationMessages.properties

items.name.length.error=请输入1到30位的商品名称

 

实例对象检验方式:

   @Size(min=1,max=30, message="{items.name.length.error}", groups={ValidGroup1.class})
    private String
name;

 

自定义日期转换器:

public
class
ItemsDateConverter implements Converter<String, Date>{
    public Date convert(Stringsource) {
       //  将日期串转换成日期类型.格式(yyyy-mm-ddhh:mm:ss)
       SimpleDateFormatsimpleDateFormat = new SimpleDateFormat("yyyy-MM-ddHH:mm:ss");
       try {
           //  转换成功
           if (source !=null)
              returnsimpleDateFormat.parse(source);
       }catch(ParseException e) {
           e.printStackTrace();
       }
      
       //  转换失败(参数绑定失败)
       return
null
;
    }
}
 

拦截器:

public
class
LoginInterceptor implements HandlerInterceptor{
 。。。。。。
    public
boolean
preHandle(HttpServletRequest request, HttpServletResponse response,
           Objectarg2) throwsException {
       Stringurl = request.getRequestURI();
       if (url.indexOf("UserLogin.action")> 0){// 表示url中包含UserLogin.action串
           return
true
;
       }
      
       HttpSessionsession = request.getSession();
       Useruser = (User) session.getAttribute("user");
       if (user !=null){
           return
true
;
       }
 
    request.getRequestDispatcher("index.jsp").forward(request,response);
       return
true
;
    }
}

 

Mapper.xml:

<!-- namespace:为接口路径 -->
<mappernamespace="com.clq.mapper.ItemsMapper">
 
    <!-- 定义sql片段 -->
    <sqlid="query_items_where">
       <!-- 查询条件是 -->
       <iftest="name!=null andname!=''">
           items.nameLIKE '%${name}%'
       </if>
    </sql>

    <selectid="findItemsList"parameterType="com.clq.po.Items"resultType="com.clq.po.Items">
       SELECTitems.* FROM items 
       <where>
           <includerefid="query_items_where"/>
       </where>
    </select>
   
    <!-- 更新数据库 如果传入空值则会报错,因此需要进行类型转换  jdbcType -->
    <updateid="updateItems"parameterType="Items">
       UPDATE items set
       name=#{name,jdbcType=VARCHAR},
       price=#{price,jdbcType=NUMERIC},
       detail=#{detail,jdbcType=VARCHAR},
       pic=#{pic,jdbcType=VARCHAR},
       createtime=#{createtime,jdbcType=DATE}
       WHEREid=#{id}
    </update>
</mapper>

 

实现接口:

public
interface
ItemsMapper {
    public List<Items>findItemsList(Items items);
    public
void
updateItems(Itemsitems);
}

 

 
懒加载方式获取数据
<mappernamespace="com.oa.mapper.UserMapper">
    <resultMaptype="User"id="UserAndDepartments">
       <idcolumn="user_id"property="user_id"/>
       <resultcolumn="depart_id"property="depart_id"/>
       <resultcolumn="password"property="password"/>
       <resultcolumn="name"property="name"/>
       <resultcolumn="gender"property="gender"/>
       <resultcolumn="phoneNumber"property="phoneNumber"/>
       <resultcolumn="email"property="email"/>
       <resultcolumn="description"property="description"/>
       <associationproperty="department"javaType="com.oa.po.Department"select="com.oa.mapper.DepartmentMapper.getDepartmentById"column="depart_id"/>
    </resultMap>
    <!-- 查询所有 -->
    <selectid="getAllUser"resultMap="UserAndDepartments">
       SELECT* FROM Oa_user
    </select>
   
    <!-- 保存 -->
    <insertid="saveUser"parameterType="User">
       <selectKeykeyProperty="user_id"order="BEFORE"resultType="java.lang.Integer">
           selectuser_sequence_tab.nextval as user_id from dual
       </selectKey>
      
       insertinto Oa_user(user_id, depart_id, loginName, password, name, phoneNumber, email,description, gender)
       <iftest="depart_id ==0">
           values(#{user_id,jdbcType=NUMERIC}, null, #{loginName,jdbcType=VARCHAR},#{password,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR},#{phoneNumber,jdbcType=VARCHAR}, #{email, jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, #{gender,jdbcType=VARCHAR})
       </if>
       <iftest="depart_id !=0">
           values(#{user_id,jdbcType=NUMERIC}, #{depart_id, jdbcType=NUMERIC},#{loginName,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR},#{name,jdbcType=VARCHAR}, #{phoneNumber,jdbcType=VARCHAR},#{email,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR},#{gender,jdbcType=VARCHAR})
       </if>
    </insert>
   
    <!-- 更新 -->
    <updateid="updateUser"parameterType="User">
       updateOa_user set
       <iftest="depart_id !=0">
           depart_id=#{depart_id,jdbcType=NUMERIC},
       </if>
      
       loginName=#{loginName,jdbcType=VARCHAR},
       name=#{name,jdbcType=VARCHAR},
       gender=#{gender,jdbcType=VARCHAR},
       phoneNumber=#{phoneNumber,jdbcType=VARCHAR},
       email=#{email,jdbcType=VARCHAR},
       description=#{description,jdbcType=VARCHAR}
       WHEREuser_id=#{user_id}
    </update>
   
    <!-- 删除 -->
    <deleteid="deleteUserById"parameterType="int">
       deletefrom Oa_user where user_id=#{id, jdbcType=NUMERIC}
    </delete>
 
</mapper>

 

<!-- 分页查询  -->
<select id="getTopicByPagebean" parameterType="PageCase" resultMap="TopicAll">
SELECT * FROM ( SELECT t.*, rownum rn FROM (
SELECT * FROM Oa_topic t WHERE t.forum_id=#{id}  ORDER BY (CASE t.type WHEN 2 THEN 2 ELSE 0 END) DESC, t.lastUpdateTime DESC
) t WHERE rownum < #{lastLine}) WHERE rn > #{firstLine}
</select>

@Controller
//定义根路径。最终访问路径为根路径+子路径
@RequestMapping("/items")
public
class
ItemsController {
    //@Autowired
    @Resource private ItemsServiceitemsService;
   
    //  itemstypes表示最终自动将方法返回值放在request的key
    @ModelAttribute("itemstypes")
    public Map<String,String> getItemsType(){
       Map<String,String> itemsType = new HashMap<String, String>();
       itemsType.put("101",
"天堂");
       itemsType.put("102",
"地狱");
      
       return itemsType;
    }
   
    //@ModelAttribute  可以用于数据回显   @RequestMapping("queryItems.action")
    public StringqueryItems(HttpServletRequest request,@ModelAttribute("items") Items items){
       List<Items>itemsList = itemsService.findItemsList(items);
       request.setAttribute("itemsList",itemsList);
       //  返回视图
       return"/WEB-INF/jsp/items/itemsList.jsp";
    }
   
     // 传进来的参数要与页面传进来的key相同,或者用@Param()
    @RequestMapping("editItems.action")
    public ModelAndVieweditItems(Integer id){   
       Itemsitems = newItems();
       items= itemsService.findItemsById(id);
       ModelAndViewmodelAndView = newModelAndView();
       modelAndView.addObject("items",items);
       modelAndView.setViewName("/WEB-INF/jsp/items/editItems.jsp");
       return modelAndView;
    }
 
    /** *
     * 在需要检验的pojo前面添加@Validated
    *@param bindingResult:接受检验出错的信息(和@Validated是配对出现的,且位置顺序固定)
     * @return
     * @throws IOException
     * @throws IllegalStateException
     * @ModelAttribute("items") 用于数据回显
     */
    @RequestMapping("editItemsSubmit.action")
    public StringeditItemsSubmit(Model model, HttpServletRequest request,
           @ModelAttribute("items")@Validated(value={ValidGroup1.class}) Items items,BindingResult
bindingResult,
           MultipartFileitems_pic) throwsIllegalStateException, IOException{
       /*  页面中传进来的相应的参数名与items对象中的属性名一致
        * 则会将数据保存到items中
        * */
      
       //  获取检验错误信息
       if(bindingResult.hasErrors()){
           //  输出错误信息
           List<ObjectError>allErrors = bindingResult.getAllErrors();
           for (ObjectErrorobjectError : allErrors){
              //  输出错误信息 objectError.getDefaultMessage()
              System.out.println(newString(objectError.getDefaultMessage().getBytes("ISO-8859-1"),"utf-8"));
           }
          
           request.setAttribute("allErrors",allErrors);
          
           /*
            * <c:forEach items="${allErrors}"var="allErrors">
            *  ${allErrors.defaultMessage}
            * </c:forEach>
            *
            * */
           return"/WEB-INF/jsp/items/editItems.jsp";
       }
      
       //  上传图片
       //  获取图片原始名称
       StringoriginalFilename = items_pic.getOriginalFilename();
       if (items_pic !=null &&originalFilename !=null && originalFilename.length()>0){
           ServletContextservletContext = request.getSession().getServletContext();
           StringrealPath = servletContext.getRealPath("/image");
 
           //  新建随机数文件名 uuid+源文件的扩展名
           StringnewFileName = UUID.randomUUID()+originalFilename.substring(originalFilename.lastIndexOf("."));
          
           //  新的图片
           FilenewFile = newFile(newFile(realPath), newFileName);
           if(!newFile.getParentFile().exists()){
              newFile.getParentFile().mkdirs();
           }
          
           // 将图片写入磁盘(上传图片)
           items_pic.transferTo(newFile);
          
           //  将图片文件名放入属性
           items.setPic(newFileName);
          
       }
      
        itemsService.updateItems(items);
       return"redirect:/items/queryItems.action";
      
       //  转向
       //return "forward:queryItems.action";
    }
   
    //  批量删除
    @RequestMapping("deleteItems.action")
    public StringdeleteItems(Integer[] item_id){
       System.out.println("勾选长度="+item_id.length);
       //  根据id批量删除
      
       return"/WEB-INF/jsp/success.jsp";
    }
 
    /**
     * 请求json,输出json
     * @RequestBody Items items:将json对象转换成items对象(属性名必须一样)
     * @ResponseBody Items :将Items对象转换成json输出
     * @paramitems
     * @return
     */
    @RequestMapping("requestJson.action")
    public
@ResponseBody ItemsrequestJson(@RequestBodyItems items){
       return items;
    }
   
    //请求key/value,输出是json
    @RequestMapping("responseJson.action")
    public
@ResponseBody ItemsresponseJson(Items items){
       return items;
    }
   
}

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: