Spring MVC+MyBatics+Spring集成小例证
Spring MVC+MyBatics+Spring集成小例子
散仙,在前面的博客中写过一篇,Spirng MVC+Hibernate+Spring集成小例子,鉴于各个公司在持久层多样化的选择,那么本篇呢,散仙来简单介绍下Spring MVC+MyBatics+Spring三者之间的整合,因为这也算目前大多数公司,使用的比较多的一种组合,当然也有基于SSH的架构Spring+Struts2+Hibernate,抛开这两种组合的优劣点,今天我们主要介绍的是怎么组合使用,所以关于框架本身的优劣点,就不在这里加以评论了。
散仙的开发环境如下:
项目背景概况,此项目为了模拟开发中的实际场景,使用了2张表,具有主外键关系,一个是主表Person,另一个从表Country,比上一次的单表的增删改查骚加复杂,实为新手练手的一个好例子。
下面是功能描述:
关于在IDE中,怎么让MyBatics的xml文件字段提示,可以参考散仙的上篇文章配置Mybatics的mapper文件提示
实体类person的映射配置
实体类country的映射配置
Mybatics通用DAO的写法
Spirng注解控制器类
Spring的servlet的xml的配置:
散仙,在前面的博客中写过一篇,Spirng MVC+Hibernate+Spring集成小例子,鉴于各个公司在持久层多样化的选择,那么本篇呢,散仙来简单介绍下Spring MVC+MyBatics+Spring三者之间的整合,因为这也算目前大多数公司,使用的比较多的一种组合,当然也有基于SSH的架构Spring+Struts2+Hibernate,抛开这两种组合的优劣点,今天我们主要介绍的是怎么组合使用,所以关于框架本身的优劣点,就不在这里加以评论了。
散仙的开发环境如下:
名称 | 描述 |
Web容器 | Tomcat7.0 |
IDE工具 | Myeclipse10.1 |
平台 | Windows |
语言 | JAVA |
JDK | 1.7 |
数据库 | MySQL5.1 |
Sping | 3.2(非Myeclipse自带,需要下载) |
MyBatics | 3.2(需下载) |
Jquery | 1.7.1 |
人力道具 | 屌丝软件工程师一名 |
项目背景概况,此项目为了模拟开发中的实际场景,使用了2张表,具有主外键关系,一个是主表Person,另一个从表Country,比上一次的单表的增删改查骚加复杂,实为新手练手的一个好例子。
下面是功能描述:
功能 | 描述 |
查询功能 | 默认情况下显示所有Person信息,需含有外键表的Country的name信息 |
增加功能 | 在首页上点击添加信息,跳转页面,Country信息需用下拉框显示,后台添加成功后,需要用以ajax的形式,返回响应,提示添加成功 |
修改功能 | 可以对对应的Person信息进行修改,注意下拉框与修改的Person的对应 |
删除功能 | 可以在首页上对对应的Person信息进行删除 |
关于在IDE中,怎么让MyBatics的xml文件字段提示,可以参考散仙的上篇文章配置Mybatics的mapper文件提示
实体类person的映射配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" > <mapper namespace="dao.PersonMapper"> <!-- 返回关联映射 --> <resultMap type="Person" id="mylist" > <id property="id" column="id"/> <result property="name" column="name"/> <result property="age" column="age"/> <!-- 支持嵌套类 --> <association property="country" javaType="Country" column="cid"> <id property="id" column="cid"/> <result property="cname" column="cname"/> </association> </resultMap> <!-- 查询所有 --> <select id="getAll" resultType="Person" resultMap="mylist"> select p.id as id,p.`name` as name ,p.age as age , c.cname as cname ,c.id as cid from person p,country c where p.cid=c.id order by id </select> <!-- 保存 --> <insert id="save"> insert into person(name,age,cid) values(#{name},#{age},#{country.id}) </insert> <!-- 删除 --> <delete id="delete"> delete from person where id=#{id} </delete> <!-- 更新的信息 --> <update id="update"> update person set name=#{name},age=#{age},cid=#{country.id} where id=#{id} </update> <!-- 获取单个实体类的信息 --> <select id="get" resultType="Person" resultMap="mylist" > select *from person where id=#{id} </select> <!-- 统计分页个数 <select id="count" resultType="int"> select count(*) from classes </select> --> <!-- Oracle查询分页实体类集合 <select id="pageList" parameterType="java.util.Map" resultType="Classes"> select *from (select rownum a, classes.* from classes ) c where c.a between #{offset} and #{pageSize} </select> --> <!-- MySQL 分页 <select id="pageList" parameterType="java.util.Map" resultType="Classes"> select *from classes order by id limit #{offset},#{pageSize} </select> --> <!-- SQL Server分页 注意SQL Server 分页不支持?占位符所以得用 $符进行替代换位 <select id="pageList" parameterType="java.util.Map" resultType="Classes"> select top ${offset} * from Classes where id not in(select top ${pageSize} id from Classes) </select> --> </mapper>
实体类country的映射配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" > <mapper namespace="dao.CountryMapper"> <!-- 返回关联映射 --> <resultMap type="Country" id="mylist" > <id property="id" column="id"/> <result property="cname" column="cname"/><!-- 与别名对应 --> </resultMap> <!-- 查询所有 --> <select id="getAll" resultType="Country" resultMap="mylist"> select id,cname from country </select> <!-- 统计分页个数 <select id="count" resultType="int"> select count(*) from classes </select> --> <!-- Oracle查询分页实体类集合 <select id="pageList" parameterType="java.util.Map" resultType="Classes"> select *from (select rownum a, classes.* from classes ) c where c.a between #{offset} and #{pageSize} </select> --> <!-- MySQL 分页 <select id="pageList" parameterType="java.util.Map" resultType="Classes"> select *from classes order by id limit #{offset},#{pageSize} </select> --> <!-- SQL Server分页 注意SQL Server 分页不支持?占位符所以得用 $符进行替代换位 <select id="pageList" parameterType="java.util.Map" resultType="Classes"> select top ${offset} * from Classes where id not in(select top ${pageSize} id from Classes) </select> --> </mapper>
Mybatics通用DAO的写法
package commons; import java.io.Serializable; import java.util.List; import org.mybatis.spring.support.SqlSessionDaoSupport; /** * 操作mybatis的工具接口 * * */ public class MyBatisDao extends SqlSessionDaoSupport { /** * @param key 命名空间+id值 * @param o 需要进行保存的实体类 * 保存的方法 * */ public void save(String key,Object o){ this.getSqlSession().insert(key, o); } /** * 删除的方法 * */ public void delete(String key,Object o){ this.getSqlSession().delete(key, o); } /** * 修改的方法 * */ public void update(String key,Object o){ this.getSqlSession().update(key, o); } /** * 根据ID 查询单个实体类 * */ public <E> E get(String key,Serializable id){ return this.getSqlSession().selectOne(key,id); } /*** * 查询实体类集合 * * */ public <E> List<E> getAll(String key){ return this.getSqlSession().selectList(key); } /*** * 查询实体类的总个数 * */ public int count(String key){ return this.getSqlSession().selectOne(key); } /** * 查询总集合数 * * */ public <E> List<E> pageList(String key,Object o){ return this.getSqlSession().selectList(key,o); } }
Spirng注解控制器类
package controller; import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import com.google.gson.Gson; import commons.MyBatisDao; import dao.CountryDao; import dao.PersonDao; import entity.Country; import entity.Person; /** * @author 秦东亮 * 技术群:324714439 * * * */ @Controller public class PersonController { @Resource(name="personDao") private PersonDao personDao; public PersonDao getPersonDao() { return personDao; } public void setPersonDao(PersonDao personDao) { this.personDao = personDao; } @Resource(name="countryDao") private CountryDao countryDao; public CountryDao getCountryDao() { return countryDao; } @Resource(name="dao") private MyBatisDao dao; public MyBatisDao getDao() { return dao; } public void setDao(MyBatisDao dao) { this.dao = dao; } public void setCountryDao(CountryDao countryDao) { this.countryDao = countryDao; } /** * 输出所有的用户信息 * * **/ @RequestMapping( value="/showAll") public String showAll(HttpServletRequest request)throws Exception{ //MyBatisDao dao=new MyBatisDao(); // /request.setAttribute("plist", personDao.find(" from Person ")); request.setAttribute("plist",dao.getAll("dao.PersonMapper.getAll")); return "showAll"; } /** * 输出所有的国家信息 * * **/ @RequestMapping( value="/add") public String add(HttpServletRequest request)throws Exception{ //request.setAttribute("clist", countryDao.find(" from Country ")); request.setAttribute("clist", dao.getAll("dao.CountryMapper.getAll")); return "adda"; } /** * 删除的方法 * */ @RequestMapping( value="/delete") public String delete(HttpServletRequest request)throws Exception{ int id=Integer.parseInt(request.getParameter("id")); //personDao.delete(personDao.get(id)); dao.delete("dao.PersonMapper.delete", id); return "redirect:/showAll"; } /** * 删除的方法 * request域的写法 * */ @RequestMapping( value="/update") public String update(HttpServletRequest request)throws Exception{ int id=Integer.parseInt(request.getParameter("id")); //request.setAttribute("p", personDao.get(id)); request.setAttribute("p", dao.get("dao.PersonMapper.get", id)); request.setAttribute("clist", dao.getAll("dao.CountryMapper.getAll")); //request.setAttribute("clist", countryDao.find(" from Country ")); return "update"; } /** * 更新的操作 * 封装成实体类的写法 * */ @RequestMapping( value="/sup",method=RequestMethod.POST) public String sup(Person person,HttpServletRequest request){ try{ //personDao.update(person); dao.update("dao.PersonMapper.update", person); // System.out.println("111"); // System.out.println(person.getName()); //System.out.println(person.getCountry().getId()); //System.out.println(request.getParameter("name")); }catch (Exception e) { e.printStackTrace(); } return "redirect:/showAll"; } /** * 保存一条数据 * 没有使用实体类自动封装的功能 * * **/ @RequestMapping( value="/save",method=RequestMethod.POST) public void save(HttpServletRequest request,HttpServletResponse response)throws Exception{ // personDao.save(person);//保存成功 Person person=new Person(); person.setAge(Integer.parseInt(request.getParameter("age"))); person.setName(request.getParameter("name")); Country c=new Country(); c.setId(Integer.parseInt(request.getParameter("cid"))); person.setCountry(c); personDao.save(person); //System.out.println("cid : "+request.getParameter("cid")); Gson g=new Gson(); // List<String> list=new ArrayList<String>(); // list.add("A"); // list.add("B"); // list.add("C"); // list.add("D"); response.setCharacterEncoding("UTF-8"); response.setContentType("application/json;charset=utf-8"); //response.getWriter().write(g.toJson(list)); response.getWriter().write(g.toJson("添加成功!")); // response.getWriter().write("1"); } /** * 保存一条数据 * 基于ajax的json自动封装的 * 实体类 * 注意有嵌套类时的 * 写法"county.id" * * **/ @RequestMapping( value="/savetwo",method=RequestMethod.POST) public void savetwo(Person person,HttpServletRequest request,HttpServletResponse response)throws Exception{ //personDao.save(person);//保存成功 //System.out.println(person.getName()); dao.save("dao.PersonMapper.save", person); // System.out.println(person); //System.out.println("cid : "+request.getParameter("cid")); Gson g=new Gson(); // List<String> list=new ArrayList<String>(); // list.add("A"); // list.add("B"); // list.add("C"); // list.add("D"); response.setCharacterEncoding("UTF-8"); response.setContentType("application/json;charset=utf-8"); //response.getWriter().write(g.toJson(list)); response.getWriter().write(g.toJson("添加成功!")); // response.getWriter().write("1"); } }
Spring的servlet的xml的配置:
<?xml version="1.0" encoding="UTF-8"?> <beans default-autowire="byName" xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd "> <!-- 注解扫描包 --> <context:component-scan base-package="controller" /> <!-- 开启注解 --> <mvc:annotation-driven /> <!-- <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8</value> <value>text/plain;charset=UTF-8</value> </list> </property> </bean> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter" /> </list> </property> </bean> --> <!-- <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="mediaTypes"> <map> <entry key="atom" value="application/atom+xml"/> <entry key="html" value="text/html"/> <entry key="json" value="application/json"/> </map> </property> <property name="viewResolvers"> <list> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </list> </property> <property name="defaultViews"> <list> <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /> </list> </property> </bean> --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 处理器映射 --> <!-- <bean class="com.qin.annocontroller.HelowWorld" ></bean> --> <!-- 注解使用的 HandlerMapping --> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean> <!-- 注解使用的 HandlerAdapter --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <!-- 支持json返回 --> </bean> <!-- 配置控制器里的注入 --> <bean id="dao" class="commons.MyBatisDao"> <property name="sqlSessionFactory" ref="sqlSessionFactoryBean"></property> </bean> <!-- 声明DispatcherServlet不要拦截下面声明的目录 --> <mvc:resources location="/jquery/" mapping="/jquery/**" /> <!-- <mvc:resources location="/jsp/" mapping="/jsp/**" /> --> </beans>