SpringMvc+Mybatis简单测试

来源:互联网 发布:美工考核指标 编辑:程序博客网 时间:2024/05/23 05:08

博客测试:(第一次写博客)

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=请输入130位的商品名称

 

实例对象检验方式:

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

    private String name;

 

自定义日期转换器:

public classItemsDateConverter 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 classLoginInterceptor implements HandlerInterceptor{

 。。。。。。

    public booleanpreHandle(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 interfaceItemsMapper {

    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 &lt; #{lastLine}) WHERE rn &gt; #{firstLine}
</select>



@Controller

//定义根路径。最终访问路径为根路径+子路径

@RequestMapping("/items")

public classItemsController {

    //@Autowired

    @Resource private ItemsServiceitemsService;

   

    //  itemstypes表示最终自动将方法返回值放在requestkey

    @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;

    }

   

}

 

 

 

 

 

 

 

 


0 0