MyBatis 之 使用四(一) (mapper.xml)

mapper.xml 映射文件是 MyBatis 的核心,定义了操作数据库的 sql,每个sql 是一个statement。

  1. parameterType(输入类型),输入类型包括:基本类型、pojo对象类型、hashmap、

    a. #{} 与 ${}

    #{} 是向 prepareStatement 中的预处理语句中设置参数值,表示一个占位符,相当于 ? 。使用占位符 #{} 可以有效防止sql 注入,在使用时不需要关心参数值的类型,mybatis 会根据参数值的类型调用不同的statement 设置参数值的方法。注意:#{} 中的参数名 通常和 mapper 接口的形参名称相同,也可以设置成任意值。

    ${} 与 #{} 不同,${} 是将参数值不加修饰的拼接在 sql 中,相当于 JDBC 的 statement 拼接sql,不能防止sql注入。但是有时候会使用比较方法:如下:

    1. <!-- 根据用户名查询用户信息 -->
      <select id="findUserByUsername" parameterType="string" resultType="user">
      	select * from users where username like ‘%${value}%‘
      </select>
      
      <!-- 综合查询用户信息 -->
      <select id="findUserList" parameterType="user" resultType="user">
      	select * from users where username like ‘%${username}%‘ and sex = #{sex}
      </select>

      注意:如果 parameterType 是基本类型,那么${变量名} 中变量名必须是value;如果是 pojo 对象类型,那么变量名是 pojo 对象的属性名。

    2. 基本类型--不做介绍了
    3. pojo对象类型:上面代码第二个<select> 中 parameterType 就是 User 对象类型,可直接调用该对象的属性
    4. public List<User> findUserList() throws Exception {
      	SqlSession sqlSession = sqlSessionFactory.openSession();
      	UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
      
      	User user = new User();
      	user.setUsername("Anna");
      	user.setSex("0");
      
      	List<User> users = usermapper.findUserList(user);
      	System.out.println(users.size());
      	Iterator<User> iterator = users.iterator();
      	while (iterator.hasNext()) {
      		User user2 = iterator.next(); 
      		System.out.println(user2);
      	}
      	return users;
      }
    5. hashmap类型:代码中 HashMap 中的key 是需要硬编码的,所以 HashMap 用的不多。
    6. <!-- 通过 hashmap 查询 -->
      <select id="findUserListByHashmap" parameterType="hashmap" resultType="user">
      	select * from users where username like ‘%${username}%‘ and sex = #{sex}
      </select>
    7. public List<User> findUserListByHashmap() throws Exception {
      	SqlSession sqlSession = sqlSessionFactory.openSession();
      	UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
      
      	HashMap<String, Object> map = new HashMap<String, Object>();
      	map.put("username", "Anna");
      	map.put("sex", "0");
      
      	List<User> users = usermapper.findUserListByHashmap(map);
      	System.out.println(users.size());
      	return users;
      }
  2. resultType(输出类型):基本类型、pojo对象类型(单个)、pojo对象列表
    1. 基本类型--不多介绍
    2. pojo 对象类型(单个和列表),在 mapper.xml 中 resultType="User" 是一样的,区别是在写 Mapper 接口,如下:mybatis 会根据 Mapper 接口的返回类型 来决定去调用session.selectOne() 还是 session.selectList() 方法。返回单个pojo对象要保证sql查询出来的结果集为单条,使用session.selectOne方法调用,mapper接口使用pojo对象作为方法返回值。
    3. public User findUserById(int userId) throws Exception;	
      
      public List<User> findUserByUsername(String username) throws Exception;
  3. resultMap(输出类型): resultMap 也是一种输出类型,用于解决 当输出 pojo 对象的字段和 sql 查询出来的字段名不对应。 常用在一对一关联查询、一对多关联查询 等。
    1. public class Person {
      	private int id;
      	private String name;
      	private String addr;
      	public int getId() {
      		return id;
      	}
      	public void setId(int id) {
      		this.id = id;
      	}
      	public String getName() {
      		return name;
      	}
      	public void setName(String name) {
      		this.name = name;
      	}
      	public String getAddr() {
      		return addr;
      	}
      	public void setAddr(String addr) {
      		this.addr = addr;
      	}
      	@Override
      	public String toString() {
      		return "Person [id=" + id + ", name=" + name + ", addr=" + addr + "]";
      	}
      }
    2. <!-- 定义resultMap -->
      <resultMap type="person" id="resultMapPerson">
      	<!-- 结果集的主键, property是Person pojo对象的属性名,userId是sql的列名 -->
      	<id property="id" column="userId"/>
      	<!-- 普通的列 -->
      	<result property="name" column="username"/>
      	<result property="addr" column="address"/>
      </resultMap>
      
      <!-- 综合查询用户信息,返回resultMap -->
      <select id="findUserListRetrunResultMap" parameterType="user" resultMap="resultMapPerson">
      	select * from users where username like ‘%${username}%‘ and sex = #{sex}
      </select>
    3. public void findUserListReturnResultMap() throws Exception {
              SqlSession sqlSession = sqlSessionFactory.openSession();
      	UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
      
      	User user = new User();
      	user.setUsername("Anna");
      	user.setSex("0");
      
      	List<Person> list = usermapper.findUserListRetrunResultMap(user);
      	System.out.println(list.size());
      	Iterator<Person> iterator = list.iterator();
      	while (iterator.hasNext()) {
      		Person person = iterator.next(); 
      		System.out.println(person);
      	}
      }
时间: 2024-10-05 04:41:51

MyBatis 之 使用四(一) (mapper.xml)的相关文章

mybatis自动生成dao, model, mapper xml文件

用mybatis的时候,手写xml或model文件是一个力气活,所以可以用mybatis-gennerator插件自动生成mybatis所需要的dao.bean.mapper xml文件 (原文地址:http://blog.csdn.net/tolcf/article/details/50835165) 附件下载地址:http://files.cnblogs.com/files/cc-robot/generator.rar 把附件解压到本地,我放在d:\web\java目录下了 只需要修改下面x

spring mybatis 整合问题Error parsing Mapper XML. Cause: java.lang.NullPointerException

14:30:40,872 DEBUG SqlSessionFactoryBean:431 - Parsed configuration file: 'class path resource [mybatis/mybatis-config.xml]'14:30:40,883  WARN XmlWebApplicationContext:489 - Exception encountered during context initialization - cancelling refresh att

mybatis如何通过接口查找对应的mapper.xml及方法执行详解

转:http://www.jb51.net/article/116402.htm 本文主要介绍的是关于mybatis通过接口查找对应mapper.xml及方法执行的相关内容,下面话不多说,来看看详细的介绍: 在使用mybatis的时候,有一种方式是 ? 1 BookMapper bookMapper = SqlSession().getMapper(BookMapper.class) 获取接口,然后调用接口的方法.只要方法名和对应的mapper.xml中的id名字相同,就可以执行sql. 那么接

MyBatis 之 使用四(二) (mapper.xml)

执行查询操作的时候,通常返回的结果集会出现一下几种情况: 1. 一对一查询:返回的结果集的唯一主键是非重复的.(下面会标出唯一主键,和 oracle 的主键有区别) 查询订单以及订单的用户信息,两种接收结果集的方式: 1)使用 pojo 对象去接收结果集(唯一主键:) public class OrderCustom extends User { private int orderId; //订单id private int user_id; //用户id private String orde

MyBatis Mapper.xml文件中 $和#的区别

MyBatis Mapper.xml文件中 $和#的区别 网上有很多,总之,简略的写一下,作为备忘.例子中假设参数名为 paramName,类型为 VARCHAR . 1.优先使用#{paramName,jdbcType=VARCHAR} 写法,除了可以防止sql注入以外,它还能在参数里含有单引号的时候自动转义, 而${paramName}由于是类似于拼接sql的写法,不具备此功能. 2.注意,使用 #{paramName,jdbcType=VARCHAR} 写法的时候,模糊查询的写法为:'%'

Mybatis Mapper.xml 需要查询返回List&lt;String&gt;

<?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="com.xinwei.process.dao.Role

Mybatis Mapper.java和Mapper.xml能否分离问题

Mybatis Mapper.java和Mapper.xml是能分离的. 从图上不难看出,不管是/java还是/resources,他们最终编译后的存放路径均是/target/classes 因此将xml和java分开就成了一件简单的事了 方法: 只需要在resource目录下创建和java下的mapper.java相同的路径,然后将对应的mapper.xml放入该目录下就行了 ok完事...

mybatis公用代码抽取到单独的mapper.xml文件

同任何的代码库一样,在mapper中,通常也会有一些公共的sql代码段会被很多业务mapper.xml引用到,比如最常用的可能是分页和数据权限过滤了,尤其是在oracle中的分页语法.为了减少骨架性代码,通常将它们抽象到sql中,但是肯定又不能在每个mapper中也包含,这样就没有意义了.此时,可以将这部分移到专门的mapper.xml中,比如common.xml,其中包含如下: <?xml version="1.0" encoding="UTF-8"?>

mybatis之mapper.xml分析

select: id:方法名,在同一个mapper.xml中,要保持唯一 parameterType:指定输入的参数类型,不是必须的,如果不指定,mybatis会自动识别(推荐指定). resultType:返回值类型(映射类型),必须指定.不指定的话会报错. insert: mybatis 在insertparameterType的参数类型也不是必须的, useGeneratedkeys="true":启用自增长的id keyProperty="id":Model