java:Mybatis框架2(基于mapper接口的开发,多种查询,复合类型查询,resultMap定义,多表联查,sql片段)
1.mybatis02:
mybatis-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 加载属性文件 -->
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<!-- 使用jdbc中的事务 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 引入映射文件 -->
<mappers>
<!-- <mapper resource="cn/zzsxt/mapper/TbUserMapper.xml"/> -->
<!-- 注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下; -->
<!-- <mapper class="cn.zzsxt.mapper.TbUserMapper"/> -->
<!-- 注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下; -->
<package name="cn.zzsxt.mapper"/>
</mappers>
</configuration>
log4j.properties:
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.org.apache.ibatis=DEBUG
#log4j.rootLogger=warn,appender1
#log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#log4j.appender.appender1.layout=org.apache.log4j.SimpleLayout
db.properties:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root
TbUser.java:
package cn.zzsxt.entity; import java.io.Serializable;
import java.util.Date; public class TbUser implements Serializable{
private long id;
private String username;
private String sex;
private Date birthday;
private String address; public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "TbUser [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address="
+ address + "]";
} }
TbUserMapper.xml:
<?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">
<!--
1、 mapper接口的全限定名要和mapper映射文件的namespace值一致。
2、 mapper接口的方法名称要和mapper映射文件的statement的id一致。
3、 mapper接口的方法参数类型要和mapper映射文件的statement的parameterType的值一致,而且它的参数是一个。
4、 mapper接口的方法返回值类型要和mapper映射文件的statement的resultType的值一致。
-->
<mapper namespace="cn.zzsxt.mapper.TbUserMapper">
<!--
1.需求根据用户名称模糊查询
2.思路:模糊查询返回结果可能是多条纪录
3.resultType:指定就是单条记录所映射成java对象类型
4.${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中
5.使用${}容易引起sql注入
6.${value}:接受输入参数的内容,如果传入类型是简单类型,${}中只能用value
-->
<select id="findUserByName" parameterType="java.lang.String" resultType="cn.zzsxt.entity.TbUser">
select * from tb_user where username like '%${value}%'
</select>
<select id="findUserById" parameterType="java.lang.Long" resultType="cn.zzsxt.entity.TbUser">
select * from tb_user where id=#{id}
</select>
<insert id="addUser" parameterType="cn.zzsxt.entity.TbUser">
insert into tb_user(username,sex,birthday,address) values(#{username},#{sex},#{birthday},#{address})
</insert>
</mapper>
TbUserMapper.java:
package cn.zzsxt.mapper; import java.util.List;
import java.util.Map; import cn.zzsxt.entity.TbUser;
import cn.zzsxt.vo.TbUserQuery; public interface TbUserMapper {
List<TbUser> findUserByName(String username);
TbUser findUserById(long id);
int addUser(TbUser user);
/**
* 查询用户信息,要求对用户名进行模糊查找,对性别进行精确查找
* @return
*/
List<TbUser> findUserByNameAndSexVo(TbUserQuery userQuery);
/**
* 查询用户信息,要求对用户名进行模糊查找,对性别进行精确查找
* @param map
* @return
*/
List<TbUser> findUserByNameAndSexMap(Map<String,Object> map);
/**
* 查询用户信息,要求对用户名进行模糊查找,对性别进行精确查找
* @param user
* @return
*/
List<TbUser> findUserByAddressAndSex(TbUser user); /**
* 查询用户表中总记录数
* @return
*/
int getCount();
/**
* 使用resultMap封装结果,根据用户编号查询用户信息,
* @param id
* @return
*/
TbUser findUserByResultMap(long id);
/**
* 查询部分列
* @param id
* @return
*/
TbUser findUserByResultType(long id); List<TbUser> findUserList(TbUserQuery userQuery);
}
TbUserMapper.xml:
<?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">
<!--
1、 mapper接口的全限定名要和mapper映射文件的namespace值一致。
2、 mapper接口的方法名称要和mapper映射文件的statement的id一致。
3、 mapper接口的方法参数类型要和mapper映射文件的statement的parameterType的值一致,而且它的参数是一个。
4、 mapper接口的方法返回值类型要和mapper映射文件的statement的resultType的值一致。
-->
<mapper namespace="cn.zzsxt.mapper.TbUserMapper">
<!--
1.需求根据用户名称模糊查询
2.思路:模糊查询返回结果可能是多条纪录
3.resultType:指定就是单条记录所映射成java对象类型
4.${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中
5.使用${}容易引起sql注入
6.${value}:接受输入参数的内容,如果传入类型是简单类型,${}中只能用value
-->
<select id="findUserByName" parameterType="java.lang.String" resultType="cn.zzsxt.entity.TbUser">
select * from tb_user where username like '%${value}%'
</select>
<select id="findUserById" parameterType="java.lang.Long" resultType="cn.zzsxt.entity.TbUser">
select * from tb_user where id=#{id}
</select>
<insert id="addUser" parameterType="cn.zzsxt.entity.TbUser">
insert into tb_user(username,sex,birthday,address) values(#{username},#{sex},#{birthday},#{address})
</insert>
<!-- 根据用户名和性别查询 -->
<select id="findUserByNameAndSexVo" parameterType="cn.zzsxt.vo.TbUserQuery" resultType="cn.zzsxt.entity.TbUser">
select * from tb_user where username like '%${user.username}%' and sex=#{user.sex}
</select> <!-- 根据用户名和性别查询,参数为map -->
<select id="findUserByNameAndSexMap" parameterType="java.util.HashMap" resultType="cn.zzsxt.entity.TbUser">
select * from tb_user where username like '%${uname}%' and sex=#{sex}
</select>
<!-- 根据用户名和性别查询 -->
<select id="findUserByAddressAndSex" parameterType="cn.zzsxt.entity.TbUser" resultType="cn.zzsxt.entity.TbUser">
select * from tb_user where address like '%${address}%' and sex=#{sex}
</select>
<!-- 查询总记录数 -->
<select id="getCount" resultType="java.lang.Integer">
select count(*) from tb_user
</select> <!--
定义resultMap:解决字段名称与属性名称不一致的问题。
将SELECT id id_,username username_,
sex sex_ FROM tb_user WHERE id = 1 和 User类中的属性作一个映射关系
type:resultMap最终映射的java对象类型,可以使用别名
id:对resultMap的唯一标识
--> <resultMap id="userResultMap" type="cn.zzsxt.entity.TbUser">
<id column="id_" property="id"/>
<result column="username_" property="username"/>
<result column="sex_" property="sex"/>
<result column="birthday" property="birthday"/>
<result column="address" property="address"/>
</resultMap>
<select id="findUserByResultMap" parameterType="java.lang.Long" resultMap="userResultMap">
select id id_,username username_,sex sex_,birthday,address from tb_user where id=#{id}
</select> <!-- 查询部分列 -->
<select id="findUserByResultType" parameterType="java.lang.Long" resultType="cn.zzsxt.entity.TbUser">
select id,username,sex from tb_user where id=#{id}
</select> <!-- 动态SQL -->
<select id="findUserList" parameterType="cn.zzsxt.vo.TbUserQuery" resultType="cn.zzsxt.entity.TbUser">
select * from tb_user
<where>
<!-- <if test="user.address!=null and user.address!=''"> -->
<!-- and address like'%${user.address}%' -->
<!-- </if> -->
<!-- <if test="user.sex!=null and user.sex!=''"> -->
<!-- and sex=#{user.sex} -->
<!-- </if> -->
<!-- 引入SQL片段 -->
<include refid="where_address_sex"></include>
</where>
</select> <!-- SQL片段:提高sql语句的复用性 -->
<sql id="where_address_sex">
<if test="user.address!=null and user.address!=''">
and address like'%${user.address}%'
</if>
<if test="user.sex!=null and user.sex!=''">
and sex=#{user.sex}
</if> <if test="ids!=null">
<!--
使用foreach遍历传入ids
collection:指定输入对象中集合属性
item:每次遍历生成对象
open:开始遍历时拼接的串
close:结束遍历时拼接的串
separator分隔符:遍历的两个对象中需要拼接的串
-->
<foreach collection="ids" item="user_id" open="and id in (" close=")" separator=",">
#{user_id}
</foreach>
</if>
</sql>
</mapper>
TbUserQuery.java:
package cn.zzsxt.vo; import java.util.List; import cn.zzsxt.entity.TbUser; public class TbUserQuery {
private TbUser user;
//用户编号
private List<Long> ids; public TbUser getUser() {
return user;
} public void setUser(TbUser user) {
this.user = user;
} public List<Long> getIds() {
return ids;
} public void setIds(List<Long> ids) {
this.ids = ids;
} }
TestTbUserMapper.java:
package cn.zzsxt.test; import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test; import cn.zzsxt.entity.TbUser;
import cn.zzsxt.mapper.TbUserMapper;
import cn.zzsxt.vo.TbUserQuery; public class TestTbUserMapper {
@Test
public void testFindUserByName(){
InputStream ips = this.getClass().getResourceAsStream("/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取TbUserMapper生成的代理(通过jdk的动态代理实现的)
TbUserMapper tbUserMapper = sqlSession.getMapper(TbUserMapper.class);
List<TbUser> list = tbUserMapper.findUserByName("张");
for (TbUser tbUser : list) {
System.out.println(tbUser);
}
sqlSession.close();
} @Test
public void testFindUserById(){
InputStream ips = this.getClass().getResourceAsStream("/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取TbUserMapper生成的代理(通过jdk的动态代理实现的)
TbUserMapper tbUserMapper = sqlSession.getMapper(TbUserMapper.class);
TbUser user = tbUserMapper.findUserById(1);
System.out.println(user);
sqlSession.close();
} @Test
public void testAddUser(){
InputStream ips = this.getClass().getResourceAsStream("/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取TbUserMapper生成的代理(通过jdk的动态代理实现的)
TbUserMapper tbUserMapper = sqlSession.getMapper(TbUserMapper.class);
TbUser user = new TbUser();
user.setUsername("王五");
user.setSex("女");
user.setBirthday(new Date());
user.setAddress("郑州");
int count = tbUserMapper.addUser(user);
sqlSession.commit();
System.out.println(count);
sqlSession.close();
} @Test
public void testFindUserByNameAndSexVo(){
InputStream ips = this.getClass().getResourceAsStream("/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取TbUserMapper生成的代理(通过jdk的动态代理实现的)
TbUserMapper tbUserMapper = sqlSession.getMapper(TbUserMapper.class);
TbUserQuery userQuery = new TbUserQuery();
TbUser user = new TbUser();
user.setUsername("五");
user.setSex("男");
userQuery.setUser(user);
List<TbUser> list= tbUserMapper.findUserByNameAndSexVo(userQuery);
for (TbUser tbUser : list) {
System.out.println(tbUser);
}
sqlSession.close();
}
@Test
public void testFindUserByNameAndSexMap(){
InputStream ips = this.getClass().getResourceAsStream("/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取TbUserMapper生成的代理(通过jdk的动态代理实现的)
TbUserMapper tbUserMapper = sqlSession.getMapper(TbUserMapper.class);
Map<String,Object> map = new HashMap<String,Object>();
map.put("uname", "五");
map.put("sex", "男");
List<TbUser> list= tbUserMapper.findUserByNameAndSexMap(map);
for (TbUser tbUser : list) {
System.out.println(tbUser);
}
sqlSession.close();
}
@Test
public void testFindUserByAddressAndSex(){
InputStream ips = this.getClass().getResourceAsStream("/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取TbUserMapper生成的代理(通过jdk的动态代理实现的)
TbUserMapper tbUserMapper = sqlSession.getMapper(TbUserMapper.class);
TbUser user = new TbUser();
user.setAddress("安阳");
user.setSex("男");
List<TbUser> list= tbUserMapper.findUserByAddressAndSex(user);
for (TbUser tbUser : list) {
System.out.println(tbUser);
}
sqlSession.close();
}
}
TestTbUserMapper2.java:
package cn.zzsxt.test; import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test; import cn.zzsxt.entity.TbUser;
import cn.zzsxt.mapper.TbUserMapper;
import cn.zzsxt.vo.TbUserQuery; public class TestTbUserMapper2 {
@Test
public void testGetCount(){
InputStream ips = this.getClass().getResourceAsStream("/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取TbUserMapper生成的代理(通过jdk的动态代理实现的)
TbUserMapper tbUserMapper = sqlSession.getMapper(TbUserMapper.class);
int count = tbUserMapper.getCount();
System.out.println("总记录数为:"+count);
sqlSession.close();
} @Test
public void testFindUserByResultMap(){
InputStream ips = this.getClass().getResourceAsStream("/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取TbUserMapper生成的代理(通过jdk的动态代理实现的)
TbUserMapper tbUserMapper = sqlSession.getMapper(TbUserMapper.class);
TbUser user = tbUserMapper.findUserByResultMap(1L);
System.out.println(user);
sqlSession.close();
} @Test
public void testFindUserByResultType(){
InputStream ips = this.getClass().getResourceAsStream("/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取TbUserMapper生成的代理(通过jdk的动态代理实现的)
TbUserMapper tbUserMapper = sqlSession.getMapper(TbUserMapper.class);
TbUser user = tbUserMapper.findUserByResultType(1L);
System.out.println(user);
sqlSession.close();
}
/**
* 动态SQL
*/
@Test
public void testFindUserList(){
InputStream ips = this.getClass().getResourceAsStream("/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取TbUserMapper生成的代理(通过jdk的动态代理实现的)
TbUserMapper tbUserMapper = sqlSession.getMapper(TbUserMapper.class); TbUserQuery userQuery = new TbUserQuery();
TbUser user = new TbUser();
//user.setAddress("安阳");
//user.setSex("男");
userQuery.setUser(user); //此处若不传值,报错!!!!!!
//foreach测试
List<Long> ids = new ArrayList<Long>();
ids.add(1L);
ids.add(2L);
ids.add(3L);
userQuery.setIds(ids);
List<TbUser> list = tbUserMapper.findUserList(userQuery);
for (TbUser tbUser : list) {
System.out.println(tbUser);
}
sqlSession.close();
} }
2.mybatis03:
mybatis-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 加载属性文件 -->
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<!-- 使用jdbc中的事务 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 引入映射文件 -->
<mappers>
<!-- <mapper resource="cn/zzsxt/mapper/TbUserMapper.xml"/> -->
<!-- 注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下; -->
<!-- <mapper class="cn.zzsxt.mapper.TbUserMapper"/> -->
<!-- 注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下; -->
<package name="cn.zzsxt.mapper"/>
</mappers>
</configuration>
db.properties:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=root
log4j.properties:
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.org.apache.ibatis=DEBUG
#log4j.rootLogger=warn,appender1
#log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#log4j.appender.appender1.layout=org.apache.log4j.SimpleLayout
TbGoods.java:
package cn.zzsxt.entity; import java.util.Date; public class TbGoods {
private long id;
private String name;
private double price;
private Date create_time;
private String detail;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Date getCreate_time() {
return create_time;
}
public void setCreate_time(Date create_time) {
this.create_time = create_time;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
@Override
public String toString() {
return "TbGoods [id=" + id + ", name=" + name + ", price=" + price + ", create_time=" + create_time
+ ", detail=" + detail + "]";
} }
TbOrder.java:
package cn.zzsxt.entity; import java.util.Date;
import java.util.List; public class TbOrder {
private long id;
private long user_id;
private String order_number;
private Date create_time;
private String detail;
//订单与订单明细:一对多
private List<TbOrderDetail> orderDetailList; public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public long getUser_id() {
return user_id;
}
public void setUser_id(long user_id) {
this.user_id = user_id;
}
public String getOrder_number() {
return order_number;
}
public void setOrder_number(String order_number) {
this.order_number = order_number;
}
public Date getCreate_time() {
return create_time;
}
public void setCreate_time(Date create_time) {
this.create_time = create_time;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
} public List<TbOrderDetail> getOrderDetailList() {
return orderDetailList;
}
public void setOrderDetailList(List<TbOrderDetail> orderDetailList) {
this.orderDetailList = orderDetailList;
}
@Override
public String toString() {
return "TbOrder [id=" + id + ", user_id=" + user_id + ", order_number=" + order_number + ", create_time="
+ create_time + ", detail=" + detail + "]";
} }
TbOrderDetail.java:
package cn.zzsxt.entity; public class TbOrderDetail {
private long id;
private long order_id;
private long goods_id;
private long goods_num;
//订单明细与商品:一对一
private TbGoods goods; public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public long getOrder_id() {
return order_id;
}
public void setOrder_id(long order_id) {
this.order_id = order_id;
}
public long getGoods_id() {
return goods_id;
}
public void setGoods_id(long goods_id) {
this.goods_id = goods_id;
}
public long getGoods_num() {
return goods_num;
}
public void setGoods_num(long goods_num) {
this.goods_num = goods_num;
} public TbGoods getGoods() {
return goods;
}
public void setGoods(TbGoods goods) {
this.goods = goods;
}
@Override
public String toString() {
return "TbOrderDetail [id=" + id + ", order_id=" + order_id + ", goods_id=" + goods_id + ", goods_num="
+ goods_num + "]";
} }
TbUser.java:
package cn.zzsxt.entity; import java.io.Serializable;
import java.util.Date;
import java.util.List; public class TbUser implements Serializable{
private long id;
private String username;
private String sex;
private Date birthday;
private String address;
//用户与订单:一对多
private List<TbOrder> orderList; public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
} public List<TbOrder> getOrderList() {
return orderList;
}
public void setOrderList(List<TbOrder> orderList) {
this.orderList = orderList;
}
@Override
public String toString() {
return "TbUser [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address="
+ address + "]";
} }
TbOrderQuery01.java:
package cn.zzsxt.vo; import cn.zzsxt.entity.TbOrder; public class TbOrderQuery01 extends TbOrder {
private String username;
private String sex;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "TbOrderQuery01 [username=" + username + ", sex=" + sex + "]"+super.toString();
} }
TbOrderQuery02.java:
package cn.zzsxt.vo; import cn.zzsxt.entity.TbOrder;
import cn.zzsxt.entity.TbUser; public class TbOrderQuery02 extends TbOrder {
private TbUser user; public TbUser getUser() {
return user;
} public void setUser(TbUser user) {
this.user = user;
} @Override
public String toString() {
return "TbOrderQuery02:"+super.toString()+" [user=" + user + "]";
} }
TbOrderQuery03.java:
package cn.zzsxt.vo; import java.util.List; import cn.zzsxt.entity.TbOrder;
import cn.zzsxt.entity.TbOrderDetail;
import cn.zzsxt.entity.TbUser; public class TbOrderQuery03 extends TbOrder {
//订单与用户:一对一
private TbUser user;
//订单与订单明细:一对多
private List<TbOrderDetail> orderDetailList; public TbUser getUser() {
return user;
}
public void setUser(TbUser user) {
this.user = user;
}
public List<TbOrderDetail> getOrderDetailList() {
return orderDetailList;
}
public void setOrderDetailList(List<TbOrderDetail> orderDetailList) {
this.orderDetailList = orderDetailList;
}
@Override
public String toString() {
return "TbOrderQuery03 [user=" + user + ", orderDetailList=" + orderDetailList + ", toString()="
+ super.toString() + "]";
} }
TbOrderMapper.java:
package cn.zzsxt.mapper; import java.util.List; import cn.zzsxt.entity.TbUser;
import cn.zzsxt.vo.TbOrderQuery01;
import cn.zzsxt.vo.TbOrderQuery02;
import cn.zzsxt.vo.TbOrderQuery03; public interface TbOrderMapper {
/**
* 查询订单信息,关联用户信息
* @return
*/
List<TbOrderQuery01> findOrderAndUser();
/**
* 查询订单信息,关联用户信息,将查询结果封装成自定义的resultMap中
* @return
*/
List<TbOrderQuery02> findOrderAndUserResultMap(); /**
* 查询订单信息,关联用户信息和订单明细
* @return
*/
List<TbOrderQuery03> findOrderAndDetailAndUser();
/**
* 查询用户信息,关联订单信息,订单明细和商品信息
* @return
*/
List<TbUser> findUserAndGoods();
}
TbOrderMapper.xml
<?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">
<mapper namespace="cn.zzsxt.mapper.TbOrderMapper">
<!-- 查询订单信息关联用户信息 一对一 -->
<select id="findOrderAndUser" resultType="cn.zzsxt.vo.TbOrderQuery01">
SELECT
tb_order.id,
tb_order.user_id,
tb_order.order_number,
tb_user.username,
tb_user.sex
FROM tb_order, tb_user
WHERE tb_order.user_id = tb_user.id
</select>
<!-- 自定义resultMap -->
<resultMap type="cn.zzsxt.vo.TbOrderQuery02" id="orderAndUserResultMap">
<id column="order_id" property="id"/>
<result column="user_id" property="user_id"/>
<result column="order_number" property="order_number"/>
<result column="detail" property="detail"/>
<!-- 一对一关联 -->
<association property="user" javaType="cn.zzsxt.entity.TbUser">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="birthday" property="birthday"/>
<result column="address" property="address"/>
</association>
</resultMap>
<select id="findOrderAndUserResultMap" resultMap="orderAndUserResultMap">
SELECT
tb_order.id order_id,
tb_order.user_id,
tb_order.order_number,
tb_order.detail,
tb_user.username,
tb_user.sex,
tb_user.birthday,
tb_user.address
FROM tb_order, tb_user
WHERE tb_order.user_id = tb_user.id
</select>
<!-- 自定义resultMap -->
<resultMap type="cn.zzsxt.vo.TbOrderQuery03" id="orderAndDetailAndUserResultMap">
<id column="order_id" property="id"/>
<result column="user_id" property="user_id"/>
<result column="order_number" property="order_number"/>
<result column="create_time" property="create_time"/>
<result column="detail" property="detail"/>
<!-- 一对一关联 -->
<association property="user" javaType="cn.zzsxt.entity.TbUser">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="birthday" property="birthday"/>
<result column="address" property="address"/>
</association>
<!-- 一对多关联 -->
<collection property="orderDetailList" ofType="cn.zzsxt.entity.TbOrderDetail">
<id column="detail_id" property="id"/>
<result column="goods_id" property="goods_id"/>
<result column="goods_num" property="goods_num"/>
</collection>
</resultMap>
<select id="findOrderAndDetailAndUser" resultMap="orderAndDetailAndUserResultMap">
SELECT
tb_order.id order_id,
tb_order.user_id,
tb_order.order_number,
tb_order.create_time,
tb_order.detail,
tb_user.username,
tb_user.sex,
tb_user.birthday,
tb_user.address,
tb_order_detail.id detail_id,
tb_order_detail.goods_id,
tb_order_detail.goods_num
FROM tb_order, tb_user, tb_order_detail
WHERE tb_order.user_id = tb_user.id
AND tb_order.id = tb_order_detail.order_id
</select>
<!-- 多对多 -->
<resultMap type="cn.zzsxt.entity.TbUser" id="userAndGoodsResultMap">
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="birthday" property="birthday"/>
<result column="address" property="address"/>
<!-- 一对多 -->
<collection property="orderList" ofType="cn.zzsxt.entity.TbOrder">
<id column="order_id" property="id"/>
<result column="order_number" property="order_number"/>
<result column="create_time" property="create_time"/>
<result column="detail" property="detail"/>
<!-- 一对多 -->
<collection property="orderDetailList" ofType="cn.zzsxt.entity.TbOrderDetail">
<id column="detail_id" property="id"/>
<result column="goods_id" property="goods_id"/>
<result column="goods_num" property="goods_num"/>
<!-- 一对一 -->
<association property="goods" javaType="cn.zzsxt.entity.TbGoods">
<result column="name" property="name"/>
<result column="price" property="price"/>
<result column="goods_create_time" property="create_time"/>
<result column="goods_detail" property="detail"/>
</association>
</collection>
</collection>
</resultMap>
<select id="findUserAndGoods" resultMap="userAndGoodsResultMap">
SELECT
tb_user.id user_id,
tb_user.username,
tb_user.sex,
tb_user.birthday,
tb_user.address,
tb_order.id order_id,
tb_order.order_number,
tb_order.create_time,
tb_order.detail,
tb_order_detail.id detail_id,
tb_order_detail.goods_id,
tb_order_detail.goods_num,
tb_goods.name,
tb_goods.price,
tb_goods.create_time goods_create_time,
tb_goods.detail goods_detail
FROM tb_order, tb_user, tb_order_detail, tb_goods
WHERE tb_order.user_id = tb_user.id
AND tb_order.id = tb_order_detail.order_id
AND tb_order_detail.goods_id = tb_goods.id
</select> </mapper>
TestOrderMapper.java:
package cn.zzsxt.test; import java.io.InputStream;
import java.util.List; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test; import cn.zzsxt.entity.TbGoods;
import cn.zzsxt.entity.TbOrder;
import cn.zzsxt.entity.TbOrderDetail;
import cn.zzsxt.entity.TbUser;
import cn.zzsxt.mapper.TbOrderMapper;
import cn.zzsxt.vo.TbOrderQuery01;
import cn.zzsxt.vo.TbOrderQuery02;
import cn.zzsxt.vo.TbOrderQuery03; public class TestOrderMapper {
@Test
public void testFindOrderAndUser(){
InputStream ips = this.getClass().getResourceAsStream("/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);
SqlSession sqlSession = sqlSessionFactory.openSession();
TbOrderMapper orderMapper = sqlSession.getMapper(TbOrderMapper.class);
List<TbOrderQuery01> list = orderMapper.findOrderAndUser();
for (TbOrderQuery01 tbOrderQuery01 : list) {
System.out.println(tbOrderQuery01);
}
} @Test
public void testFindOrderAndUserResultMap(){
InputStream ips = this.getClass().getResourceAsStream("/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);
SqlSession sqlSession = sqlSessionFactory.openSession();
TbOrderMapper orderMapper = sqlSession.getMapper(TbOrderMapper.class);
List<TbOrderQuery02> list = orderMapper.findOrderAndUserResultMap();
for (TbOrderQuery02 tbOrderQuery02 : list) {
System.out.println(tbOrderQuery02);
}
} @Test
public void testFindOrderAndDetailAndUser(){
InputStream ips = this.getClass().getResourceAsStream("/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);
SqlSession sqlSession = sqlSessionFactory.openSession();
TbOrderMapper orderMapper = sqlSession.getMapper(TbOrderMapper.class);
List<TbOrderQuery03> list = orderMapper.findOrderAndDetailAndUser();
for (TbOrderQuery03 tbOrderQuery03 : list) {
System.out.println(tbOrderQuery03);
}
} @Test
public void testFindUserAndGoods(){
InputStream ips = this.getClass().getResourceAsStream("/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);
SqlSession sqlSession = sqlSessionFactory.openSession();
TbOrderMapper orderMapper = sqlSession.getMapper(TbOrderMapper.class);
List<TbUser> list = orderMapper.findUserAndGoods();
for (TbUser tbUser : list) {
System.out.println("用户信息:"+tbUser);
List<TbOrder> orderList = tbUser.getOrderList();//获取订单信息
System.out.println("订单信息:");
for (TbOrder tbOrder : orderList) {
System.out.println(tbOrder);
System.out.println("订单明细:");
List<TbOrderDetail> orderDetailList = tbOrder.getOrderDetailList();//获取订单明细
for (TbOrderDetail tbOrderDetail : orderDetailList) {
System.out.println(tbOrderDetail);
//获取商品信息
TbGoods tbGoods = tbOrderDetail.getGoods();
System.out.println(tbGoods);
}
}
}
}
}
java:Mybatis框架2(基于mapper接口的开发,多种查询,复合类型查询,resultMap定义,多表联查,sql片段)的更多相关文章
- 03_MyBatis基本查询,mapper文件的定义,测试代码的编写,resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询ma
1 PersonTestMapper.xml中的内容如下: <?xmlversion="1.0"encoding="UTF-8"?> < ...
- Mybatis学习(2)原始dao开发和使用mapper接口代理开发
基础知识: 1).SqlSessionFactoryBuilder: 通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory.将SqlSessionFact ...
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring 非原创[只为记录],原博文地址:https://www.cnblogs.com/ ...
- (转)Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring Mybatis在与Spring集成的时候可以配置MapperFactoryBea ...
- Spring Boot 整合mybatis时遇到的mapper接口不能注入的问题
现实情况是这样的,因为在练习spring boot整合mybatis,所以自己新建了个项目做测试,可是在idea里面mapper接口注入报错,后来百度查询了下,把idea的注入等级设置为了warnin ...
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring - 大新博客 - 推酷 - 360安全浏览器 7.1
Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring - 大新博客 时间 2014-02-11 21:08:00 博客园-所有随笔区 ...
- (转)MyBatis框架的学习(三)——Dao层开发方法
http://blog.csdn.net/yerenyuan_pku/article/details/71700957 使用MyBatis开发Dao层,通常有两个方法,即原始Dao开发方法和Mappe ...
- mybatis笔记之使用Mapper接口注解
1. mybatis支持的映射方式 mybatis支持的映射方式有基于xml的mapper.xml文件.基于java的使用Mapper接口class,简单学习一下mybatis使用接口来配置映射的方法 ...
- spring与mybatis整合(扫描Mapper接口)
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" ...
随机推荐
- vps 11步移站步骤笔记
移站是经常的事,现在把步骤写上,防止忘记命令 1.登录SSH 2.打包数据库,phpmyadmin中备份数据库,导入新数据库,数据库中域名链接进行相应替换 获取phpmyadmin root密码 ca ...
- Codeforces 837D - Round Subset DP
先算出每个数的pop1(twonum),pop(fivenum)然后DP ans[i][j]表示选i个数有j个2时最多有多少个5 转移方程是 ;j--) { ;w++) { ans[j][w]=max ...
- git中working tree, index, commit
这三个名字可以简单理解为文件在本地仓库存在的三种不同的位置. 如下,是做commit提交两段提交过程,工作区(working tree),暂存区(index)和 branch(commit). wor ...
- Redis集群方案(来自网络)
参考: https://www.zhihu.com/question/21419897 http://www.cnblogs.com/haoxinyue/p/redis.html 为什么集群? 通常, ...
- Phaserjs3 对象池随机产生炸弹并销毁 -- Html网页游戏开发
scene.js /// <reference path="../../libs/phaser/phaser.min.js"/> 'use strict'; var B ...
- char()和VARCHAR()的主要区别是什么?
1.char的长度是不可变的,而varchar的长度是可变的 字段b:类型char(10), 值为:abc,存储为:abc (abc+7个空格) 字段d:类型varch ...
- 一个python生成器的使用
def myegg(retlist): for i in retlist: rec = yield i mydict = [ {}, {}, {}, ] b = myegg(mydict) obj = ...
- poj 1017 装箱子(模拟+贪心)
Description A factory produces products packed in square packets of the same height h and of the siz ...
- 前端开发——让算法"动"起来
正文 当然在我们不清楚具体操作细节前我们可以先假设一下,我们能够用什么来实现.按照以前看过的排序动画我将其分为 1.Js操作Dom,再搭配简单的css 2.Canvas动画 之后在查资料的时候发现还有 ...
- 二、linux下apache2.2.11+php5.6.3的环境配置
参考文献:http://www.92csz.com/study/linux/16.htm 本节部分操作会直接使用上一节(http://www.cnblogs.com/yxpblog/p/4627509 ...