mybatis教程3(映射文件)
MyBatis 的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。
log4j
在程序的运行的过程中为了便于查询sql的输出,需要引入log4j
添加依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
添加log4j.properties文件
log4j.rootCategory=DEBUG, stdout , R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=C:\\tools\\logs\\dpb.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n
效果

#和$
由于MyBatis底层还是Jdbc,而Jdbc在操作数据库传递参数时,有两种方式,一种是使用Statement,还有一种是使用PreparedStatement:
使用statement时,存在SQL注入问题,PreparedStatement则通过预编译解决了SQL注入问题。
在MyBatis种,引入参数有两种方式,一种是使用#,还有一种是使用$,其中,使用#对应了Jdbc种的PreparedStatement,而使用$则对应了Jdbc种的Statement,因此在MyBatis种,推荐使用#。
#的使用



$的使用
加入可以使用$替换#,注意,如果使用$,需要在Mapper种指定参数名字

接口中的类型如果没有指定@Param注解就会报错
给接口的参数前加注解描述


推荐使用#方式
多个参数
如果Mapper接口中有多个参数,无论参数名是什么,在Mapper.xml文件中,参数都是arg0、arg1....或者param1、param2....
如果非要使用自己的参数名,可以通过@Param注解自定义
<!--arg0 arg1 -->
<insert id="addUser1" >
insert into t_user(name,favorites)values(#{arg0},#{arg1})
</insert>
<!-- param1 param2 -->
<insert id="addUser2" parameterType="map">
insert into t_user(name,age)values(#{param1},#{param2})
</insert>
/**
* 参数类型一致
* @param name
* @param favorites
* @return
*/
public int addUser1(String name,String favorites);
/**
* 参数类型不一致
* @param name
* @param age
* @return
*/
public int addUser2(String name,int age);
/**
* 参数类型不一致
* @param name
* @param age
* @return
*/
public int addUser3(@Param("name")String name,@Param("age")int age);
数据添加成功
包装对象
javaBean
public class UserWrapper {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
映射文件
<!-- 从包装对象中获取信息 包装对象的别名. 取信息 -->
<insert id="addUser4" parameterType="UserWrapper">
insert into t_user(name,age,favorites)values(#{user.name},#{user.age}
,#{user.favorites})
</insert>
测试


Map
也可以使用HashMap做参数,使用Map做参数,非常灵活,但是不推荐。
ResultType
对于简单数据类型,例如查询总记录数、查询某一个用户名这一类返回值是一个基本数据类型的,直接写Java中的基本数据类型即可。
如果返回的是一个对象或者集合,并且对象中的属性和查询的字段名是一一对应的,那么resultType也可以直接写一个对象。
ResultMap
resultMap主要用来解决属性名和字段名不一致以及一对多、一对一查询等问题 字段名不一致时,首先可以通过取别名解决,例如Bean的定义如下:
User对象
private int id;
// 该类型和字段不一致
private String username;
private int age;
映射文件

测试结果

解决方式一
查询时,可以给查询结果取别名

这种方式,可以解决问题,但是有缺陷,最大缺陷是不能复用(可以sql片段解决,但是不完美)。
解决方式二
最佳解决方案就是使用resultMap,用法如下:
<resultMap type="com.sxt.bean.User" id="baseMap">
<id column="id" property="id"/>
<result property="username" column="name"/>
<result property="age" column="age"/>
</resultMap>
<select id="getUserById" resultMap="baseMap"
resultType="com.sxt.bean.User">
select id ,name ,age from t_user where id=${id}
</select>
使用

主键回写
一般情况下,主键有两种生成方式:
1.主键自增长
2.自定义主键(一般可以使用UUID)
如果是第二种,主键一般是在Java代码中生成,然后传入数据库执行,如果是第一个主键自增长,此时,Java可能需要知道数据添加成功后的主键。
在MyBatis中,可以通过主键回填来解决这个问题(推荐)。
主键回填
<!--
useGeneratedKeys:使用生成的主键
keyProperty="id":将生成的主键的值保存到对象的id属性中
-->
<insert id="addEmp" parameterType="emp"
useGeneratedKeys="true" keyProperty="id">
insert into t_emp(name,age)values(#{name},#{age})
</insert>
测试:

selectKey
另外,可以利用MySQL自带的last_insert_id()函数查询刚刚插入的id
<insert id="addEmp" parameterType="emp" >
<selectKey keyProperty="id" resultType="int">
select LAST_INSERT_ID()
</selectKey>
insert into t_emp(name,age)values(#{name},#{age})
</insert>

mybatis教程3(映射文件)的更多相关文章
- Mybatis(二) SQL映射文件
SQL映射文件 单条件查询 1. 在UserMapper接口添加抽象方法 //根据用户名模糊查询 List<User> getUserListByName(); 2. 在UserMappe ...
- Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件
封面:洛小汐 作者:潘潘 若不是生活所迫,谁愿意背负一身才华. 前言 上节我们介绍了 < Mybatis系列全解(四):全网最全!Mybatis配置文件 XML 全貌详解 >,内容很详细( ...
- Mybatis框架基于映射文件和配置文件的方式,实现增删改查,可以打印日志信息
首先在lib下导入: 与打印日志信息有关的架包 log4j-1.2.16.jar mybatis架包:mybatis-3.1.1.jar 连接数据库的架包:mysql-connector-java-5 ...
- 初始MyBatis、SQL映射文件
MyBatis入门 1.MyBatis前身是iBatis,是Apache的一个开源项目,2010年这个项目迁移到了Google Code,改名为MyBatis,2013年迁移到GitHub.是一个基于 ...
- MyBatis 的 XML 映射文件使用说明
简介 文档参考地址:http://www.mybatis.org/mybatis-3/zh/index.html MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器 ...
- mybatis Mapper XML 映射文件
传送门:mybatis官方文档 Mapper XML 文件详解 一. 数据查询语句 1. select <select id="selectPerson" parameter ...
- mybatis的sql映射文件—增删改查
前提:需要的包log4j.jar,mybatis-3.4.1.jar,mysql-connector-java-5.1.37-bin.jar 1.基本类 员工类 package com.hand.my ...
- Mybatis学习—XML映射文件
总结自 Mybatis官方中文文档 Mapper XML 文件 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同 ...
- xml 文件不给提示(以mybatis 的 mapper映射文件为例)
在xxx.xml 映射文件的头部可以看到 如下: (mybatis generate 自动生成) <!DOCTYPE mapper PUBLIC "-//mybatis.org//DT ...
随机推荐
- powershell获取windows子文件夹的大小
$startFolder = "E:\Migration\" $colItems = (Get-ChildItem $startFolder | Where-Object {$_. ...
- 2018年2月19日我的java学习
2019/2/18 星期一今天学习了Java 中的面向对象思想主要学习了类 构造器等在学习修饰属性的过程中,有4点必须牢记前提是理解类的各种关系 类中有5种关系 本身 同包类 同包继承子类 不同包继承 ...
- 内置函数_zip()
zip() zip()函数用来把多个可迭代对象中的元素压缩到一起,返回一个可迭代的zip对象,其中每个元素都是包含原来的多个可迭代对象对应位置上元素的元组,最终结果中包含的元素个数取决于所有参数序列或 ...
- 使用Docker搭建CentOS 7 + Apache 2.4+ PHP7
从Docker Hub上Pull最新的CentOS 7镜像并新建容器 # sudo docker pull centos docker run -p 8082:80 --name centos_c - ...
- Zhu-Takaoka Two-dimensional Pattern Matching
Two dimensional pattern matching. Details may be added later.... Corresponding more work can be foun ...
- 安卓Task和Back Stack
概述 一个Activity允许用户完成一些操作,甚至,Android中设计Activity为组件的形式,这样,多个Activity--甚至是其它App的Activity可以一起完成一项任务. Task ...
- 从文本中读取字符——feof函数问题
feof()函数 函数原型:int feof(FILE *fp): 函数功能:检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0,文件结束符只能被clearerr()函数清除 (函数feof ...
- 夜谈Java类的定义
女孩:谈Java了,好耶? 男孩:夜谈一下,Java的类的定义~ 女孩:那谈Java的类的什么呢? 男孩:类的定义,对象的定义,类中的方法,构造方法,this关键字,方法的重载,Java中的类的访问权 ...
- Android之控件与布局,结构知识点,基础完结
版权声明:未经博主允许不得转载 在Android中我们常常用到很多UI控件,如TextView,EditText,ImageView,Button,ImageButton,ToggleButton,C ...
- Cellular Traffic Offloading
Reference: [1] Mobile Data Offload for 3G Networks [2] Mobile Data Offloading through Opportunistic ...