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. C / C ++ 基于梯度下降法的线性回归法(适用于机器学习)

    写在前面的话: 在第一学期做项目的时候用到过相应的知识,觉得挺有趣的,就记录整理了下来,基于C/C++语言 原贴地址:https://helloacm.com/cc-linear-regression ...

  2. POJ 1066--Treasure Hunt(判断线段相交)

    Treasure Hunt Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7857   Accepted: 3247 Des ...

  3. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--E-回旋星空

    链接:https://www.nowcoder.com/acm/contest/90/E 来源:牛客网 1.题目描述 曾经有两个来自吉尔尼斯的人(A和C)恋爱了,他们晚上经常在一起看头上的那片名为假的 ...

  4. 并查集(union-find sets)

    一.并查集及其优化 - 并查集:由若干不相交集合组成,是一种简单但是很好用的数据结构,拥有优越的时空复杂性,一般用于处理一些不相交集合的查询和合并问题. - 三种操作: 1.Make_Set(x) 初 ...

  5. ABAP术语-BAPI Explorer

    BAPI Explorer 原文:http://www.cnblogs.com/qiangsheng/archive/2007/12/24/1012110.html Tool for developi ...

  6. Golang定时器断续器

    定时器 1.定时器结构 结构定义 type Timer struct { C <-chan Time // 接受定时器事件的通道 r runtimeTimer } type runtimeTim ...

  7. 652. Find Duplicate Subtrees

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  8. RedHat6.4 安装yum源

    主要参考: http://blog.itpub.net/25313300/viewspace-708509/ http://blog.sina.com.cn/s/blog_50f908410101ct ...

  9. 【转】Django添加静态文件设置

    STATIC_URL = '/statics/'STATIC_ROOT= os.path.join(BASE_DIR, 'statics')STATICFILES_DIRS = ( os.path.j ...

  10. 用 Qt 控制 Nikon 显微镜的电动物镜转盘

    用 Qt 控制 Nikon 显微镜的电动物镜转盘 最近的一个项目,用到了一台 Nikon 的金相显微镜,并且配了个电动的物镜转盘.为了控制这个电动物镜转盘,我折腾了差不多有4-5天.中间遇到了各种问题 ...