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 ...
随机推荐
- Unit01: JAVA开发环境案例
Top JAVA Fundamental DAY01 JDK及Eclipse目录结构操作 JDK的安装及配置 控制台版的JAVA HelloWorld 使用Eclipse开发Java应用程序 1 JD ...
- TCL笔试题 将A,B,B,C,D,E,第三个字符不可以是E的所有组合输出;
思路:利用排列思想,进行递归:#include "iostream" using namespace std; ]; void pick_one(char a[],int num[ ...
- Used Query
--- 查询 look back 6 days logic period_key. select s.store_id, i.upc, sf.period_key from JNJ_CASINO_H ...
- rabbitmq 小记
如果消息由生产者生产之后,没有消费端来消费(此处生产者也负责队列的创建) 在超时之后需要对消息进行删除(如果一直保留队列里,在消费端启动后消费了此消息,会和生产端的数据产生冲突,添加程序的复杂度) 因 ...
- WP 手机Lumia 820 锁屏密码的破解研究
Windows Phone lumia 手机锁屏密码的破解研究 大家好今天给大家分享一个最新研究案例, 近日笔者接Nokia Lumia 820, 由于客户密码失误太多,导致锁屏23000余分 ...
- MVVM简介
如果你对MVVM的概念还是不了解,可以参看下面链接:http://baike.baidu.com/view/3507915.htm 我们以WPF+MVVM的本地桌面程序为背景,这样一来我们可以不去操心 ...
- IOS CALayer的阴影属性
@property(nullable) CGColorRef shadowColor; /* The opacity of the shadow. Defaults to 0. Specifying ...
- Java基础应用
Java集合类解析 List.Map.Set三个接口,存取元素时,各有什么特点? List 以特定次序来持有元素,可有重复元素.Set 无法拥有重复元素,内部排序.Map 保存key-value值,v ...
- SqlBulkCopy批量添加数据
var sqlconn = ConfigurationManager.ConnectionStrings["SQLConnStringRead"].ConnectionString ...
- OOP过度抽象
OI的时候,解决问题是第一位的,别老想着可维护性.能过就行啦,又不是工程. 下面是两篇相关的文章 来自酷壳 编程真难啊 2009年9月3日 陈皓 上周,在Sun的Java论坛上出现了一个这样的帖子,L ...