1、MyBatis出现的原因
Mybatis的出现时为了弥补bibernate全表映射所带来的效率低下的问题。它是一个半自动映射的框架,需要手工匹配提供POJO、SQL和映射关系。
MyBatis所需要提供的映射文件为:
- SQL
- 映射规则
- POJO
2、MyBatis基本的概念
- SqlSessionFactoryBuilder(SQL会话工厂构造器):根据配置新或者代码生成SqlSessionFactory
- SqlSessionFactory:依靠工厂来生成SqlSession会话
- SqlSession一个即可发送SQL去执行并返回结果,也可以获取Mapper的接口;
- SQL Mapper: 由一个Java接口和XML文件构成,需要给出相应的SQL和映射规则,并返回执行的结果。
3、使用xml文件构建
使用XML文件构建时,Mybatis的解析程序会将mybatis-config.xml文件配置信息解析到Configuration类的对象里面,然后利用SqlSessionFactoryBuilder读取这个对象,为我们创建SqlSessionFactory
mybatis-config.xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org//dtd//mybatis-3-config.dtd">
<configuration>
<!--定义别名-->
<typeAliases>
<typeAlias type="com.hh.xlt.model.Role" alias="role"/>
</typeAliases>
<!--定义数据库信息,默认使用development数据库构建环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.Driver"/>
<property name="url" value="jdbc:mysql://localhost:16003/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="toor"/>
</dataSource>
</environment>
</environments>
<!--定义映射器-->
<mappers>
<mapper resource="resources/mapper/roleMapper.xml"/>
</mappers>
</configuration>
创建会话的java代码:
String resource="mybatis-config.xml";
try{
InputStream inputStream= Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}catch (IOException e){
e.printStackTrace();
}
3、映射器
映射器是由JAVA接口和XML文件(或注解)共同组成,有如下作用:
- 定义参数类型
- 描述缓存
- 描述SQL语句
- 定义查询结果和POJO的映射关系
使用XML文件实现mapper比较好,可以实现比较复杂的映射;使用java注解也可以实现,但是注解是受限的,并且使用动态SQL时,java的维护比较困难。
实例:实现上面的role查询
首先定义java接口:
package com.hh.xlt.dao;
import com.hh.xlt.model.Role;
public interface RoleMapper {
public Role getRole(Long id);//通过id查询一个角色对象
}
然后给出一个映射的XML文件,RoleMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org//dtd//mybatis-3-mapper.dtd">
<mapper namespace="com.hh.xlt.dao.RoleMapper">
<select id="getRole" parameterType="long" resultType="Role">
SELECT id,role_name as roleName,note FROM role_t where id=#{id}
</select>
</mapper>
代码中的SELECT id,role_name as roleName,note FROM role_t where id=#{id}
为SQL语句,#{id}
与接口 public Role getRole(Long id);
传入的参数名称相对应。
Role类定义为:
package com.hh.xlt.model;
public class Role {
private Long id;
private String roleName;
private String note;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
}
建表SQL语句:
DROP TABLE IF EXISTS `role_t`;
CREATE TABLE `role_t`
(
`id` BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT 'ID主键',
`role_name` VARCHAR(50) NOT NULL COMMENT '角色名字',
`note` VARCHAR(100) NOT NULL COMMENT '详细信息'
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT role_t(id,role_name,note) VALUES ('1','皇帝','扮演秦始皇');
INSERT role_t(id,role_name,note) VALUES ('2','乞丐','扮演苏乞儿');
INSERT role_t(id,role_name,note) VALUES ('3','骑士','扮演荆轲');