一.全局配置文件配置 ##
—————
- 1.1 properties标签
—————

Properties标签可以用来加载配置文件.例如,我们可以将数据库的连接信息放入到配置文件db.properties中

db.properties
<br />db.driver=com.mysql.jdbc.Driver<br />db.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8<br />db.username=root<br />db.password=root<br />

在全局配置文件SqlMapConfig.xml中引入该配置文件:


然后就可以在全局配置文件的关于数据库的配置信息里使用配置文件的信息了

xml<br /><dataSource type="POOLED"><br /> <!-- 数据库驱动 --><br /> <property name="driver" value="${db.driver}"/><br /> <!-- 数据库地址 --><br /> <property name="url" value="${db.url}"/><br /> <!-- 数据库用户 --><br /> <property name="username" value="${db.username}"/><br /> <!-- 数据库密码 --><br /> <property name="password" value="${db.password}"/><br /></dataSource><br />

加载properties的顺序:

  • 先加载标签下的property标签.观察有没有对应的键值对
    - 加载properties的resource属性指定的配置文件。注意.这一步如果与上一步重名,那么将会覆盖上一步声明的属性。例如以下代码中的property声明的属性将会被后加载的配置文件的相同的属性给覆盖:

       <properties resource="db.properties"><br />           <property name="db.username" value="root"/><br />       </properties><br />
    - 优先级最高的是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类定义别名.定义别名采用的是标签.

  1. <!-- 定义别名 --><br /> <typeAliases><br /> <typeAlias name="com.qst.pojo.user" alias="user" /><br /> </typeAliases>

现在我们就可以使用别名了:

批量定义别名.(用于定义包)包下面的类的别名默认为类名.首字母大小写即可.




使用别名:


parameterType=”Integer” resultType=”user”>
select
empid,name,gender,birthday,mobile,email,position,note
from tb_employee
where empid=#{empId}


—————
1.3 mapper标签
—————
mapper标签用于引入mapper配置文件.

1.3.1

  1. <mapper resource=""/> //使用相对于类路径的资源

如:

1.3.2

//使用完全限定路径

如:

1.3.3

//使用mapper接口的全限定名

如:

注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下;

1.3.4

(推荐)注册指定包下的所有映射文件

如:

注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下;

如下所示:
在这里插入图片描述

—-
## 二.Mapping映射文件配置 ##
—-
2.1 传递输入参数
—-
2.1.1 传递包装Pojo
—-
包装Pojo即一个类,当中有一个属性为一个Pojo.而我们所需要的属性被封装在Pojo

下面是示例:我们将要查询的信息封装在一个Pojo类User中.然后将User类封装在UserQueryVO中.

public class UserQueryVO {
private User user ;

  1. public User getUser() {<br /> return user;<br /> }
  2. public void setUser(User user) {<br /> this.user = user;<br /> }

}

紧接着我们需要在mapper配置文件的输入参数parameterType中声明这个类.

resultType=”user”> 然后需要写SQL语句了.获取对应的属性值直接属性名.属性值即可.(无论嵌套多少层都没事) select empid,name,gender,birthday,mobile,email,position,note
from tbemployee 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 map=new HashMap<>();
map.put(“username”, “小明”);
map.put(“sex”, “1”);
List 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语句拼接起来.

2.3.2 where标签

实际上在关联查询的where后面先拼接1=1是不好的做法,因为它会降低效率.更好的做法是用where标签去替代:

Where标签可以判断后面有没有内容.如果后面只有1个内容,就会将and去掉.并且拼接上where.如果后面有两个或者以上的条件,那么将第一个条件,即where后面的条件,去掉and,然后将其他条件的and保留.如果后面没有

条件,则在主的sql语句后面不会添加where关键字.具体做法如下:

2.3.3 sql片段

Sql片段方便我们将一些sql语句中相同的部门提取出来,先声明为sql片段,然后在书写sql语句的时候,直接引用这些sql片段即可.注意,sql片段应该具有可复用性.具体做法如下所示:




AND username LIKE ‘%${user.username}%’


AND sex=#{user.sex};


  1. <!-- 通过if标签完成检索 --><br /> <select id="findUserByQuery" parameterType="com.xyy.po.UserQueryVO" resultType="user"><br /> SELECT * FROM USER<br /> <!-- 什么都没输,直接输出SELECT * FROM USER --><br /> <where><br /> <include refid="queryUser"></include><br /> </where><br /> </select>

2.3.4 foreach标签.

例如,如果需要根据传入的一系列的id,去查询对应的用户,要怎么做呢?

这种需求所对应的sql语句应该如下:

SELECT * FROM USER WHERE id IN (…)

括号内放的是传入的所有id值.而我们在mybatis可以通过foreach标签来完成对于传入的集合的遍历.具体做法如下所示:





AND id IN

#{id}


上面的是通过POJO对象传入List集合,实际上我们可以直接传入List集合.代码如下:

需要注意的是获取这个List集合,mybatis声明的变量为list.而这个变量变量名是不可以改变的.


加油