mybatis入门_配置文件的配置
一.全局配置文件配置
1.1 properties标签
Properties标签可以用来加载配置文件.例如,我们可以将数据库的连接信息放入到一个配置文件(db.properties中..)
下为db.properties
db.driverClass=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8
db.username=root
db.password=root
在全局配置文件SqlMapConfig.xml中引入该配置文件.
然后就可以在全局配置文件的关于数据库的配置信息里使用配置文件的信息了
加载properties的顺序:
1. 先加载<properties>标签下的property标签.观察有没有对应的键值对
2. 加载properties的resource属性指定的配置文件.注意.这一步如果与上一步重名.那么将会覆盖上一步声明的属性.例如:
图中的property声明的属性将会被后加载的配置文件的相同的属性给覆盖
3.优先级最高的是paramterType中传入的值.(这也是在配置文件中写db.username而不写username的原因..避免不必要的覆盖!)
1.2 typeAlias.
1.2.1 mybatis默认支持的别名
别名 |
映射的类型 |
_byte |
byte |
_long |
long |
_short |
short |
_int |
int |
_integer |
int |
_double |
double |
_float |
float |
_boolean |
boolean |
string |
String |
byte |
Byte |
long |
Long |
short |
Short |
int |
Integer |
integer |
Integer |
double |
Double |
float |
Float |
boolean |
Boolean |
date |
Date |
decimal |
BigDecimal |
bigdecimal |
BigDecimal |
1.2.2 自定义别名
Mybatis对于基本的数据类型定义了别名,我们可以为我们自己创建的Pojo类定义别名.定义别名采用的是<typeAliases>标签.
现在我们就可以使用别名了:
批量定义别名.(用于定义包)包下面的类的别名默认为类名.首字母大小写即可.
使用别名:
1.3 mapper标签
mapper标签用于引入mapper配置文件.
1.3.1 <mapper resource=’’”/>
使用相对于类路径的资源
如:<mapper resource="sqlmap/User.xml" />
1.3.2 <mapper url=’’”/>
使用完全限定路径
如:<mapper url="file:///D:\workspace_spingmvc\mybatis_01\config\sqlmap\User.xml" />
1.3.3<mapper class=’’”/>
使用mapper接口的全限定名
如:<mapper class="cn.itcast.mybatis.mapper.UserMapper"/>
注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下;
1.3.4 <package name=’’/>(推荐)
注册指定包下的所有映射文件
如:<package name="cn.itcast.mybatis.mapper"/>
注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下;
如下所示:
2.Mapping映射文件配置
2.1 传递输入参数
2.1.1 传递包装Pojo
包装Pojo即一个类,当中有一个属性为一个Pojo.而我们所需要的属性被封装在Pojo
下面是示例:我们将要查询的信息封装在一个Pojo类User中.然后将User类封装在UserQueryVO中.
public class UserQueryVO {
private User user ; public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} }
紧接着我们需要在mapper配置文件的输入参数parameterType中声明这个类.
然后需要写SQL语句了.获取对应的属性值直接属性名.属性值即可.(无论嵌套多少层都没事)
2.1.2 传入HashMap
同传递POJO对象一样,map的key相当于pojo的属性。
@Test
public void testMapper2() {
SqlSession session = factory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);//建立代理对象
Map<String,String> map=new HashMap<>();
map.put("username", "小明");
map.put("sex", "1");
List<User> users = mapper.findUserByQueryMap(map);
System.out.println(users);
}
2.2 输出映射
2.2.1 resultType的要点
查询的列名和映射的pojo的属性名一致,使用resultType映射才会成功。
如果查询的列名和映射的pojo的属性名全部不一致,则映射的pojo为null。
如果查询的列名和映射的pojo的属性名有一个一致,则映射的pojo不为null,而且只有一致的那一个属性才有值。
2.2.2 resultType为简单类型
@Test
public void testResult1() {
SqlSession session = factory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);//建立代理对象
int count = mapper.selectCount();
System.out.println(count);
}
2.2.3 Pojo/Pojo集合
ResultType为单列的数据的类型.
2.2.4 resultMap
使用要求:
使用resultMap进行结果映射时,不需要查询出的列名和映射的pojo的属性名一致。但是需要定义一个resultMap标签来完成列名和属性名的映射关系。
需求:
将以下sql查询出的结果进行映射。
Select id id_,username username_,sex sex_ from user where id = 1
由于查询出的数据的名称与Pojo类的属性不一致,因此无法直接用resultType对结果进行映射.
所以我们采用resultMap进行映射.
具体方法如下:
1.在UserMapper.xml中进行配置
2/在UserMapper中添加方法
3.进行测试
@Test
public void testResult2() {
SqlSession session = factory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);//建立代理对象
User user = mapper.selectByResultMap(1);
System.out.println(user);
}
2.3 动态sql拼接
在mybatis提供了一些动态标签,可以帮助开发人员更快,更方便的开发出持久层的代码,常见的动态标签有if标签,
Where标签,foreach标签,sql片段标签.
2.3.1 if标签
在前面的关联查询中,我们用了下面的sql语句去根据关键字查询.但是这样实际是不合理的.
因为可能用户在输入的时候,根本就没有输入Username,只输入了其中的一项(这时候只能根据这一项进行查询),或者甚至什么都没有输入(这时候应该查询出全部).而我们是没有办法提前去判断用户的输入条件的.这时候就
需要根据用户输入的条件,动态的改变sql语句.用到了if标签.if标签用法如下,在if中书写需要判断的表达式,mybatis将会根据判断的结果动态的将sql语句拼接起来.
<!-- 通过if标签完成检索 -->
<select id="findUserByQuery" parameterType="com.xyy.po.UserQueryVO" resultType="user">
SELECT * FROM USER WHERE 1=1
<!-- 如果用户输入了username的情况下,才会进行关联查询.test内书写表达式 -->
<if test="user!=null">
<if test="user.username!=null and user.username!=''">
AND username LIKE '%${user.username}%'
</if>
<!-- 如果用户输入了sex的情况下,才会进行关联查询.test内书写表达式 -->
<if test="user.sex!=null and user.sex!=''">
and sex=#{user.sex};
</if>
</if>
</select>
2.3.2 where标签
实际上在关联查询的where后面先拼接1=1是不好的做法,因为它会降低效率.更好的做法是用where标签去替代:
Where标签可以判断后面有没有内容.如果后面只有1个内容,就会将and去掉.并且拼接上where.如果后面有两个或者以上的条件,那么将第一个条件,即where后面的条件,去掉and,然后将其他条件的and保留.如果后面没有
条件,则在主的sql语句后面不会添加where关键字.具体做法如下:
<select id="findUserByQuery" parameterType="com.xyy.po.UserQueryVO" resultType="user">
SELECT * FROM USER
<!-- 什么都没输,直接输出SELECT * FROM USER -->
<where>
<!-- 如果user.username!=null而user.sex==null那么将会输出WHERE username LIKE '%${user.username}%'.(默认去掉where后的第一个and) -->
<if test="user!=null">
<if test="user.username!=null and user.username!=''">
AND username LIKE '%${user.username}%'
</if>
<if test="user.sex!=null and user.sex!=''">
and sex=#{user.sex};
</if>
</if>
</where>
</select>
2.3.3 sql片段
Sql片段方便我们将一些sql语句中相同的部门提取出来,先声明为sql片段,然后在书写sql语句的时候,直接引用这些sql片段即可.注意,sql片段应该具有可复用性.具体做法如下所示:
<sql id="queryUser">
<if test="user!=null">
<if test="user.username!=null and user.username!=''">
AND username LIKE '%${user.username}%'
</if>
<if test="user.sex!=null and user.sex!=''">
AND sex=#{user.sex};
</if>
</if>
</sql> <!-- 通过if标签完成检索 -->
<select id="findUserByQuery" parameterType="com.xyy.po.UserQueryVO" resultType="user">
SELECT * FROM USER
<!-- 什么都没输,直接输出SELECT * FROM USER -->
<where>
<include refid="queryUser"></include>
</where>
</select>
2.3.4 foreach标签.
例如,如果需要根据传入的一系列的id,去查询对应的用户,要怎么做呢?
这种需求所对应的sql语句应该如下:
SELECT * FROM USER WHERE id IN (…)
括号内放的是传入的所有id值.而我们在mybatis可以通过foreach标签来完成对于传入的集合的遍历.具体做法如下所示:
<!-- 使用foreach标签遍历集合 -->
<!-- collection为要遍历的元素.open为在遍历前要拼接的语句,close为要遍历后要拼接的语句 -->
<!-- separator为遍历的每一个项目之间的分隔符,item为遍历的项目的标识(相当于JSTLeach标签的var) -->
<if test="ids!=null and ids.size>0">
AND id IN
<foreach collection="ids" open="(" close=")" separator="," item="id" >
#{id}
</foreach>
<!-- 上述形式不固定,只要能拼接成AND id IN (id,id,id)即可(id表示每次遍历得到的id) -->
</if>
上面的是通过POJO对象传入List集合,实际上我们可以直接传入List集合.代码如下:
需要注意的是获取这个List集合,mybatis声明的变量为list.而这个变量变量名是不可以改变的.
<!-- 通过直接传入List集合完成检索 -->
<select id="findUserByQueryList" parameterType="java.util.List" resultType="user">
SELECT * FROM USER
<!-- 什么都没输,直接输出SELECT * FROM USER -->
<where>
<if test="list!=null and list.size>0">
id IN
<foreach collection="list" open="(" close=")" item="id" separator=",">
#{id}
</foreach>
</if>
</where>
</select>
mybatis入门_配置文件的配置的更多相关文章
- mybatis入门_一对多,多对多映射以及整合spring框架
一.一对多映射. 1.1 一对多映射之根据多的一方关联查询一的一方 示例:查询出具体的订单信息,同时也查询出来订单的用户信息. 引入的订单表如下所示: 框选出来的为具体的外键. 订单的Pojo类如下所 ...
- Mybatis XML 映射配置文件 -- 熟悉配置
来源:http://www.mybatis.org/mybatis-3/zh/configuration.html properties mybatis读取属性顺序. 如果属性在不只一个地方进行了配置 ...
- mybatis入门篇基——基本配置与参数说明
Mybatis 好吧这是我第一次写这种文章~如果有不足和错误之处欢迎评论,指点.今天想谈谈关于mybatis的一些基础入门知识. 进入正题~~: a.关于mybatis: 我个人觉得mybatis深得 ...
- MyBatis入门基础(一)
一:对原生态JDBC问题的总结 新项目要使用mybatis作为持久层框架,由于本人之前一直使用的Hibernate,对mybatis的用法实在欠缺,最近几天计划把mybatis学习一哈,特将学习笔记记 ...
- Mybatis(一) mybatis入门
学习了hibernate这个持久层框架之后,在来学习Mybatis简直是无压力,因为Mybatis入门门栏很低,如果学习过了hibernate的话,对于Mybatis的学习很简单了,如果没学习过hib ...
- Mybatis学习(一)—————mybatis入门
学习了hibernate这个持久层框架之后,在来学习Mybatis简直是无压力,因为Mybatis入门门栏很低,如果学习过了hibernate的话,对于Mybatis的学习很简单了,如果没学习过hib ...
- Java SSM框架之MyBatis3(一)MyBatis入门
MyBatis3介绍 mybatis就是一个封装来jdbc的持久层框架,它和hibernate都属于ORM框架,但是具体的说,hibernate是一个完全的orm框架,而mybatis是一个不完全的o ...
- Mybatis系列(一):Mybatis入门
一.Mybatis是什么 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改 ...
- Mybatis入门及Dao开发方式
本节内容: Mybatis介绍 使用jdbc编程问题总结 Mybatis架构 Mybatis入门程序 Dao的开发方式 SqlMapConfig.xml文件说明 一.Mybatis介绍 MyBatis ...
随机推荐
- Android JNI 本地开发接口
前言 我们为什么要用JNI --> 高效.扩展 高效:Native code效率高,数学运算,实时渲染的游戏上,音视频处理 (极品飞车,opengl,ffmpeg,文件压缩,图片处理-) 扩展: ...
- eclipse进行编译时总是有javascript validator错误提示
右击工程项目的properties——builders——去掉对javascript的验证就ok啦
- 【笔记】科普createDocumentFragment() 创建文档碎片节点
上一篇文章说到了动态添加文本节点的方法那如果我们要添加多个文本节点或者元素节点呢? 大家可能会想到用循环然后逐个逐个添加 但是别忘了js 还提供了创建一个文本碎片的方法 createDocumentF ...
- Problems with MMM for mysql(译文)
Problems with mmm for mysql posted in MySQL by shlomi 原文:http://code.openark.org/blog/mysql/problems ...
- JavaScript检测文件上传的类型与大小
$(function(){ $("#files").change(function(){ // 添加允许上传的文件类型 var exts = new Array(); exts[0 ...
- JAVA泛型详解2 转载
转载地址:http://www.cnblogs.com/sunwei2012/archive/2010/10/08/1845938.html 普通泛型 class Point<T>{ // ...
- ajax 跨域请求
1. $.ajax({ type: "get", async: false, url: "http://61.160.194.208:8383/Api/login?acc ...
- js函数的传参是按值传对递
根据js高级程序设计第三版编写,对于函数的参数只能按值传递是这样解释的: ECMAScript 中所有函数的参数都是按值传递的.也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另 ...
- Hibernate的映射组件属性
组件属性 如果持久化类的属性并不是基本数据类型,也不是一个日期或者字符串常量,而是一个复合类型的对象,例如 private Name name; 那么这就是一个组件属性. 组件属性可以是任何普通的ja ...
- linux vmware安装完成后如何设置桥接上网
linux 主机初步安装完成后还是不能上网,如何设置共享上网 1 首先要明白上网方式:虚拟机网卡-------------------vmnet1--------------------真实机网卡( ...