Mapper映射文件,作用是用来配置SQL映射语句,根据不同的SQL语句性质,使用不同的标签,mapper文件中常用的标签有<iselect>、<insert>、<update>、<delete>

常见增删改查示例

<!-- namespace:此处使用包名+文件名 的形式 -->
<mapper namespace="com.sl.mapper.ProductMapper"> <!--select – 映射查询语句
id:唯一标识 parameterType:参数类型,此处是根据id查询,类型为int resultType:返回值类型,
#{id}: 参数 -->
<select id="selectProduct" parameterType="int" resultType="com.sl.po.Product">
select * from products where id = #{id}
</select> <!-- insert – 映射插入语句
注: sql中参数最好和po中属性命名一致
-->
<insert id="insertProduct" parameterType="com.sl.po.Product">
insert into products(name,description,UnitPrice,IsNew)
values(#{name},#{description},#{UnitPrice},#{IsNew})
</insert> <!-- update – 映射更新语句 -->
<update id="updateProduct" parameterType="com.sl.po.Product">
update products set UnitPrice = #{UnitPrice},IsNew=#{IsNew} where id=#{id}
</update> <!-- delete – 映射删除语句-->
<delete id="deleteProduct" parameterType="int">
delete from products where id=#{id}
</delete>
</mapper>

测试代码:

public class TestClient {

    // 定义会话SqlSession
SqlSession session = null; @Before
public void init() throws IOException {
// 定义mabatis全局配置文件
String resource = "SqlMapConfig.xml"; // 加载mybatis全局配置文件
// InputStream inputStream =
// TestClient.class.getClassLoader().getResourceAsStream(resource); InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
// 根据sqlSessionFactory产生会话sqlsession
session = factory.openSession();
} // select by id
// @Test
public void testSelectProduct() {
String statement = "com.sl.mapper.ProductMapper.selectProduct";
Product product = session.selectOne(statement, 1);
System.out.println(product); session.close();
} // insert
// @Test
public void testInsertProduct() {
String statement = "com.sl.mapper.ProductMapper.insertProduct";
Product product = new Product();
product.setName("小酒馆");
product.setDescription("xxxx");
product.setIsNew(true);
product.setUnitPrice(new BigDecimal(1000));
int count = session.insert(statement, product);
// System.out.println(product);
session.commit();// insert 需要commit
session.close();
} // update
// @Test
public void testUpdateProduct() {
String statement = "com.sl.mapper.ProductMapper.updateProduct";
Product product = new Product();
product.setId(24);
product.setIsNew(true);
product.setUnitPrice(new BigDecimal(2000)); int count = session.update(statement, product);
// System.out.println(product);
session.commit();// insert 需要commit
session.close();
} // update
// @Test
public void testProduct() {
String statement = "com.sl.mapper.ProductMapper.deleteProduct"; int count = session.delete(statement, 24);
// System.out.println(product);
session.commit();// insert 需要commit
session.close();
}
}

Mapper 输入参数映射配置

Mybatis中parameterType为输入参数类型,可以配置为基本数据类型、基本数据包装类型、或自定义数据类型(JavaBean),Sql语句中使用#{}或${}传入参数。

#{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符,使用占位符#{}可以防止sql注入,使用时不需要关心参数值的类型,mybatis将自动进行java类型和jdbc类型的转换。

${}可以将参数拼接在sql中且不进行jdbc类型转换,${}可以接收简单类型值或pojo属性值,如果传入的是个简单类型,括号中只能是value,即:${value}:

注:parameterType为非必填属性,下面的情况中parameterType省略不写也不会报错。

示例:

     <!-- ${} sql拼接 -->
<select id="selectProductByName" parameterType="string" resultType="com.sl.po.Product">
select * from products where name like '%${value}%'
</select>
<!-- #{} 参数化 -->
<select id="selectProductByName2" parameterType="string" resultType="com.sl.po.Product">
select * from products where name like #{value}
</select>
@Test
public void testSelectByProductName() {
//使用like '%${value}%'
String statement = "com.sl.mapper.ProductMapper.selectProductByName";
List<Product> listProduct = session.selectList(statement,"琶洲");
for (Product product : listProduct) {
System.out.println(product);
} System.out.println("***************************************************"); //使用 like #{value}
String statement2 = "com.sl.mapper.ProductMapper.selectProductByName2";
List<Product> listProduct2 = session.selectList(statement2,"%国际%");
for (Product product : listProduct2) {
System.out.println(product);
}
// 关闭会话
session.close();
}

映射基本数据类型

<select id="selectProduct" parameterType="int" resultType="com.sl.po.Product">
select * from products where id = #{id}
</select>

映射基本数据类型时,参数名也可用value代替,#{value}   即:  select * from products where id = #{value}

映射pojo对象

<!-- pojo -->
<select id="selectProductByPoJo" parameterType="com.sl.po.Product" resultType="com.sl.po.Product">
select * from products where unitprice>#{UnitPrice} and isnew =#{IsNew}
</select>

参数名必须与pojo对象属性一致,此处UnitPrice 与 IsNew为Product属性。

       @Test
public void testselectProductByPoJo() { String statement = "com.sl.mapper.ProductMapper.selectProductByPoJo";
Product pro = new Product();
pro.setUnitPrice(new BigDecimal(30));
pro.setIsNew(true); List<Product> listProduct = session.selectList(statement,pro);
for (Product product : listProduct) {
System.out.println(product);
} // 关闭会话
session.close();
}

映射pojo封装对象

    <!-- pojo包装对象 -->
<select id="selectProductByVo" parameterType="com.sl.po.ProductVo" resultType="com.sl.po.Product">
select * from products where citycode=#{product.cityCode} and isnew =#{product.isNew}
</select>
       @Test
public void testselectProductByVo() { String statement = "com.sl.mapper.ProductMapper.selectProductByVo";
ProductVo vo= new ProductVo();
//vo.setCategory(category);
Product po =new Product();
po.setCityCode("A01");
po.setIsNew(true);
vo.setProduct(po); List<Product> listProduct = session.selectList(statement,vo);
for (Product product : listProduct) {
System.out.println(product);
} // 关闭会话
session.close();
}
public class ProductVo {

    private int category;

    private Product product;

    public int getCategory() {
return category;
} public void setCategory(int category) {
this.category = category;
} public Product getProduct() {
return product;
} public void setProduct(Product product) {
this.product = product;
}
}

映射hashmap

     <!-- hashmap -->
<select id="selectProductByHashMap" parameterType="hashmap" resultType="com.sl.po.Product">
select * from products where citycode=#{cityCode} and isnew =#{isNew}
</select>
       @Test
public void testselectProductByHashMap() { String statement = "com.sl.mapper.ProductMapper.selectProductByHashMap"; HashMap<String, Object> map =new HashMap<String, Object>();
map.put("cityCode", "A02");
map.put("isNew", true); List<Product> listProduct = session.selectList(statement,map);
for (Product product : listProduct) {
System.out.println(product);
} // 关闭会话
session.close();
}

Mapper 结果集映射配置

MyBatis的mapper映射文件中,resultType为输出结果集类型,同样支持基本数据类型及自定义数据类型。SQL语句查询后返回的结果集会映射到配置标签的输出映射属性对应的Java类型上。Mapper的输出映射有两种配置,分别是resultType和resultMap,注意两者不能同时使用。

映射基本数据类型

<!-- 返回结果只有一行一列时可以使用基本数据类型 -->
<select id="countProducts" resultType="int">
select count(1) from products
</select>
       @Test
public void testCountProduct() {
String statement = "com.sl.mapper.ProductMapper.countProducts"; int count = session.selectOne(statement);
System.out.println(count);
session.commit();// insert 需要commit
session.close();
}

映射pojo对象

<!-- 返回自定义类型  返回List<PoJo>,  resultType配置为PoJo类型,而不是List-->
<select id="selectProductById" parameterType="int" resultType="com.sl.po.Product">
select * from products where id = #{id}
</select>
public void testSelectProduct() {
String statement = "com.sl.mapper.ProductMapper. selectProductById ";
Product product = session.selectOne(statement, 1);
System.out.println(product); session.close();
}

映射pojo列表

注意:映射pojo单个对象和映射pojo列表mapper配置文件中resultType都配置为pojo类型,

区别只是返回单个对象是内部调用session.selectOne返回pojo对象,返回pojo列表时内部调用session.selectList方法。

<!-- 返回自定义类型
返回单个对象,  resultType为返回对象的类型 
--> <select id="selectAllProduct" resultType="com.sl.po.Product"> select * from products </select>
        @Test
public void testSelectAllProduct() {
String statement = "com.sl.mapper.ProductMapper.selectAllProduct";
List<Product> listProduct = session.selectList(statement);
for (Product product : listProduct) {
System.out.println(product);
}
// 关闭会话
session.close();
}

映射hashmap

     <!-- 返回hashmap -->
<select id="selectProductById2" parameterType="int" resultType="hashmap">
select * from products where id = #{id}
</select>
<!-- 返回List<hashmap> -->
<select id="selectAllProduct2" resultType="hashmap">
select * from products
</select>
     @Test
public void testSelectProductById() {
String statement = "com.sl.mapper.ProductMapper.selectProductById2";
HashMap<String, Object> map = session.selectOne(statement, 1); Iterator<Map.Entry<String, Object>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Object> entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
// 关闭会话
session.close();
} @Test
public void testSelectProducts2() {
String statement = "com.sl.mapper.ProductMapper.selectAllProduct2"; List<HashMap<String, Object>> list = session.selectList(statement); for (HashMap<String, Object> map : list) {
Iterator<Map.Entry<String, Object>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Object> entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
} // 关闭会话
session.close();
}

使用resultMap映射结果集

使用resultType可以映射结果集时需要pojo的属性名和sql查询结果的列名一致才可以映射成功。如果sql查询结果集字段名和pojo的属性名不一致,则需要通过resultMap将字段名和属性名作一个对应关系(sql 查询取别名与pojo属性一致也可以) ,resultMap实质上还需要将查询结果映射到pojo对象中。resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

    <!-- 使用resultMap映射结果集   -->
<select id="selectProductInfo" resultMap="productInfoResultMap">
select p.`Name` pName,p.Description,c.citycode,c.`name` cName
from products p
join city c
on p.citycode = c.citycode
</select>
<resultMap id="productInfoResultMap" type="com.sl.po.ProductInfo">
<result property="ProductName" column="pName"/>
<result property="CityName" column="cName"/>
</resultMap>
@Test
public void testselectProductInfo() {
String statement = "com.sl.mapper.ProductMapper.selectProductInfo"; List<ProductInfo> list = session.selectList(statement);
for (ProductInfo info : list) {
System.out.println(info);
}
session.close();
}
public class ProductInfo {

    private int Id;
private String ProductName;
private String Description;
private String CityCode;
private String CityName; public int getId() {
return Id;
}
public void setId(int id) {
Id = id;
}
public String getProductName() {
return ProductName;
}
public void setProductName(String productName) {
ProductName = productName;
}
public String getDescription() {
return Description;
}
public void setDescription(String description) {
Description = description;
}
public String getCityCode() {
return CityCode;
}
public void setCityCode(String cityCode) {
CityCode = cityCode;
}
public String getCityName() {
return CityName;
}
public void setCityName(String cityName) {
CityName = cityName;
} @Override
public String toString() {
return "Product [id=" + Id + ", ProductName=" + ProductName + ", Description=" + Description
+ ", CityCode=" + CityCode + ", CityName=" + CityName + "]";
}
}

Mybatis学习系列(二)Mapper映射文件的更多相关文章

  1. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

  2. 深入浅出Mybatis系列八-mapper映射文件配置之select、resultMap

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之inse ...

  3. 深入浅出Mybatis系列七-mapper映射文件配置之insert、update、delete

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇文章<深入浅出Mybatis系列(六)---objectFactory.p ...

  4. Mybatis学习(三)————— 映射文件详解

    前面说了全局配置文件中内容的详解,大家应该清楚了,现在来说说这映射文件,这章就对输入映射.输出映射.动态sql这几个知识点进行说明,其中高级映射(一对一,一对多,多对多映射)在下一章进行说明. 一.输 ...

  5. mybatis学习 (五) POJO的映射文件

    Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心. 1.parameterType(输入类型) 通过parameterType ...

  6. mybatis学习系列二

    1 参数处理(封装map过程)(23) 1.1)F5进入断点:Employee employee1=mapper.selectEmployeeByMap(map); 1.2)进入MapperProxy ...

  7. MyBatis入门程序之mapper映射文件常用配置命令

    1.ResultMap高级结果映射 如果查询出的列名和属性名不一致,可以通过ResultMap做映射,放在statement的输出类型中 如下: 2.动态SQL,使用各种动态标签实现动态拼接sql,常 ...

  8. maven的学习系列(二)—maven的文件夹结构

    maven的文件有自己的组织方式,例如以下所看到的: ---maven ----src ---main ----java ---test ----java -----pom.xml 当运行完mvn c ...

  9. MyBatis学习系列三——结合Spring

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...

  10. MyBatis学习系列一之环境搭建

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 学习一个新的知识,首先做一个简单的例子使用一下,然后再逐步深入.MyBat ...

随机推荐

  1. jquery mobile 移动web(6)

    jquery mobile 针对移动端设备的事件类型. 1.touch 事件. tap 快速触摸屏幕并且离开,类似一种完整的点击操作. taphold 触摸屏幕并保持一段时间. swipe 在1秒内水 ...

  2. [洛谷P1390]公约数的和·莫比乌斯反演

    公约数的和 传送门 分析 这道题很显然答案为 \[Ans=\sum_{i=1}^n\sum_{j=i+1}^n (i,j)\] //其中\((i,j)\)意味\(gcd(i,j)\) 这样做起来很烦, ...

  3. 【控制连接实现信息共享---linux和设备下ssh和远程连接telnet服务的简单搭建】

    SSH的配置 空密码登陆ssh server 如果要登录ssh server通常要在server和client之间采取具有共同加密的秘钥,若每次当client想要了:连接ssh server时都要手工 ...

  4. 【c学习-7】

    #include /*#include"test31.c"*/ //定义阶乘函数 /* int fac(int n){ //定义寄存器存储变量 register int i ,f= ...

  5. redis之cluster(集群)

    搭建redis cluster 1. 准备节点 2. 节点间的通信 3. 分配槽位给节点 redis-cluster架构 多个服务端,负责读写,彼此通信,redis指定了16384个槽. 多匹马儿,负 ...

  6. 吐血分享:QQ群霸屏技术教程2017(问题篇)

    霸屏技术,问题篇后,暂时搁置,尔望后续. 这里针对操作中,经常遇到的问题,做个简单整理. 回忆下,排名流程. 1.建群,品牌产品群,做任何关键词都是品牌产品群,皆因其有独特的优势. 2.拉人,填充群人 ...

  7. 源码安装CentOs7下的PHP7

    首先安装APACHE环境,直接用yum安装 yum install httpd httpd-devel /etc/httpd/ systemctl start httpd.service #启动apa ...

  8. JQ 封装全选函数

    单击时触发效果: 如果有一个没有选中把全选的勾去了,如果select所有的都选中了,那就把全选勾上 html里: <div class="row cl"> <la ...

  9. laravel框架excel 的导入导出功能

      1.简介 Laravel Excel 在 Laravel 5 中集成 PHPOffice 套件中的 PHPExcel,从而方便我们以优雅的.富有表现力的代码实现Excel/CSV文件的导入和导出. ...

  10. numpy数组用法大全

    机器学习的最基础模块就是numpy模块了,而numpy模块中的数组操作又是重中之重,所以我们要把数组的各种方法弄得明明白白的,以下就是数组的一些常用方法 1.创建各种各样的数组: import num ...