title: mybatis入门_配置文件的配置
date: 2019-11-13 16:34:10
tags:
categories:
- mybatis
一.全局配置文件配置
- 1.1 properties标签
Properties标签可以用来加载配置文件.例如,我们可以将数据库的连接信息放入到配置文件db.properties中
db.properties
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8
db.username=root
db.password=root
在全局配置文件SqlMapConfig.xml中引入该配置文件:
<!-- 指定数据库连接信息的位置 -->
<properties resource="db.properties"/>
然后就可以在全局配置文件的关于数据库的配置信息里使用配置文件的信息了
<dataSource type="POOLED">
<!-- 数据库驱动 -->
<property name="driver" value="${db.driver}"/>
<!-- 数据库地址 -->
<property name="url" value="${db.url}"/>
<!-- 数据库用户 -->
<property name="username" value="${db.username}"/>
<!-- 数据库密码 -->
<property name="password" value="${db.password}"/>
</dataSource>
加载properties的顺序:
先加载标签下的property标签.观察有没有对应的键值对
加载properties的resource属性指定的配置文件。注意.这一步如果与上一步重名,那么将会覆盖上一步声明的属性。例如以下代码中的property声明的属性将会被后加载的配置文件的相同的属性给覆盖:
“ class=”align-none”>
优先级最高的是paramterType中传入的值.(这也是在配置文件中写db.username而不写username的原因..避免不必要的覆盖!)
- 1.2 typeAlias.
1.2.1 mybatis默认支持的别名
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
long | Long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
1.2.2 自定义别名
Mybatis对于基本的数据类型定义了别名,我们可以为我们自己创建的Pojo类定义别名.定义别名采用的是标签.
<!-- 定义别名 -->
<typeAliases>
<typeAlias name="com.qst.pojo.user" alias="user" />
</typeAliases>
现在我们就可以使用别名了:
<select id="selectEmployeeRealationById" parameterType="Integer" resultType="user">
select empid,name,gender,birthday,mobile,email,position,note
from tb_employee where empid=#{empId}
</select>
批量定义别名.(用于定义包)包下面的类的别名默认为类名.首字母大小写即可.
<!-- 批量定义别名 -->
<typeAliases>
<package name="com.qst.pojo" />
</typeAliases>
使用别名:
<mapper namespace="com.qst.dao.EmployeeDao">
<select id="selectEmployeeRealationById"
parameterType="Integer" resultType="user">
select
empid,name,gender,birthday,mobile,email,position,note
from tb_employee
where empid=#{empId}
</select>
</mapper>
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\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映射文件要名称相同,且放到同一个目录下;
如下所示:
二.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中声明这个类.
<select id="selectEmployeeRealationById" parameterType="com.qst.mapper.UserQueryVO"
resultType="user">
然后需要写SQL语句了.获取对应的属性值直接属性名.属性值即可.(无论嵌套多少层都没事)
select empid,name,gender,birthday,mobile,email,position,note
from tb_employee where empid=#{empId}
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标签来完成对于传入的集合的遍历.具体做法如下所示:
<!-- 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>
加油