文档章节

MyBatis 之 mapper.xml(一)

pradosoul
 pradosoul
发布于 2015/09/14 11:47
字数 849
阅读 652
收藏 4

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);
      	}
      }

© 著作权归作者所有

pradosoul
粉丝 6
博文 40
码字总数 37445
作品 0
闵行
程序员
私信 提问
Mybatis 入门案例 2 ---- mapper 代理的方式

我们只需要编写DAO接口和mapper.xml文件即可,DAO接口实现对象由mybatis自动生成代理对象。 如: 一、为什么不使用原始的DAO方式开发呢? 1、dao的实现类中存在重复代码,整个mybatis操作的过...

故新
2017/11/07
0
0
MyBatis初探二

一、Mybatis 的 Dao 层两种开发方式 1、原始Dao开发模式( 自己手动实现Dao层接口和实现类 ) 》 实现思路:编写Dao接口和实现类,在Dao接口中注入单例的SqlSessionFactory,通过SqlSessionFac...

AAASSSSddd
2016/04/02
82
5
ORM[对象关系映射]技术之一:Mybatis

一、普通的java(POJO)-Mybatis Mybatis-config.xml中配置完数据源、日志、别名、Mapper.xml Mapper.xml中会声明此XML对应的Mapper接口类 Reader读取Mybatis-config.xml SQLSessionFactoryB...

BobwithB
2018/08/08
183
0
MyBatis初探一

一、MyBatis介绍 mybatis(持久层框架3.2.6 or 3.2.7)简单执行流程 >1.SqlMapConfig.xml(全局配置文件),配置数据源,事务和运行环境等 >2.配置映射文件(编写SQL语句):mapper.xml... >3.SqlSes...

AAASSSSddd
2016/04/02
106
0
MyBatis开发dao方法

一 SqlSession使用范围 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory 将SqlSessionFactoryBuilder当作一个工具类使用即可,不需要使用单例管理Sql...

Bbigbug
2017/11/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
9
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
5
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部