mybatis

一.mybatis映射的配置文件解析:


(1).对应的实体类;

package cn.itcat.po;
import java.util.Date;

public class User {
    private int id;
    private String username;// 用户姓名
    private String sex;// 性别
    private Date birthday;// 生日
    private String address;// 地址

}//运行的时候生成get和set

(2)配置文件内容:

<?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命名空间:防止sql语句名字重名。具体用法稍后讲解  -->

<mapper namespace="test">

<!-- idsql语句唯一标识

parameterType:传入参数类型

resultType:返回结果集类型

#{}:占位符,如果传入的是简单类型(int,double,lang,String,boolean等),那么#{}占位符中的变量名称随意起名

-->

<select id="findUsaerById" parameterType="java.lang.Integer" resultType="cn.itcast.po.User">

select * from user where id=#{aaa}

</select>

<!--

${}:拼接符,如果传入的是简单类型,那么${}中的变量名称一定是value${value}.

注意:${}拼接符,有sql注入的风险,所以慎重使用。

 -->

<select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.po.User">

select * from user where username like '%${value}%'

</select>

<!-- 如果传入的是po类型,那么#{}占位符中的变量名称就应该是,po中的属性名称 -->

<insert id="saveUser" parameterType="cn.itcast.po.User">

<!--

使用selectKey标签来执行查询刚插入记录的主键

keyProperty:将查询出的主键放入User对象的id属性中

order:select last_insert_id()相对于insert语句的执行顺序,在insert之前执行用BEFORE

insert之后执行用AFTER

resultType:id属性的类型

-->

<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">

select last_insert_id()

</selectKey>

insert into user (username, birthday, sex, address)

values (#{username}, #{birthday}, #{sex}, #{address})

</i.nsert>


二.mybatis开发dao的两种方法:


(1).原生的dao(就是dao有接口和实现类).这个略

(2).mapper接口代理的开发方法:

只需要编写mapper接口,实现类由mybatis使用动态代理来自动生成实现类

Mapper接口编写规则:

映射文件中的namespace要等于接口的全路径名称

Sql语句的id要等于接口中的方法名

Sql语句的parameterType输入参数类型要等于接口方法的输入参数类型

Sql语句的resultType返回结果集类型要等于接口方法的返回值类型

引入Mapper映射文件规则:

当在sqlMapConfigxml中使用mapper中的class属性来引入映射文件的时候规则如下,

映射文件和Mapper接口要放在同一个目录下

映射文件和Mapper接口的文件名称必须一样 例如UserMapper.java  UserMapper.xml


接口:UserMapper.java

package cn.itcast.mapper;

 import java.util.List;

 import cn.itcast.po.User;

 public interface UserMapper {

 public User findUsaerById(Integer id);

public List<User>findUserByName(String userName);

public void saveUser(User user);

}

映射文件:UserMapper.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.itcast.mapper.UserMapper">

<select id="findUsaerById" parameterType="java.lang.Integer" resultType="cn.itcast.po.User">

select * from user where id=#{aaa}

</select>

<select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.po.User">

select * from user where username like '%${value}%'

</select>

核心配置文件:SqlMapConfig.xml

<mappers>

配置Mapper接口代理的单个映射文件

使用class属性引入映射文件要求:

1.映射文件和接口文件要在同一个目录下

2.映射文件和接口文件名称要相同  例如:UserMapper.java和  UserMapper.xml

-->

<mapper class="cn.itcast.mapper.UserMapper"/>

</mappers>

三.mybatis的动态sql语句 ;

1.Ifwhere标签用法

映射文件:

<select id="findUserByUserNameAndSex" parameterType="cn.itcast.po.User" resultType="cn.itcast.po.User">

       select * from user

      <!-- where标签可以自动添加sql语句中的where关键字 ,还可以将sql语句中的第一个and关键字去掉-->

   <where>

          <if test="username!=null and username!=''">

                and username like '%${username}%'

         </if>

        <if test="sex!=null and sex!=''">

      and sex=#{sex}

     </if>

  </where>

</select>

1.2

1.1 封装where条件

<!--

封装where条件,可以在sql语句中使用

id:是这个sql语句的唯一标识,可以在sql语句中通过id来调用此条件

 -->

<sql id="userNameAndSex_Where">

<!-- where标签可以自动添加sql语句中的where关键字 ,还可以将sql语句中的第一个and关键字去掉-->

<where>

<if test="username!=null and username!=''">

and username like '%${username}%'

</if>

<if test="sex!=null and sex!=''">

and sex=#{sex}

</if>

</where>

</sql>

 

<select id="findUserByUserNameAndSex" parameterType="cn.itcast.po.User" resultType="cn.itcast.po.User">

select * from user

<!-- 通过where条件的id使用封装的条件-->

<include refid="userNameAndSex_Where"></include>

</select>


2.1 Foreach循环

<select id="findUserByIds" parameterType="cn.itcast.vo.UserVo" resultType="cn.itcast.po.User">

select * from user

<where>

<if test="idList!=null">

<!--

collection:传入的集合的属性名称

item:遍历时起的临时变量名称

open:循环开始拼接的字符串

close:循环结束拼接的字符串

separator:中间分隔使用的字符串

 -->

<foreach collection="idList" item="idddd" open="id in(" close=")" separator=",">

#{idddd}

</foreach>

</if>

</where>

</select>


四.实例分析mybatis 的高级结果集的映射:如图(1)


                 图(1)


ResultType:可以将从数据库中的查询结果数据自动映射到po,但是如果po中包含另一个对象比如User对象或者List<User>对象,则无法将user查询的结果映射在集合中,所以需要使用resultMap进行手动映射。如图(2)



                                                            图(2)

映射文件:OrdersMapper.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.itcast.mapper.OrdersMapper">

<!--

resultMap:手动将查询结果映射在po

idresultMap的唯一标识

type:将查询结构放入orders对象中及返回的结果映射对应的实体类中

-->

<resultMap type="cn.itcast.po.Orders" id="ordersAndUserResultMap">

<!--

id标签指定主键字段的映射关系

column:指定数据库中的列

property:指定javapojo的属性

 -->

<id column="id" property="id"/>

<!--

result标签指定非主键字段的映射关系

column:指定数据库中的列

property:指定javapojo的属性

 -->

<result column="user_id" property="userId"/>

<result column="number" property="number"/>

<result column="createtime" property="createtime"/>

<result column="note" property="note"/>

<!--

association:标签指定单个对象关系的映射

property:存到orders对象中的user属性中

 -->

<association property="user" javaType="cn.itcast.po.User">

<id column="userId" property="id"/>

<result column="username" property="username"/>

<result column="birthday" property="birthday"/>

<result column="sex" property="sex"/>

<result column="address" property="address"/>

</association>

</resultMap>

<select id="findOrdersAndUser" resultMap="ordersAndUserResultMap">

select

orders.*,

user.id userId,user.username,user.birthday,user.sex,user.address

from

orders,user

where

user.id=user_id

</select>

</mapper>


接口:OrdersMapper.java

package cn.itcast.mapper;

 import java.util.List;

 import cn.itcast.po.Orders;

 

public interface OrdersMapper {

public List<Orders> findOrdersAndUser();

}


Po: Orders.java

package cn.itcast.po;

 

import java.util.Date;

 

public class Orders {

    private Integer id;

     private Integer userId;

     private String number;

     private Date createtime;

     private String note;

private User user;//两个实体类之间联系的(一对一的关系)

     public Integer getId() {

        return id;

    }

     public void setId(Integer id) {

        this.id = id;

    }

     public Integer getUserId() {

        return userId;

    }

     public void setUserId(Integer userId) {

        this.userId = userId;

    }

    public String getNumber() {

        return number;

    }

     public void setNumber(String number) {

        this.number = number == null ? null : number.trim();

    }

     public Date getCreatetime() {

        return createtime;

    }

     public void setCreatetime(Date createtime) {

        this.createtime = createtime;

    }

     public String getNote() {

        return note;

    }

    public void setNote(String note) {

        this.note = note == null ? null : note.trim();

    }

 public User getUser() {

return user;

}

 

public void setUser(User user) {

this.user = user;

}

}

测试代码:

package cn.itcast;

 

import java.io.InputStream;

import java.util.List;

 

import org.apache.ibatis.io.Resources;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import org.junit.Before;

import org.junit.Test;

 

import cn.itcast.mapper.OrdersMapper;

import cn.itcast.po.Orders;

 

public class OrdersMapperTest {

private SqlSessionFactory sqlSessionFactory;

@Before

public void setUp() throws Exception{

//指定核心配置文件名称

String resource = "SqlMapConfig.xml";

//创建核心配置文件输入流

InputStream inputStream = Resources.getResourceAsStream(resource);

//通过核心配置文件输入流,创建会话工厂

sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

}

 

@Test

public void testFindOrdersAndUser() throws Exception{

SqlSession openSession = sqlSessionFactory.openSession();

OrdersMapper mapper = openSession.getMapper(OrdersMapper.class);

List<Orders> list = mapper.findOrdersAndUser();

System.out.println(list);

openSession.close();

}

}


5.1 一对多

映射文件:


!-- 用户和订单关系映射使用extends继承 -->

<resultMap type="cn.itcast.po.Orders" id="userOrdersAndDetailResultMap" 

extends="ordersAndUserResultMap">

<!--

collection:使用这个标签来指定集合的映射关系

property:将查询结果放到orders对象中的detailList集合属性中

ofType:指定集合属性中泛型对象的类型.例如List<Orderderail>

 -->

<collection property="detailList" ofType="cn.itcast.po.Orderdetail">

<id column="detailId" property="id"/>

<result column="orders_id" property="ordersId"/>

<result column="items_id" property="itemsId"/>

<result column="items_num" property="itemsNum"/>

</collection>

</resultMap>

 

 

<select id="findUserOrdersAndDetail" resultMap="userOrdersAndDetailResultMap">

select

orders.*,

user.id userId,user.username,user.birthday,user.sex,user.address,

orderdetail.id detailId, orderdetail.orders_id,orderdetail.items_id,orderdetail.items_num

from

orders,user ,orderdetail

where

user.id=user_id and orders.id=orderdetail.orders_id

</select>

public List<Orders> findUserOrdersAndDetail();

public class Orders {

    private Integer id;

 

    private Integer userId;

 

    private String number;

 

    private Date createtime;

 

    private String note;

    

    private User user;//和oders是一对一的关系

    

    private List<Orderdetail> detailList;//和oders是一对多的关系

}

6.1多对多

映射文件:

<resultMap type="cn.itcast.po.User" id="findAllResultMap">

<id column="userId" property="id"/>

<result column="username" property="username"/>

<result column="birthday" property="birthday"/>

<result column="sex" property="sex"/>

<result column="address" property="address"/>

<!-- 保存订单集合对象 -->

<collection property="ordersList" ofType="cn.itcast.po.Orders">

<id column="id" property="id"/>

<result column="user_id" property="userId"/>

<result column="number" property="number"/>

<result column="createtime" property="createtime"/>

<result column="note" property="note"/>

<!-- 保存订单详情集合对象 -->

<collection property="detailList"  ofType="cn.itcast.po.Orderdetail">

<id column="detailId" property="id"/>

<result column="orders_id" property="ordersId"/>

<result column="items_id" property="itemsId"/>

<result column="items_num" property="itemsNum"/>

<!-- 保存单个商品对象 -->

<association property="items" javaType="cn.itcast.po.Items">

<id column="itemsId" property="id"/>

<result column="name" property="name"/>

<result column="price" property="price"/>

<result column="detail" property="detail"/>

<result column="items_createtime" property="createtime"/>

</association>

</collection>

</collection>

</resultMap>

 

<select id="findAll" resultMap="findAllResultMap">

select

orders.*,

user.id userId,user.username,user.birthday,user.sex,user.address,

orderdetail.id detailId, orderdetail.orders_id,orderdetail.items_id,orderdetail.items_num,

items.id itemsId,items.name,items.price,items.detail,items.createtime items_createtime

from

orders,user ,orderdetail, items

where

user.id=user_id and orders.id=orderdetail.orders_id and items.id=orderdetail.items_id

 

</select>
























  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值