Mybatis 与 spring mvc
本文是用来小结一下自己mybatis 和spring mvc 学习过程。 在写的过程中发现 http://www.phperz.com/article/15/0127/48684.html 这篇文章里面的Mybatis应用学习讲的不错,所以记录一下网址,如果自己写的太烂可以看这个。
在写的过程中发现http://www.cnblogs.com/rollenholt/p/3365866.html 写的也很好,看过很多这个博主的文章了,和他年纪差不多,真是难以望其项背啊...
1.使用spring mvc 与 Mybatis 组合的架构 首先需要导入相应的jar包
2.配置文件方面
spring mvc 需要 applicationContext.xml xxxx-servlet.xml
Mybatis 需要在applicationContext.xml 中的一些配置 以及对应的xxxxMapper.xml
一个简单的applicationContext.xml如下所示
- <?xml version="1.0" encoding="UTF-8" ?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.2.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
- <!-- 扫描类包,将标注Spring注解的类自动转化Bean,同时完成Bean的注入 -->
- <context:component-scan base-package="novel.hr.user.Dao"/>
- <context:component-scan base-package="novel.hr.user.service"/>
- <context:component-scan base-package="novel.hr.user.control"/>
- <!--扫描配置文件,读取配置文件中的信息 例如 ${jdbc.url} -->
- <context:property-placeholder location="/WEB-INF/classes/config/jdbcConfig.properties"/>
- <!--数据源,配置的比较简单 -->
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close">
- <property name="driverClassName" value="${jdbc.driver}" />
- <property name="url" value="${jdbc.url}" />
- <property name="username" value="${jdbc.username}" />
- <property name="password" value="${jdbc.password}" />
- </bean>
- <!--Mybatis的SessionFactory 在其中指定了数据源以及Mapper,xml配置文件的位置-->
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="mapperLocations"
- value="/WEB-INF/classes/config/mybatismapper/*Mapper.xml" />
- </bean>
- <!--MapperScanner,通过配置Scanner 和需要扫描的包,就可以将包中定义的mapper接口类注入到需要使用的地方,而不必手动实例化-->
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <property name="basePackage" value="novel.hr.user.Dao" />
- </bean>
- <!-- ====事务相关控制===== 为事务管理器添加所要管理的数据源 -->
- <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource"></property>
- </bean>
- <!-- advice 指定哪些方法需要事务管理 以及相应的配置-->
- <tx:advice id="userTxAdvice" transaction-manager="transactionManager">
- <tx:attributes>
- <tx:method name="delete*" propagation="REQUIRED" read-only="false"
- rollback-for="java.lang.Exception" no-rollback-for="java.lang.RuntimeException"/>
- <tx:method name="insert*" propagation="REQUIRED" read-only="false"
- rollback-for="java.lang.RuntimeException" />
- <tx:method name="update*" propagation="REQUIRED" read-only="false"
- rollback-for="java.lang.Exception" />
- <tx:method name="find*" propagation="SUPPORTS"/>
- <tx:method name="get*" propagation="SUPPORTS"/>
- <tx:method name="select*" propagation="SUPPORTS"/>
- </tx:attributes>
- </tx:advice>
- <!-- 定义aop的切入点 切入点按照expression来定义-->
- <aop:config>
- <aop:pointcut id="pc" expression="execution( * novelhr.user.service.*.*(..))" />
- <aop:advisor pointcut-ref="pc" advice-ref="userTxAdvice" />
- </aop:config>
- <!--视图管理器 使spring mvc 返回string后自动加 前后缀,然后返回最终的视图 -->
- <bean
- class="org.springframework.web.servlet.view.InternalResourceViewResolver"
- p:viewClass="org.springframework.web.servlet.view.JstlView"
- p:prefix="/WEB-INF/view/"
- p:suffix=".jsp"
- />
- </beans>
配置了applicationContext之后,还需要配置xxx-servlet.xml 这个文件中的内容可以覆盖掉application中的配置。由于需要配置的基本在applicationContext中配置过了,所以这个的具体内容略过。
接下来的mapper的配置
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <!-- namespace 的值是接口的位置 -->
- <mapper namespace="novel.hr.user.Dao.UserManageMapper">
- <!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复
- 使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
- resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回
- User类就是users表所对应的实体类
- -->
- <!--
- 根据id查询得到一个user对象
- -->
- <select id="getUserCheck" parameterType="novel.hr.user.domain.Employee"
- resultType="novel.hr.user.domain.Employee">
- select * from Employee where EmployeeNum=#{employeeNum} and password=#{password}
- </select>
- <!-- <update id="updateUser" parameterType="User" >
- update user set userName=#{userName},userAge=#{userAge},userAddress=#{userAddress} where id=#{id}
- </update>
- -->
- <!--seGeneratedKeys设置为"true"表明要MyBatis获取由数据库自动生成的主键;
- keyProperty="id"指定把获取到的主键值注入到Student的id属性-->
- <!-- <insert id="addUser" parameterType="User"
- useGeneratedKeys="true" keyProperty="id">
- insert into user(userName,userAge,userAddress) values(#{userName},#{userAge},#{userAddress})
- </insert>
- <delete id="deleteUser" parameterType="int">
- delete from user where id=#{id}
- </delete>
- -->
- <!-- User 联合文章进行查询 方法之一的配置 (多对一的方式)
- <resultMap id="resultUserArticleList" type="Article">
- <id property="id" column="aid" />
- <result property="title" column="title" />
- <result property="content" column="content" />
- <association property="user" javaType="User">
- <id property="id" column="id" />
- <result property="userName" column="userName" />
- <result property="userAddress" column="userAddress" />
- </association>
- </resultMap>
- <select id="getUserArticles" parameterType="int" resultMap="resultUserArticleList">
- select user.id,user.userName,user.userAddress,article.id aid,article.title,article.content from user,article
- where user.id=article.userid and user.id=#{id}
- </select>-->
- <!-- article 类中有一个user类的实例。也就是表的外键关系。有这个也可以看出一对一与一对多的方法,换成List就好
- <resultMap id="resultUserArticleList" type="Article">
- <id property="id" column="aid" />
- <result property="title" column="title" />
- <result property="content" column="content" />
- <association property="user" javaType="User">
- <id property="id" column="id" />
- <result property="userName" column="userName" />
- <result property="userAddress" column="userAddress" />
- </association>
- </resultMap>
- <select id="getUserArticles" parameterType="int" resultMap="resultUserArticleList">
- select user.id,user.userName,user.userAddress,article.id aid,article.title,article.content from user,article
- where user.id=article.userid and user.id=#{id}
- </select>
- -->
- <!-- 一对多的
- <resultMap type="User" id="resultListUser">
- <id column="id" property="id" />
- <result column="userName" property="userName" />
- <result column="userAge" property="userAge" />
- <result column="userAddress" property="userAddress" />
- </resultMap>
- <resultMap id="resultUserArticleList-2" type="Article">
- <id property="id" column="aid" />
- <result property="title" column="title" />
- <result property="content" column="content" />
- <association property="user" javaType="User" resultMap="resultListUser" />
- </resultMap>
- <select id="getUserArticles" parameterType="int" resultMap="resultUserArticleList">
- select user.id,user.userName,user.userAddress,article.id aid,article.title,article.content from user,article
- where user.id=article.userid and user.id=#{id}
- </select>
- -->
- </mapper>
动态SQL的没用到,但是觉得肯定会有用,所以直接粘贴过来
- mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句
- mybatis 的动态sql语句是基于OGNL表达式的。可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:
- 1. if 语句 (简单的条件判断)
- 2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似.
- 3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
- 4. where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)
- 5. set (主要用于更新时)
- 6. foreach (在实现 mybatis in 语句查询时特别有用)
- 下面分别介绍这几种处理方式
- 1. mybaits if 语句处理
- <select id="dynamicIfTest" parameterType="Blog" resultType="Blog">
- select * from t_blog where 1 = 1
- <if test="title != null">
- and title = #{title}
- </if>
- <if test="content != null">
- and content = #{content}
- </if>
- <if test="owner != null">
- and owner = #{owner}
- </if>
- </select>
- 这条语句的意思非常简单,如果你提供了title参数,那么就要满足title=#{title},同样如果你提供了Content和Owner的时候, 它们也需要满足相应的条件,之后就是返回满足这些条件的所有Blog,这是非常有用的一个功能,以往我们使用其他类型框架或者直接使用JDBC的时候, 如果我们要达到同样的选择效果的时候,我们就需要拼SQL语句,这是极其麻烦的,比起来,上述的动态SQL就要简单多了
- 2.2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似
- <select id="dynamicChooseTest" parameterType="Blog" resultType="Blog">
- select * from t_blog where 1 = 1
- <choose>
- <when test="title != null">
- and title = #{title}
- </when>
- <when test="content != null">
- and content = #{content}
- </when>
- <otherwise>
- and owner = "owner1"
- </otherwise>
- </choose>
- </select>
- when元素表示当when中的条件满足的时候就输出其中的内容,跟JAVA中的switch效果差不多的是按照条件的顺序,当when中有条件满足的时 候,就会跳出choose,即所有的when和otherwise条件中,只有一个会输出,当所有的我很条件都不满足的时候就输出otherwise中的 内容。所以上述语句的意思非常简单, 当title!=null的时候就输出and titlte = #{title},不再往下判断条件,当title为空且content!=null的时候就输出and content = #{content},当所有条件都不满足的时候就输出otherwise中的内容。
- 3.trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
- <select id="dynamicTrimTest" parameterType="Blog" resultType="Blog">
- select * from t_blog
- <trim prefix="where" prefixOverrides="and |or">
- <if test="title != null">
- title = #{title}
- </if>
- <if test="content != null">
- and content = #{content}
- </if>
- <if test="owner != null">
- or owner = #{owner}
- </if>
- </trim>
- </select>
- trim元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是prefix和suffix;可以把包含内容 的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是prefixOverrides和suffixOverrides;正因为 trim有这样的功能,所以我们也可以非常简单的利用trim来代替where元素的功能
- 4. where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or 条件
- <select id="dynamicWhereTest" parameterType="Blog" resultType="Blog">
- select * from t_blog
- <where>
- <if test="title != null">
- title = #{title}
- </if>
- <if test="content != null">
- and content = #{content}
- </if>
- <if test="owner != null">
- and owner = #{owner}
- </if>
- </where>
- </select>
- where元素的作用是会在写入where元素的地方输出一个where,另外一个好处是你不需要考虑where元素里面的条件输出是什么样子 的,MyBatis会智能的帮你处理,如果所有的条件都不满足那么MyBatis就会查出所有的记录,如果输出后是and 开头的,MyBatis会把第一个and忽略,当然如果是or开头的,MyBatis也会把它忽略;此外,在where元素中你不需要考虑空格的问 题,MyBatis会智能的帮你加上。像上述例子中,如果title=null, 而content != null,那么输出的整个语句会是select * from t_blog where content = #{content},而不是select * from t_blog where and content = #{content},因为MyBatis会智能的把首个and 或 or 给忽略。
- 5.set (主要用于更新时)
- <update id="dynamicSetTest" parameterType="Blog">
- update t_blog
- <set>
- <if test="title != null">
- title = #{title},
- </if>
- <if test="content != null">
- content = #{content},
- </if>
- <if test="owner != null">
- owner = #{owner}
- </if>
- </set>
- where id = #{id}
- </update>
- set元素主要是用在更新操作的时候,它的主要功能和where元素其实是差不多的,主要是在包含的语句前输出一个set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果set包含的内容为空的话则会出错。有了set元素我们就可以动态的更新那些修改了的字段
- 6. foreach (在实现 mybatis in 语句查询时特别有用)
- foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
- 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
- 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
- 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面 也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的 map里面的key
- 1.1.单参数List的类型
- <select id="dynamicForeachTest" resultType="Blog">
- select * from t_blog where id in
- <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
- #{item}
- </foreach>
- </select>
- 上述collection的值为list,对应的Mapper是这样的
- public List<Blog> dynamicForeachTest(List<Integer> ids);
- 测试代码
- @Test
- public void dynamicForeachTest() {
- SqlSession session = Util.getSqlSessionFactory().openSession();
- BlogMapper blogMapper = session.getMapper(BlogMapper.class);
- List<Integer> ids = new ArrayList<Integer>();
- ids.add(1);
- ids.add(3);
- ids.add(6);
- List<Blog> blogs = blogMapper.dynamicForeachTest(ids);
- for (Blog blog : blogs)
- System.out.println(blog);
- session.close();
- }
- 2.数组类型的参数
- <select id="dynamicForeach2Test" resultType="Blog">
- select * from t_blog where id in
- <foreach collection="array" index="index" item="item" open="(" separator="," close=")">
- #{item}
- </foreach>
- </select>
- 对应mapper
- public List<Blog> dynamicForeach2Test(int[] ids);
- 3. Map 类型的参数
- <select id="dynamicForeach3Test" resultType="Blog">
- select * from t_blog where title like "%"#{title}"%" and id in
- <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
- #{item}
- </foreach>
- </select>
- mapper 应该是这样的接口:
- public List<Blog> dynamicForeach3Test(Map<String, Object> params);
- 通过以上方法,就能完成一般的mybatis 的 动态SQL 语句.最常用的就是 if where foreach这几个,一定要重点掌握.
到此配置文件结束。在使用的时候代码如下
Dao接口
- package novel.hr.user.Dao;
- public interface UserManagerDao {
- Object getUserCheck(int EmployeeNum , String password);
- }
Mapper接口
- package novel.hr.user.Dao;
- import novel.hr.user.domain.Employee;
- public interface UserManageMapper {
- Employee getUserCheck(Employee param);
- }
dao实现类
- @Repository
- public class UserManageDaoImpl implements UserManagerDao{
- @Autowired
- private UserManageMapper umm;
- @Override
- public Employee getUserCheck(int EmployeeNum , String password){
- Employee param=new Employee();
- param.setEmployeeNum(EmployeeNum);
- param.setPassWord(password);
- return umm.getUserCheck(param);
- }
- }
简单一点的可以直接用service层调用mapper接口,省略dao,因为mapper其实已经起到了dao的作用。
相对于学习Hibernate的过程,我觉得Mybatis更加简单易用一些。
如果有新的再加
Mybatis 与 spring mvc的更多相关文章
- OSGI企业应用开发(十五)基于Spring、Mybatis、Spring MVC实现一个登录应用
前面文章中,我们已经完成了OSGI应用中Spring.Mybatis.Spring MVC的整合,本篇文章我们就在这个基础上来完成一个简单的登录应用,其中用户名和密码需要从数据库中查询. 前面文章中, ...
- OSGI企业应用开发(十四)整合Spring、Mybatis、Spring MVC
作为一个企业级的Web应用,MVC框架是必不可少的.Spring MVC目前使用也比较广泛,本文就来介绍一下如何在OSGI应用中实现Spring.Mybatis.Spring MVC框架的整合,其中S ...
- Java基础-SSM之Spring和Mybatis以及Spring MVC整合案例
Java基础-SSM之Spring和Mybatis以及Spring MVC整合案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 能看到这篇文章的小伙伴,详细你已经有一定的Java ...
- MyBatis整合Spring MVC
前面几篇文章已经讲到了mybatis与spring 的集成.目前主流的Web MVC框架,除了Struts这个主力外,还有Spring MVC,主要是由于 Spring MVC 配置比较简单,使用起来 ...
- mybatis :与Spring MVC 的集成
用mybatis与Spring mvc 的方式集成起来,源码在本文结尾处下载.主要有以下几个方面的配置1. web.xml 配置 spring dispatchservlet ,比如为:mvc-dis ...
- MyBatis整合Spring MVC(易百教程)
MyBatis是ibatis的升级版,作为hibernate的老对手,它是一个可以自定义SQL.存储过程和高级映射的持久层框架.与Hibernate 的主要区别就是 Mybatis 是半自动化的,而 ...
- Java框架搭建-Maven、Mybatis、Spring MVC整合搭建
1. 下载eclipse 到网站下载 http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/marsr 选择 ...
- 搭建Spring + SpringMVC + Mybatis框架之三(整合Spring、Mybatis和Spring MVC)
整合Spring和SpringMVC 之前已经整合了spring和mybatis,现在在此基础上整合SSM. 项目目录: 思路:SpringMVC的配置文件独立,然后在web.xml中配置整合. (1 ...
- mybatis和spring mvc整合
1.环境 a. jar包 (mybatis+spring mvc运行包+两者整合包mybatis-spring.jar) b.工程目录 c. 配置文件 mybatis:SqlMapConfig.xm ...
随机推荐
- Android LocalBroadcastManager 与 BroadcastReceiver
Android中BroadcastReceiver主要用途有 发送通知,更新UI或者数据,应用程序间相互通信,监听系统状态(比如开机,网络等) Android中发送广播的方式: 普通广播:无论优先级大 ...
- [知识点]A*搜索(启发式搜索)
// 此博文为迁移而来,写于2015年4月4日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vwud.html 1.前言 ...
- 【POJ】2151 Check the difficulty of problems
http://poj.org/problem?id=2151 题意:T个队伍M条题目,给出每个队伍i的每题能ac的概率p[i][j],求所有队伍至少A掉1题且冠军至少A掉N题的概率(T<=100 ...
- URAL 1287. Mars Canals
题目链接 这题挺水,看懂了,就OK.卡了几下内存,还是卡过了. #include <iostream> #include <cstdio> #include <cstri ...
- USACO 5.5 Hidden Password(搜索+优化)
水了好几下. 优化1:开始初始化的时候,如果左边那个也是最小值,那么此点就不用进队了. 优化2:如果队列里的位置,已经超过了后面位置的初始位置,那么后面这个位置也没用了. /* ID: cuizhe ...
- 为什么C#不使用多继承?(from stackoverflow)
简单地说:是因为该语言的设计者决定不使用. 基本上,.NET和Java的设计者不使用多继承(MI),是因为他们认为给语言加上多继承获得的好处较少,抵不上因此增加的复杂性. 1.不同的语言对于多继承如何 ...
- Java_动态加载类(英文)
It is possible to load and reload classes at runtime in Java, though it is not as straightforward as ...
- Java_Java SE6调用动态编译
转自:http://www.cnblogs.com/flyoung2008/archive/2011/11/14/2249017.html 一.使用JavaCompiler接口编译java源程序 我们 ...
- python rabbitmq
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @author: zengchunyun ""& ...
- php by oneself
在php里面写html代码真的很麻烦,最近学到了一个新的方法: <html> <head> <title>PHP</title> <meta ht ...