Mybatis 输入映射和输出映射

来源:互联网 发布:最惨的动漫男主 知乎 编辑:程序博客网 时间:2024/06/05 20:41
1.如何使 Mapper.xml 文件和 Mapper 接口进行匹配 ?
(1) 接口的全类名要和 Mapper.xml 文件中的 namespace 对应 ! 默认Mapper.xml 文件和 Maper 接口需要在同一个包下。
<!--namespace: 名称空间. 是对当前 Mapper 文件的唯一标示.通常以 (实体类类名 + Mapper)结尾 -->< mapper namespace ="com.guigu.mybits.mapper.StudentMapper">......</ mapper>
(2)  接口中的方法名和所对应XML文件中的id相一致。
public interface StudentMapper {      Student selectStudent(@Param("id") Integer StudentId);  }
<!--          映射一个查询语句          1. id 唯一标识改查询语句. 可以通过当前映射文件的 namespace 和 id 来唯一的定位到当前的 select.          2. resultType 指定返回值的类型. 通常为全类名.          3. 注意: 若类的属性名和数据表的列名不一致, 则可以使用别名--><select id="selectStudent" resultType="com.guigu.mybits.beans.Student" >     select StudentId,Student_Name AS "StudentName",birth from students where StudentId = #{id}</select >
2. 关于为 Mapper 的方法传递参数
(1) 若传递一个参数, 则可以什么多不做. 在 Mapper.xml 文件中的参数名可以随便写.
     建议使用 @Param 注解进行对应
在studentMapper.java中Student selectStudent(@Param("id") Integer id);
在StudentMapper.xml中<select id="selectStudent" resultType="com.atguigu.mybatis.beans.Student">     select id, last_name AS "lastName", birth from students where id = #{id}</select>
(2) 若传递多个参数, 则有 3 种方式.
    ① 传递一个对象. 然后使对象的 get方法对应的属性和 SQL 语句中的变量名相对应
void save(Student student);
<insert id="save">     INSERT INTO students (last_name, birth)     VALUES  (#{lastName},  #{birth} )</insert>
public class MyBitsTest {     private ApplicationContext ctx = null;     private StudentMapper studentMapper=null ;     {           ctx = new ClassPathXmlApplicationContext("beans.xml" );           studentMapper =ctx .getBean(StudentMapper.class);     }@Test     public void save1(){          Student student = new Student();          student.setStudentName( "hahah");          student.setBirth( new Date());          studentMapper.save(student);     }}
    ② 传递一个 Map 类型的参数, 在具体使用参数时会调用 Map 的 get(参数名) 方法
void save3(Map<String, Object> params);
<insert id="save3">     INSERT INTO students(last_name, birth)     VALUES(#{lastName}, #{birth})</insert>
 @Test     public void save3(){          Map<String,Object> params = new HashMap<>();          params.put( "StudentName","lmk" );          params.put( "birth",new Date());           studentMapper.save3(params);     }
    ③ 使用多个 @Param 注解. 使变量名和 SQL 语句中变量名对应
void save2(@Param("lastName") String lastName,@Param("birth") Date birth);
<insert id="save2">     INSERT INTO students(last_name, birth)     VALUES(#{lastName}, #{birth})</insert>
@Test     public void save2(){           studentMapper.save2("abcd" ,new Date());     }
    注意: 以上 3 种传递参数的方式不能混用.

3.parameterType(输入类型)
(1) 传递简单类型
    参考上面的代码:使用#{}占位符,或者${}进行sql拼接。
(2) 传递pojo对象
    参考上面的代码:Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称。
(3) 传递pojo包装对象
    查询条件可能是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如查询用户信息的时候,将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。
    包装对象:Pojo类中的一个属性是另外一个pojo。

4.resultType(输出类型)
(1) 输出简单类型
(2) 输出pojo对象
(3) 输出pojo列表

5.resultMap
    resultType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
    如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。
    resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
需求:查询订单表order的所有数据
(1) 数据库
CREATE TABLE `orders` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `user_id` int(11) NOT NULL COMMENT '下单用户id',  `number` varchar(32) NOT NULL COMMENT '订单号',  `createtime` datetime NOT NULL COMMENT '创建订单时间',  `note` varchar(100) DEFAULT NULL COMMENT '备注',  PRIMARY KEY (`id`),  KEY `FK_orders_1` (`user_id`),  CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
(2) Order对象:
package com.itheima.mybatis.pojo;import java.io.Serializable;import java.util.Date;public class Orders  implements Serializable{    @Override    public String toString() {        return "Orders [id=" + id + ", userId=" + userId + ", number=" + number + ", createtime=" + createtime                + ", note=" + note + "]";    }    /**     *     */    private static final long serialVersionUID = 1L;    private Integer id;    private Integer userId;    private String number;    private Date createtime;    private String note;        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();    }}
(3)Mapper.xml文件:创建OrderMapper.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd";><mapper namespace="com.itheima.mybatis.mapper.OrderMapper">    <resultMap type="Orders" id="orders">         <result column="user_id" property="userId"/>    </resultMap>        <select id="selectOrdersList" resultMap="orders">         SELECT id, user_id, number, createtime, note FROM orders    </select></mapper>
(4) 编写接口如下:
public interface OrderMapper {    //  查询订单表order的所有数据    public List<Orders> selectOrdersList();}
(5) 测试方法
public class MybatisMapperTest {//  查询订单表order的所有数据    @Test    public void testOrderList() throws Exception {         //加载核心配置文件         String resource = "sqlMapConfig.xml";         InputStream in = Resources.getResourceAsStream(resource);         //创建SqlSessionFactory         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);         //创建SqlSession         SqlSession sqlSession = sqlSessionFactory.openSession();                  OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);                  List<Orders> ordersList = mapper.selectOrdersList();         for (Orders orders : ordersList) {             System.out.println(orders);         }    }}

阅读全文
0 0
原创粉丝点击