Mybatis——传入POJO对象,动态SQL,多表关系

传入POJO对象

QueryVo.java

public class QueryVo implements Serializable{

    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

SQL映射文件

<!-- 传入POJO对象,查询用户 -->
<select id="findUserByPOJO" parameterType="QueryVo" resultType="User">
	select * from user where id = #{user.id}
</select>

测试类

@Test
public void func9() throws IOException {

    // 1.加载配置文件
    InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
    // 2.创建sqlSessionFactory
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
    // 3.获取sqlsession
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // -------------------------------------------

    // 4.SqlSEssion帮我生成一个实现类(给接口的字节码文件)
    UserDao mapper = sqlSession.getMapper(UserDao.class);

    // 创建一个POJO对象
    QueryVo vo = new QueryVo();
    User u = new User();
    u.setId(2);

    vo.setUser(u);

    User userByPOJO = mapper.findUserByPOJO(vo);

    System.out.println(userByPOJO);

    // -------------------------------------------

}

resultMap(手动指定字段)

数据库表

Order实体文件

public class Order {
	// 订单id
	private int id;
	// 用户id
	private Integer userId;
	// 订单号
	private String number;
	// 订单创建时间
	private Date createtime;
	// 备注
	private String note;
get/set。。。
}

SQL映射文件

由于实体和SQL中的userid字段不同,所以要使用resultMap

<resultMap id="jzy" type="Order">
	<result column="user_id" property="userId" />
</resultMap>

<select id="findOrderById" parameterType="int" resultMap="jzy">

	select * from `order` where id = #{id}
	-- order是关键字,所以要用``包起来

</select>

OrderDao.java

public interface OrderDao {

    Order findOrderById(int i);

}

测试类

public void func() throws IOException {

    // 1.加载配置文件
    InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
    // 2.创建sqlSessionFactory
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
    // 3.获取sqlsession
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // -------------------------------------------

    // 4.执行相应的SQL语句
    OrderDao mapper = sqlSession.getMapper(OrderDao.class);

    Order orderById = mapper.findOrderById(1);

    System.out.println(orderById);

    // -------------------------------------------
}

一.动态SQL

1)if标签&&where标签

<!--	根据性别和名字查询用户  where 可以去掉第一个前ANd   -->
<select id="selectUserBySexAndUsername" parameterType="User" resultType="User">
	<where>
		<if test="sex != null and sex != ‘‘">
			 and sex = #{sex}
		</if>
		<if test="username != null and username != ‘‘">
			 and username = #{username}
		</if>
	</where>
 </select>

2)foreach标签

a.直接传入数组

UserDao.java

public interface UserDao {
    List<User> selectUserByIds(int[] ids);
}

配置文件

<!-- 多个ID select * from user where id in (1,2,3)-->
<select id="selectUserByIds" parameterType="int[]" resultType="User">
	<include refid="selector"/>
	<where>
		<!--只要是传入的数组,collection就是"array"-->
		<foreach collection="array" item="id" separator="," open="id in (" close=")">
			#{id}
		</foreach>
	</where>
</select>

测试类

@Test
public void func3() throws IOException {

    // 1.加载配置文件
    InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
    // 2.创建sqlSessionFactory
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
    // 3.获取sqlsession
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // -------------------------------------------

    // 方法一:直接传入一个数组
    int[] ids = {1,2,3};

    UserDao mapper = sqlSession.getMapper(UserDao.class);

    List<User> list = mapper.selectUserByIds(ids);

    System.out.println(list);

    // -------------------------------------------
}

b.直接传入集合

<!-- 多个ID select * from user where id in (1,2,3)-->
<select id="selectUserByIds" parameterType="Integer" resultType="User">
	<include refid="selector"/>
	<where>
		<!--只要是传入的集合,collection就是"list"-->
		<foreach collection="list" item="id" separator="," open="id in (" close=")">
			#{id}
		</foreach>
	</where>
</select>

测试类

// 方法二:直接传入一个集合
List<Integer> ids = new ArrayList<>();

ids.add(1);
ids.add(2);
ids.add(3);

UserDao mapper = sqlSession.getMapper(UserDao.class);

List<User> list = mapper.selectUserByIds(ids);

System.out.println(list);

c.传入一个POJO,里面有集合或者数组

<!-- 多个ID select * from user where id in (1,2,3)-->
<select id="selectUserByIds" parameterType="QueryVo" resultType="User">
	<include refid="selector"/>
	<where>
		<foreach collection="ids" item="id" separator="," open="id in (" close=")">
			#{id}
		</foreach>
	</where>
</select>

测试类

// 方法三:传入一个POJO
//List<Integer> ids = new ArrayList<>();
//
//ids.add(1);
//ids.add(2);
//ids.add(3);
int[] ids = {1,2,3};
QueryVo vo = new QueryVo();
vo.setIds(ids);

UserDao mapper = sqlSession.getMapper(UserDao.class);

List<User> list = mapper.selectUserByIds(vo);

System.out.println(list);

二.关联查询

1、一对一查询

1)在Order中添加一个user字段并提供get,set方法

2)书写接口

List<Order> findOrderList();

3)书写配置文件

<resultMap id="jbb" type="Order">
	<id column="id" property="id"/>
	<result column="user_id" property="userId" />
	<result column="number" property="number" />

	<!-- 一对一配置 -->
	<association property="user" javaType="User">
		<id column="user_id" property="id" />
		<result column="username" property="username"/>
	</association>
</resultMap>

<select id="findOrderList" resultMap="jbb">
	select
	o.id,o.user_id,o.number,o.createtime,u.username
	from `order` o
	left join
	user u
	on
	o.user_id=u.id
</select>

4)测试类

public void func4() throws IOException {

    // 1.加载配置文件
    InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
    // 2.创建sqlSessionFactory
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
    // 3.获取sqlsession
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // -------------------------------------------

    OrderDao mapper = sqlSession.getMapper(OrderDao.class);

    List<Order> orderList = mapper.findOrderList();

    System.out.println(orderList);

    // -------------------------------------------
}

2、一对多查询

1)在User中添加一个集合,保存Order对象

2)书写接口

List<User> findUserAllOrder();

3)SQL映射文件

<resultMap id="jjj" type="User">
	<id column="user_id" property="id"/>
	<result column="username" property="username"/>

	<!-- 一对多 -->
	<collection property="orderList" ofType="Order">
		<id column="id" property="id"/>
		<result column="number" property="number"/>
		<result column="createtime" property="createtime"/>
		<result column="user_id" property="userId"/>
	</collection>
</resultMap>

<select id="findUserAllOrder" resultMap="jjj">
	select
	o.id,o.user_id,o.number,o.createtime,u.username
	from user u
	left join
	`order` o
	on
	o.user_id=u.id
</select>

测试类

@Test
public void func5() throws IOException {

    // 1.加载配置文件
    InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
    // 2.创建sqlSessionFactory
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
    // 3.获取sqlsession
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // -------------------------------------------

    OrderDao mapper = sqlSession.getMapper(OrderDao.class);

    List<User> userAllOrderList = mapper.findUserAllOrder();

    System.out.println(userAllOrderList);

    // -------------------------------------------
}

原文地址:https://www.cnblogs.com/x54256/p/8538582.html

时间: 2024-10-08 13:07:43

Mybatis——传入POJO对象,动态SQL,多表关系的相关文章

MyBatis学习总结_11_MyBatis动态Sql语句

MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set foreach 1.if 对属性进行判断,如果不为空则执行判断条件 [html] view plaincopy <select id="selectByCriteria" parameterType="com.mu

MyBatis学习总结(六)——动态SQL

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) foreach where set trim 下面我们主要说 where set trim 这三个标签 1,where标签 <!-- 查询学生list,like姓名,=性别 --> <select id="getStudentListWhere" parameterTy

mybatis入门基础(五)----动态SQL

一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态sql,对查询条件进行判断,如果输入参数不为空才进行查询拼接. 1.3.UserMapper.xml 1 <!-- 用户信息综合查询 2 #{userCustom.sex}:取出pojo包装对象中性别值 3 ${userCustom.username}:取出pojo对象中用户名称 4 --> 5 &

mybatis入门篇3 ---- 动态sql,缓存,以及分页jar包的使用

首先我们来看一下动态sql,动态sql就是传递的参数不确定的时候,使用if,where,select,choose,set等标签,先来看一下 lib,rescources,以及utils里面文件不变,直接来看使用 直接看if跟where,if使用比较简单,就是if会有一个条件判断,如果条件满足,就会把if里面的sql语句块加入slq语句,where就是帮助我们加载一个where条件判断,并且会把拼接语句中的第一个and删除掉,接下来看一下例子 看一下UserMapper public inter

Mybatis映射原理,动态SQL,log4j

1.理清mybatis中的#和$之间的区别? #{ }:表示一个预处理参数,参数类型不定,是根据传入的参数类型来设定的. 类似于JDBC中的? 特例使用,模糊查询:(针对oracle): and username like concat(concat('%',#{username}),'%') 采取的$的方式传入参数,所有采取$的方式传入的参数都只是字符串(无论传入的是什么,都会当成字符串处理),潜在的危险就是SQL注入的问题. and username like '%${value}%' 注意

(转)Mybatis高级映射、动态SQL及获得自增主键

原文:http://www.cnblogs.com/edwinchen/p/4105278.html?utm_source=tuicool&utm_medium=referral 一.动态SQL 相信大家在用mybatis操作数据库时时都会碰到一个问题,假如现在我们有一个关于作者的list authorList,需要根据authorList里已有的作者信息在数据库中查询相应作者的博客信息.那么最容易想到的做法就是遍历authorList,获取相应的信息查询数据库. for(int i=0;I &l

Mybatis高级映射、动态SQL及获得自增主键

一.动态SQL 相信大家在用mybatis操作数据库时时都会碰到一个问题,假如现在我们有一个关于作者的list authorList,需要根据authorList里已有的作者信息在数据库中查询相应作者的博客信息.那么最容易想到的做法就是遍历authorList,获取相应的信息查询数据库. for(int i=0;I < authorList.size();i++) { …… //查询数据库代码 //select * from blog where author=#{author,jdbcType

MyBatis 之 使用五 动态SQL

MyBatis 提供使用 ognl 表达式动态生成 SQL的功能. 1. if 2. where where 可以自动处理掉第一个拼接条件里的 and <!-- 动态 sql 查询用户信息 -->   <select id="findUserByDynamicSql" parameterType="user" resultType="user">    select * from users    <!-- wher

【MyBatis学习07】动态sql

1. 动态sql 动态sql是mybatis中的一个核心,什么是动态sql?动态sql即对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装.就拿上一篇博文中对用户的综合查询一例来说: select * from user where user.sex = #{user.sex} and user.username like '%${user.username}%' 假如这个user是null咋整?或者user.sex或者user.username为null呢?所以更严谨的做