Mybatis入门二一映射器

来源:互联网 发布:高频关键词共现矩阵 编辑:程序博客网 时间:2024/05/20 13:18

   映射器是由java接口和xml文件或者注解共同组成的,它的作用如下:

 1)定义参数类型;2)描述缓存;3)描述sql语句;4)定义查询结果和pojo的映射关系

     一个映射器的实现方式有两种,一种是通过xml文件方式实现,比如Mapper配置的xml文件。另外一种就是通过代码方式实现,在Configuration里面注册Mapper接口(当然里面还需要写入java注解)。当然它也是mybatis的核心内容,同时也是最为复杂的。这两种方式都可以实现需求,不过建议使用xml文件配置的方式,理由有下面两个:

    java注解是受限的,功能较少,而mybatis的Mapper内容相当多,而且相当复杂,功能很强大,使用xml文件方式可以带来更为灵活的空间,显示出mybatis功能的强大和灵活;

   如果你的sql很复杂,条件很多,尤其是存在动态sql的时候,写在java文件里面可读性较差,增加了维护的成本。


一  xml文件配置方式实现Mapper

     使用xml文件配置是mybatis实现Maper的首选方式。它由一个java接口和一个xml文件构成。下面看看如何实现:

    第一步:给出java接口,代码如下:


   这里定义了一个接口,它有一个方法getRole,通过角色变化找到角色对象

    

package org.mybatis.mapper;import org.mybatis.pojo.Role;//接口public interface RoleMapper {// 通过id获取角色public Role getRole(Long id);}

   第二步:给出一个映射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="org.mybatis.mapper.RoleMapper">  <select id="getRole" parameterType="long" resultType="role">    select id,role_name as roleName,note from role where id = #{id}  </select></mapper>

   上面的xml文件做了什么了?

  1)这个文件是需要在mybatis-config中配置的,所以mybatis会读取这个配置文件生成映射器

  2)定义了一个命名空间org.mybatis.mapper.RoleMapper的sql Mapper,这个命名空间和我们定义的接口的全限定名是一致的

  3)用一个select元素定义了一个查询sql,id为getRole,和接口定义的方法一致的,而parameterType则表示我们传递给这条sql的是一个java.lang.Long型参数,而resultType则定义我们需要返回的数据类型,这里为role,而role是我们之前注册的org.mybatis.pojo.Role别名

    下面是mybatis-config的配置:

<?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="org.mybatis.pojo.Role" alias="role"/></typeAliases><!-- 定义数据库信息,默认使用development数据库构建环境 -->  <environments default="development">    <environment id="development">    <!--采用jdbc事务管理  -->      <transactionManager type="JDBC"/>      <!-- 配置数据库连接信息 -->      <dataSource type="POOLED">        <property name="driver" value="com.mysql.jdbc.Driver"/>        <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>        <property name="username" value="root"/>        <property name="password" value="root"/>      </dataSource>    </environment>  </environments>   <mappers>    <mapper resource="org/mybatis/mapper/RoleMapper.xml"/>  </mappers></configuration>

    下面是Role这个类的pojo,代码如下:

   

package org.mybatis.pojo;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;}}

    上面是一个简单的pojo对象,定义了属性和get,set方法。

   在mapper里面我们定义了一条sql语句,select id,role_name as roleName,note from role where id = #{id}

  ,#{id}为这条sql的参数。而sql列的别名和POJO的属性名保持一致,那么mybatis就会把这条查询语句的结果自动映射到我们需要的pojo属性上,这就是自动映射。引入mysql的java驱动包,项目结构现在如下:




    上面红色框的是目前为止使用到的jar包

    我们可以用SqlSession来获取这个Mapper,代码也比较简单,如下所示:

package com.mybatis.sql.session.factory;import java.io.IOException;import java.io.InputStream;import org.apache.ibatis.datasource.pooled.PooledDataSource;import org.apache.ibatis.io.Resources;import org.apache.ibatis.mapping.Environment;import org.apache.ibatis.session.Configuration;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.apache.ibatis.transaction.TransactionFactory;import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;import org.mybatis.mapper.RoleMapper;import org.mybatis.pojo.Role;public class MybatisSqlSessionFactory {public static void main(String args[]) {// mybatis配置文件的路径String resource = "org/mybatis/config/mybatis-config.xml";InputStream inputStream = null;try {// 获取资源的输入流inputStream = Resources.getResourceAsStream(resource);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}SqlSessionFactory sqlSessionFactory = null;// 获取到SqlSessionFactory对象sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 定义SqlSession并获取到值SqlSession sqlSession = null;sqlSession = sqlSessionFactory.openSession();// 获取映射器MapperRoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);Role role = roleMapper.getRole(1L);// 执行方法获取角色对象System.out.println(role.getRoleName());// 打印角色名称sqlSession.close();/* * SqlSession sqlSession = null; try{ sqlSession * =sqlSessionFactory.openSession(); //to do something * sqlSession.commit(); }catch(Exception ex){ * System.err.println(ex.getMessage()); sqlSession.rollback(); }finally{ * //在 finally中确保资源的关闭 if(sqlSession != null){ sqlSession.close(); } } */}// 通过java代码来创建SqlSessionFactorypublic static SqlSessionFactory createSqlSessionFactoryByJavaCode() {// 构建数据库连接池PooledDataSource dataSource = new PooledDataSource();dataSource.setDriver("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");dataSource.setUsername("root");dataSource.setPassword("root");// 构建数据库事务方式TransactionFactory transactionFactory = new JdbcTransactionFactory();// 创建数据库运行环境Environment enviroment = new Environment("development", transactionFactory, dataSource);// 构建Configuration对象Configuration configuration = new Configuration(enviroment);// 注册一个mybatis上下文别名configuration.getTypeAliasRegistry().registerAlias("role", Role.class);// 加入一个映射器configuration.addMapper(RoleMapper.class);//SqlSessionFactory selSesionFactory = new SqlSessionFactoryBuilder().build(configuration);return selSesionFactory;}}

    二  java注解方式实现Mapper

   java注解方式实现映射方法不难,只需要在接口中使用java注解,注入sql即可。下面是接口的代码:

package org.mybatis.mapper;import org.apache.ibatis.annotations.Select;import org.mybatis.pojo.Role;//接口,通过注解实现mapperpublic interface RoleAnnotationMapper {// 通过id获取角色@Select(value = "select id,role_name as roleName,note from role where id = #{id}")public Role getRole(Long id);}
    上面的代码我们使用了@Select 注解,注入了和xml一样的select元素,这样mybatis就会读取这条sql,并将参数id传递进sql,同样使用了别名,这样mybatis就会给我们进行自动映射,得到我们需要的Role对象。
   下面是使用java注解实现的mapper进行数据操作的代码:

public static void main(String args[]) {// mybatis配置文件的路径String resource = "org/mybatis/config/mybatis-config.xml";InputStream inputStream = null;try {// 获取资源的输入流inputStream = Resources.getResourceAsStream(resource);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}SqlSessionFactory sqlSessionFactory = null;// 获取到SqlSessionFactory对象sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 定义SqlSession并获取到值SqlSession sqlSession = null;sqlSession = sqlSessionFactory.openSession();/* * // 获取映射器Mapper,xml方式 RoleMapper roleMapper = * sqlSession.getMapper(RoleMapper.class); Role role = * roleMapper.getRole(1L);// 执行方法获取角色对象 * System.out.println(role.getRoleName());// 打印角色名称 sqlSession.close(); */// 使用java注解实现Mapper// 需要在mybatis的配置文件中注册MappersqlSessionFactory.getConfiguration().addMapper(RoleAnnotationMapper.class);RoleAnnotationMapper roleMapper = sqlSession.getMapper(RoleAnnotationMapper.class);Role role = roleMapper.getRole(1L);// 执行方法获取角色对象System.out.println("注解方式:" + role.getRoleName());// 打印角色名称/* * SqlSession sqlSession = null; try{ sqlSession * =sqlSessionFactory.openSession(); //to do something * sqlSession.commit(); }catch(Exception ex){ * System.err.println(ex.getMessage()); sqlSession.rollback(); }finally{ * //在 finally中确保资源的关闭 if(sqlSession != null){ sqlSession.close(); } } */}

   注意:sqlSessionFactory.getConfiguration().addMapper(RoleAnnotationMapper.class);这一句代码比较重要,说明在mybatis的配置文件中加入我们的java注解实现的mapper

   关于映射就简单的总结到这,下面会总结mybatis主要用的接口类的生命周期。










0 0
原创粉丝点击