【JavaWeb-27】MyBatis进阶的一些概念以及与spring开发框架整合
2017-05-25 16:17
811 查看
1、之前我们使用MyBatis时使用用输入参数和输入参数,但是输入参数还有一种我们没用过,就是对POJO的包装类。本质上就是新写一个类,然后把POJO作为它的属性。
——先写一个包装类QueryVo:
——然后在User.xml中写:
——然后在UserDao类中写接口方法:
——最后使用的时候:
2、输出参数类型,我们之前只使用过POJO,其实还有Integer,比如我们要查询记录的数量。这个比较简单,就是resultType设置为Integer即可。
3、输出参数的时候,还有一种是使用resultMap,这个一般是出现在我们的类属性和数据库字段不一致的时候,需要手动指定映射。用法其实不复杂,其实就是多了一步映射的配置。
4、动态sql之where和if。我们在写sql语句的时候,经常遇到多个查询条件,之间用and连接,但是有可能会出现第一个条件的值是null,或者当第一个值不存在的时候我们直接忽略第一个条件,但是他们中间还有and或者or这些,无法去除,比较麻烦,怎么办,用下面这种标签:
5、sql片段就是给一段sql语句起个别名,用的时候直接include这个别名即可。
6、使用foreach,也就是sql语句里面如果用到in查询时:
——在QueryVo中
——在UserDao接口中写一个方法:
——在User.xml中写语句:
——最后测试:
7、这里面有个坑。也就是说我们上面用的是QueryVo,然后直接下面的collection上填写我们定义的list。
——但如果我们这里不用QueryVo,直接在UseDao中写这么一个方法:
然后我们使用的时候,直接传入一个数组。结果出错,出错就在collection没有给对。这里的collection应该给一个array:
——那如果同样的不用QueryVo,但这次是直接给一个List呢?这里的collection也要做出改变,变成list,否则也会出错。这里不再演示。
——结论。我们把array或者list放在QueryVo中当做一个属性的时候,在使用foreach标签时,可以直接使用这里面的属性给collection,但是如果我们没有使用QueryVo包装类,而是直接传递array或者list,这时候就需要注意collection的赋值。
8、一对一关联。比如order对应user就是一对一。
——这个时候主要是2个地方的变化,一个是当然我们需要在Order类中定义私有属性user,设置getter、setter方法。然后在UserDao接口中写个函数,最后调用。
——第二个地方就是主要的,在Order.xml中进行sql语句的书写。这里面的结果类型都是resultMap,因为涉及到多表的映射的都只能用它。
9、一对多。比如user对应order就是一对多。一对多,就是使用collection标签,取代association标签。当然在User类中添加一个list属性,泛型是Order类。
10、与spring整合。
省略,这个需要结合项目来说。
——先写一个包装类QueryVo:
package com.itheima.mybatis.pojo; import java.io.Serializable; public class QueryVo implements Serializable { /** * */ private static final long serialVersionUID = 1L; private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
——然后在User.xml中写:
<select id="findUserByQueryVo" parameterType="com.itheima.mybatis.pojo.QueryVo" resultType="com.itheima.mybatis.pojo.User"> select * from user where username like "%"#{user.username}"%" </select>
——然后在UserDao类中写接口方法:
package com.itheima.mybatis.dao; import java.util.List; import com.itheima.mybatis.pojo.QueryVo; import com.itheima.mybatis.pojo.User; public interface UserDao { public List<User> findUserByQueryVo(QueryVo vo); }
——最后使用的时候:
UserDao userDao = sqlSession.getMapper(UserDao.class); QueryVo vo = new QueryVo(); User u = new User(); u.setUsername("五"); vo.setUser(u); List<User> us = userDao.findUserByQueryVo(vo); for(User user : us){ System.out.println(user); }
2、输出参数类型,我们之前只使用过POJO,其实还有Integer,比如我们要查询记录的数量。这个比较简单,就是resultType设置为Integer即可。
3、输出参数的时候,还有一种是使用resultMap,这个一般是出现在我们的类属性和数据库字段不一致的时候,需要手动指定映射。用法其实不复杂,其实就是多了一步映射的配置。
<resultMap type="User" id="uuu"> <id column="id" property="UserId"/> <result column="username" property="UserName"/> </resultMap> <select id="findUserByUserName" parameterType="com.itheima.mybatis.pojo.User" resultMap="uuu"> select * from user where username = #{UserName} </select>
4、动态sql之where和if。我们在写sql语句的时候,经常遇到多个查询条件,之间用and连接,但是有可能会出现第一个条件的值是null,或者当第一个值不存在的时候我们直接忽略第一个条件,但是他们中间还有and或者or这些,无法去除,比较麻烦,怎么办,用下面这种标签:
<select id="test" parameterType="test01" resultType="test02"> select id,username,password <where> <if test="gender!=null and gener!=''"> gender=#{gender} </if> <if test="address!=null and address!=''"> address=#{address} </if> </where> </select>
5、sql片段就是给一段sql语句起个别名,用的时候直接include这个别名即可。
<sql id="hahah"> select * from user </sql> <select id="findUserById" parameterType="Integer" resultType="com.itheima.mybatis.pojo.User"> <include refid="hahah"></include> where id = #{id} </select>
6、使用foreach,也就是sql语句里面如果用到in查询时:
——在QueryVo中
public class QueryVo implements Serializable { private List<Integer> ids; public List<Integer> getIds() { return ids; } public void setIds(List<Integer> ids) { this.ids = ids; } }
——在UserDao接口中写一个方法:
public interface UserDao { public List<User> findUserByIds(QueryVo vo); }
——在User.xml中写语句:
<mapper namespace="com.itheima.mybatis.dao.UserDao"> <select id="findUserByIds" parameterType="com.itheima.mybatis.pojo.QueryVo" resultType="com.itheima.mybatis.pojo.User"> select * from user <where> <foreach collection="ids" item="id" open=" id in (" close=")" separator=","> #{id} </foreach> </where> </select> </mapper>
——最后测试:
UserDao userDao = sqlSession.getMapper(UserDao.class); QueryVo vo = new QueryVo(); List<Integer> l = new ArrayList<>(); l.add(24); l.add(25); vo.setIds(l); List<User> us = userDao.findUserByIds(vo); for(User user : us){ System.out.println(user); }
7、这里面有个坑。也就是说我们上面用的是QueryVo,然后直接下面的collection上填写我们定义的list。
<foreach collection="ids" item="id" open=" id in (" close=")" separator=",">
——但如果我们这里不用QueryVo,直接在UseDao中写这么一个方法:
public List<User> findUserByIds(Integer[] ids);
然后我们使用的时候,直接传入一个数组。结果出错,出错就在collection没有给对。这里的collection应该给一个array:
<foreach collection="array" item="id" open=" id in (" close=")" separator=",">
——那如果同样的不用QueryVo,但这次是直接给一个List呢?这里的collection也要做出改变,变成list,否则也会出错。这里不再演示。
——结论。我们把array或者list放在QueryVo中当做一个属性的时候,在使用foreach标签时,可以直接使用这里面的属性给collection,但是如果我们没有使用QueryVo包装类,而是直接传递array或者list,这时候就需要注意collection的赋值。
8、一对一关联。比如order对应user就是一对一。
——这个时候主要是2个地方的变化,一个是当然我们需要在Order类中定义私有属性user,设置getter、setter方法。然后在UserDao接口中写个函数,最后调用。
——第二个地方就是主要的,在Order.xml中进行sql语句的书写。这里面的结果类型都是resultMap,因为涉及到多表的映射的都只能用它。
<resultMap type="order" id="orderUserResultMap"> <id property="id" column="id" /> <result property="userId" column="user_id" /> <result property="number" column="number" /> <result property="createtime" column="createtime" /> <result property="note" column="note" /> <association property="user" javaType="user"> <id property="id" column="user_id" /> <result property="username" column="username" /> <result property="address" column="address" /> </association> </resultMap> <select id="queryOrderUserResultMap" resultMap="orderUserResultMap"> SELECT o.id, o.user_id, o.number, o.createtime, o.note, u.username, u.address FROM `order` o LEFT JOIN `user` u ON o.user_id = u.id </select>
9、一对多。比如user对应order就是一对多。一对多,就是使用collection标签,取代association标签。当然在User类中添加一个list属性,泛型是Order类。
<resultMap type="user" id="userOrderResultMap"> <id property="id" column="id" /> <result property="username" column="username" /> <result property="birthday" column="birthday" /> <result property="sex" column="sex" /> <result property="address" column="address" /> <collection property="orders" javaType="list" ofType="order"> <id property="id" column="oid" /> <result property="number" column="number" /> <result property="createtime" column="createtime" /> <result property="note" column="note" /> </collection> </resultMap> <select id="queryUserOrder" resultMap="userOrderResultMap"> SELECT u.id, u.username, u.birthday, u.sex, u.address, o.id oid, o.number, o.createtime, o.note FROM `user` u LEFT JOIN `order` o ON u.id = o.user_id </select>
10、与spring整合。
省略,这个需要结合项目来说。
相关文章推荐
- JAVAWEB开发之mybatis详解(二)——高级映射、查询缓存、mybatis与Spring整合以及懒加载的配置和逆向工程
- 整合框架 javaweb开发平台ssmy_m(与代码生成) java struts2 mybatis spring maven jquery
- dwz4j企业级Java Web快速开发框架(Mybatis + SpringMVC) + jUI整合应用
- 集成框架 javaweb开发平台ssmy_m(生成代码) java struts2 mybatis spring maven jquery
- Portal-Basic Java Web 应用开发框架:应用篇(十一) —— 整合 Spring
- JAVAWEB开发之SpringMVC详解(一)——SpringMVC的框架原理、架构简介、与mybatis整合和注解方式的使用、
- Java Web开发之Spring | SpringMvc | Mybatis | Hibernate整合、配置、使用
- JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)、Spring整合web开发、整合Junit4测试
- Java Web开发框架Spring+Hibernate整合效果介绍(附源码)
- JavaWeb---框架SpringMvc+Mybatis开发项目第二季(共三季)
- Java Web整合开发(27) -- Spring的Core模块
- JAVA WEB搭建Spring mvc+Spring+MyBatis整合框架
- eclipse 中创建 整合springmvc+mybatis+maven 的java web项目步骤,以及maven仓库配置
- JAVAWEB开发之SpringMVC详解(一)——SpringMVC的框架原理、架构简介、与mybatis整合和注解方式的使用、
- JavaWeb开发基于Spring和mybatis框架(学习日志)
- JAVA Maven SSM框架以及SpringBoot,mybatise框架整合实例开发的脚手架
- Spring Boot、Mybatis框架整合开发Java RESTful Web Service
- JavaWeb---框架SpringMvc+Mybatis开发项目第三季(共三季)
- Portal-Basic Java Web 应用开发框架:应用篇(十一) —— 整合 Spring
- JavaWeb---框架SpringMvc+Mybatis开发项目第一季(共三季)