Mybatis的出现时为了弥补bibernate全表映射所带来的效率低下的问题。它是一个半自动映射的框架,需要手工匹配提供POJO、SQL和映射关系。 MyBatis所需要提供的映射文件为:
SQL映射规则POJO使用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(); }映射器是由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','骑士','扮演荆轲');