前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mybatis教程3(映射文件)

mybatis教程3(映射文件)

作者头像
用户4919348
发布2019-04-02 11:36:15
5200
发布2019-04-02 11:36:15
举报
文章被收录于专栏:波波烤鸭波波烤鸭

  MyBatis 的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。

1. log4j

  在程序的运行的过程中为了便于查询sql的输出,需要引入log4j 添加依赖

代码语言:javascript
复制
<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文件

代码语言:javascript
复制
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

效果

在这里插入图片描述
在这里插入图片描述

2.传入参数

#和$

  由于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注解自定义

代码语言:javascript
复制
<!--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>
代码语言:javascript
复制
	/**
	 * 参数类型一致
	 * @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

代码语言:javascript
复制
public class UserWrapper {

	private User user;

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
}

映射文件

代码语言:javascript
复制
<!-- 从包装对象中获取信息 包装对象的别名. 取信息 -->
<insert id="addUser4" parameterType="UserWrapper">
	insert into t_user(name,age,favorites)values(#{user.name},#{user.age}
	,#{user.favorites})
</insert>

测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Map

也可以使用HashMap做参数,使用Map做参数,非常灵活,但是不推荐。

3.返回数据

ResultType

  对于简单数据类型,例如查询总记录数、查询某一个用户名这一类返回值是一个基本数据类型的,直接写Java中的基本数据类型即可。   如果返回的是一个对象或者集合,并且对象中的属性和查询的字段名是一一对应的,那么resultType也可以直接写一个对象。

ResultMap

  resultMap主要用来解决属性名和字段名不一致以及一对多、一对一查询等问题 字段名不一致时,首先可以通过取别名解决,例如Bean的定义如下:

User对象

代码语言:javascript
复制
private int id;

// 该类型和字段不一致
private String username;

private int age;

映射文件

在这里插入图片描述
在这里插入图片描述

测试结果

在这里插入图片描述
在这里插入图片描述

解决方式一

  查询时,可以给查询结果取别名

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  这种方式,可以解决问题,但是有缺陷,最大缺陷是不能复用(可以sql片段解决,但是不完美)。

解决方式二

  最佳解决方案就是使用resultMap,用法如下:

代码语言:javascript
复制
<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中,可以通过主键回填来解决这个问题(推荐)。

主键回填

代码语言:javascript
复制
<!-- 
	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

代码语言:javascript
复制
<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>
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年01月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. log4j
  • 2.传入参数
    • #和$
      • 多个参数
        • 包装对象
          • Map
          • 3.返回数据
            • ResultType
              • ResultMap
                • 解决方式一
                • 解决方式二
              • 主键回写
                • 主键回填
                • selectKey
            相关产品与服务
            云数据库 MySQL
            腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档