一.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">
<!-- id:sql语句唯一标识
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.If和where标签用法
映射文件:
<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中
id:resultMap的唯一标识
type:将查询结构放入orders对象中及返回的结果映射对应的实体类中
-->
<resultMap type="cn.itcast.po.Orders" id="ordersAndUserResultMap">
<!--
id标签指定主键字段的映射关系
column:指定数据库中的列
property:指定java中pojo的属性
-->
<id column="id" property="id"/>
<!--
result标签指定非主键字段的映射关系
column:指定数据库中的列
property:指定java中pojo的属性
-->
<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>