配置文件的头部
<configuration>
configuration>
标签首先要配置的是
下的环境标签
,这个是所有的环境,此标签下可以配置多个
标签,使用 id
属性区别不同的环境。这说明 MyBatis 可以配置多个环境,但是一次只能使用一个环境,指定目前使用的环境,只需要在
标签下使用 default
属性来指定使用哪个环境即可。
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
dataSource>
environment>
environments>
标签现在,就可以在
标签中配置其它属性了。第一,我们一定要配置一个 dataSource
标签,就是数据源,通过 type
属性来指定数据源的类型,可选的值有 POOLED
JNDI
UNPOOLED
三个值可以选择。// TODO 三种值的区别
标签内的
标签配置了类型之后,下一步就得让数据源连上数据库,所以我们需要在标签内配置几个属性标签。使用
配置属性,通过 name 属性指定要配置的属性名,通过 value 属性指定属性的值。在这里我们配置了四个属性分别是 driver
配置了数据库驱动,url
配置了数据库路径,username
配置了数据库用户名, password
配置了数据库用户密码。这样一来,理论上,我们就可以连接上数据库了。
<transactionManager type="JDBC">transactionManager>
使用
标签管理事务。使用 type
属性指定使用事务的类型,值有 JDBC
使用JDBC来管理事务。TODO 还有其它值吗?
标签配置完
标签,环境就已经配置好了,接下来要配置的是映射文件(包括了对实体类的操作),使用
标签配置所有的映射文件,注意:
首先定义
根标签,其它只有一个 namespace
属性需要定义,表示映射的接口类。之后Mybatis会根据配置文件中的操作实现接口类。
<mapper namespace="com.mybatis.dao.UserDao">
mapper>
查询使用 标签,插入使用
标签,更新使用
标签,删除使用
标签,它们都必须设置id属性,表示是实现了接口中的哪个方法,所以id的值必须与接口中的方法名相同。
如果查询结果与实现类是一一对应的,可以设置属性 resultType
来设置返回实体类型,Mybatis会自动将结果包装成一个或多个实体类型的实例(多个包装为 List
),
如果查询结果是一个值,就将 resultType
设置成值的类型即可得到。
// UserDao.java 接口类
public interface UserDao {
int selectCount();
List selectAll();
List selectLikeName(String name);
}
<select id="selectCount" resultType="int">
select count(1) from smbms_user
select>
<select id="selectAll" resultType="com.mybatis.pojo.User">
select * from smbms_user
select>
<select id="selectLikeName" resultType="com.mybatis.pojo.User" parameterType="String">
select * from smbms_user where userName like CONCAT('%', #{ name },'%')
select>
如果接口方法只有一个参数,可以直接在查询标签中使用 #{}
,中间写参数名(因为只有一个参数,参数名与接口方法中的形参名是否相同,无关紧要)即可。
但是如果有一个接口方法有两个或多个参数,应该怎么办?有两种方法:
1、使用Map类型的参数,所有的参数都放入一个Map中,Map的Key为参数名,Value为参数值。现在查询标签中使用的参数名就必须与Map中的Key一致。
// UserDao文件
public interface UserDao {
List selectByNameRole(Map map);
}
<select id="selectByNameRole" parameterType="Map" resultType="com.mybatis.pojo.User">
select * from smbms_user where userName like CONCAT('%', #{ userName },'%') and userRole = #{ userRole }
select>
// Test.java 测试文件
Map map = new HashMap<>();
map.put("userName", "张");
map.put("userRole", 3);
List list = userDao.selectByNameRole(map);
2、使用实体,将参数封装到一个实体类中,将实体类为参数,此时,实体中的属性名为在查询标签中的参数名。比如,保存用户时的代码。
// User.java 实体类文件
public User {
private String userCode; //用户编码
private String userName; //用户名称
private String userPassword; //用户密码
private Integer userRole; //用户角色
// setter与getter省略
}
// UserDao 接口文件
public interface UserDao {
int addUser(User user);
}
<insert id="addUser" parameterType="com.mybatis.pojo.User">
insert into smbms_user(userCode, userName, userPassword, userRole) values(#{ userCode }, #{ userName }, #{ userPassword }, #{ userRole })
insert>
// Test.java 测试类文件
User user = new User();
user.setUserCode("zhangwei");
user.setUserName("张伟");
user.setUserPassword("123456");
user.setUserRole(3);
int number = userDao.addUser(user);
标签的配置前面我们说的都是查询结果与实体类一一对应的情况,但是,当进行联表查询时,又应该怎么办呢?就应该使用
标签了,这个标签主要是对查询的结果进行映射,插入到对应的实体中。
标签可以使用的属性有 id
设置映射的ID,在查询标签中使用;属性 Type
设置要映射到的类的路径。
标签中可以使用的标签有
指定表中主键与类中的属性进行对应,
指定表中的列名与类中的属性进行对应,
标签指定表中属性与类中集合进行对应(一对多),
标签指定表中属性与类中子对象进行对应(一对一)。
假设,我们想在查询用户信息时,除了得到用户的信息外,还想知道用户的角色名称(UserRoleName)。就需要事先在用户类中多设置一个表示用户角色名称属性,该属性在上面的例子中均为空。只有使用
标签进行手动对应时,才能将值放入该属性中。
// User.java 实体类文件
public User {
private Long id;
// 省略其它属性
private String userRoleName; // 角色名称(存放用户角色名称的属性)
// 省略Setter和Getter
}
// UserDao.java 接口文件
public UserDao {
// 得到用户信息和角色名称信息
List selectUserRole();
}
<resultMap id="RoleUser" type="com.mybatis.pojo.User" >
<id property="id" column="id" />
<result property="userRoleName" column="userRoleName" />
resultMap>
<select id="selectRoleName" resultMap="RoleUser" >
select u.*, r.roleName as userRoleName from smbms_user u, smbms_role r where u.userRole = r.id
select>
// Test.java 测试文件
List list = userDao.selectUserRole();
list.get(0).getUserRoleName(); // 得到用户的角色名称信息
注意:在
标签中没有
标签或者
标签的情况下,可以默认自动匹配类中的属性名与表中的列名。一旦出现这两个标签其中任何一个,那默认将不再进行匹配,必须手动对应或在配置文件中强制匹配。
就像上面的例子,其实可以在
标签中只写 userRoleName
属性的对应,其它都可以省略。因为这个标签既没有
标签,也没有
标签。
如果想要强制匹配,可以在 mybatis-config.xml 文件下设置
标签的 name
属性设置为 autoMappingBehavior
,value
属性设置为 FULL
表示强制全部匹配。
<setting name="autoMappingBehavior" value="FULL">