映射器
1.映射器主要元素
元素 | 描述 | 备注 |
select | 用于查询 | 可定义参数、返回结果集等 |
insert | 插入语句 | 执行后返回一个整数,代表插入的条数 |
update | 更新 | 执行后返回一个整数,代表更新的条数 |
delete | 删除 | 执行后返回一个整数,代表删除的条数 |
parameterMap | 定义参数映射 | 即将删除,暂不讨论 |
sql | 定义一部分sql,可以重复引用,一般用于select返回结果 | 比如定义一份表的列名,在其它sql中使用 |
resultMap | 定义从数据库中查询出来的各种信息 | |
cache | 给定命名空间的缓存配置 | |
cache-ref | 其它命名空间缓存配置的引用 |
2.select
元素 | 说明 | 备注 |
id | 与Mapper接口中对应的方法一致,且与Mapper的命名空间组合起来是唯一的。 | 命名空间+id必须保证唯一,否则报错 |
parameterType | 参数类型,可以是类全名、类别名即类对象,各种数据类型String、int、float等。 | JavaBean、Map、List均可。 |
parameterMap | 即将删除,暂不讨论 | |
resultType | 自动匹配时,可以定义类全名,结果集将与JavaBean映射,返回实体对象。 也可返回int、double、float,即查询出数据库中特定的字段信息。 注意:不能与resultMap同时使用。 | 比如根据主键id查找某条实体对象、查询所有数据信息的数量int等。 |
resultMap | 映射集 | 一般把某一实体的对象属性与表中列一一对应起来,可以重复引用。 |
useCache | 启动二级缓存开关,是否把此次结果缓存 | 取布尔值true/false,默认true。 |
2.1简单查询
BookMapper mapper = session.getMapper(BookMapper.class);
int all = mapper.countAllByAuthor("qqq");
System.out.println(all);
public int countAllByAuthor(String author);//根据作者名模糊统计数量
参数为String类型,返回结果为int类型。
<select id="countAllByAuthor" resultType="int" parameterType="String">
select COUNT(*) as total
from book
where author like concat('%',#{author},'%')
</select>
2.2 自动映射
上篇文章中介绍到autoMappingBehavior参数,当不为NONE时将提供自动映射功能,只要返回的SQL列名和JavaBean属性一致就能自动对应匹配。
定义查询语句:
<select id="getById" resultType="cn.wsz.mybatis.domain.Book" parameterType="Long">
select id, name, author, price, des, date
from book
where id = #{id}
</select>
定义mapper方法
public Book getById(Long id);
获取方法:
BookMapper mapper = session.getMapper(BookMapper.class);
Book book = mapper.getById(10L);
System.out.println(book.toString());
获取结果:
Book [id=10, name=87, author=87, price=5.0, des=87, date=null]
2.3 sql
利用自动映射,可以简化查询结果集。比如以下定义实体类的属性列,也可以在其他地方重复引用。
注意:对应属性是否一致。如果POJO采用驼峰命名,数据库列每一个单词都用下划线分隔,可以设置mapUnderscoreToCamelCase为true,便能自动映射
mybatis配置文件增加:
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
定义sql:
POJO属性:
<sql id="Base_Column">
id,name,author,real_name,price,des,date
</sql>
POJO属性:
@Setter
@Getter
private long id;
@Setter
@Getter
private String name;
@Setter
@Getter
private String author;
@Setter
@Getter
private String realName;
@Setter
@Getter
private float price;
@Setter
@Getter
private String des;
@Setter
@Getter
private Date date;
在查询语句中引用sql:
<select id="findOne" resultType="cn.wsz.mybatis.domain.Book" parameterType="Long">
select <include refid="Base_Column"/>
from book
where id = #{id}
</select>
mapper接口方法:
public Book findOne(Long id);
查询方法:
BookMapper mapper = session.getMapper(BookMapper.class);
Book book = mapper.findOne(14L);
System.out.println(book.toString());
查询结果:
Book{id=14, name='88', author='88', realName='14', price=5.0, des='88', date=Tue Nov 07 21:24:23 CST 2017}
2.4 resultMap
<resultMap type="cn.wsz.mybatis.domain.Book" id="BaseResultMap"> //唯一标识id <id property ="id" column="id"/> //主键 <result property="name" column="name"/> //其他 <result property="author" column="author"/>
<result property="price" column="price"/><result property="des" column="des"/><result property="date" column="date"/></resultMap><result property="realName" column="real_name"/>
2.5传递多个参数
map传递参数<select id="findByMap" parameterType="map" resultMap="BaseResultMap"> select <include refid="Base_Column"/> from book where author like concat('%',#{author},'%') or name like concat('%',#{name},'%') </select>
public List<Book> findByMap(Map<String,Object> map);
BookMapper mapper = session.getMapper(BookMapper.class);
Map<String,Object> map = new HashMap<String,Object>();
map.put("author","q");
map.put("name","a");
List<Book> list = mapper.findByMap(map);
System.out.println(list.size());
使用注解传递参数
<select id="findByAno" resultMap="BaseResultMap">
select <include refid="Base_Column"/>
from book
where author like concat('%',#{author},'%') or name like concat('%',#{name},'%')
</select>
public List<Book> findByAno(@Param("author")String author,@Param("name")String name);
BookMapper mapper = session.getMapper(BookMapper.class);
List<Book> list = mapper.findByAno("q","a");
System.out.println(list.size());
使用JavaBean传递参数
<select id="findByJavaBean" resultMap="BaseResultMap" parameterType="cn.wsz.mybatis.domain.Book">
select <include refid="Base_Column"/>
from book
where author like concat('%',#{author},'%') or name like concat('%',#{name},'%')
</select>
public List<Book> findByJavaBean(Book book);
BookMapper mapper = session.getMapper(BookMapper.class);
Book book = new Book();
book.setAuthor("q");
book.setName("a");
List<Book> list = mapper.findByJavaBean(book);
System.out.println(list.size());
3.insert
提供主键回填,可以获取新增主键id
<insert id="insertBook" useGeneratedKeys="true" keyProperty="id" parameterType="cn.wsz.mybatis.domain.Book">
insert into book(id,name,author,price,des,date)
values(#{id},#{name},#{author},#{price},#{des},#{date})
</insert>
<insert id="batchInsert"> insert into book(id,name,author,price,des,date) values <foreach item="item" index="key" collection="list" open="" separator="," close=""> (#{item.id},#{item.name},#{item.author},#{item.price},#{item.des},#{item.date}) </foreach> </insert>
4.update
<update id="updateBook" parameterMap="book">
update book
set name = #{name},author = #{author},price = #{price},des = #{des}
where id = #{id}
</update>
5.delete
<delete id="deleteById" parameterType="java.lang.Long">
delete
from book
where id = #{id}
</delete>
<delete id="batchDelete">
delete
from book
where id in
<foreach collection="list" item="id" index="key" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
insert、update、delete方法请查阅前面的文章,此处不再赘述。