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主要用的接口类的生命周期。
- Mybatis入门二一映射器
- MyBatis 入门到精通(二) SQL语句映射XML文件 .
- MyBatis 入门到精通(二) SQL语句映射XML文件
- MyBatis 入门到精通(二) SQL语句映射XML文件
- MyBatis 入门到精通(二) SQL语句映射XML文件
- MyBatis快速入门(二) 多表映射
- MyBatis (二) 注解映射接口
- Mybatis映射关系-多对一映射
- Mybatis入门到精通-Mapper映射器模式
- MyBatis进阶(一)—映射
- Mybatis(十一)注解配置SQL映射器(二)
- 05.Mybatis初级使用-Mapper映射器(二)
- MyBatis读书学习笔记(二)——映射器
- 2.MyBatis 入门到精通(二) SQL语句映射XML文件
- mybatis之入门到开发(二)之核心配置文件+Mapper映射文件详解
- [MyBatis]MyBatis入门(一)
- MyBatis入门(二)
- MyBatis (二) 入门程序
- 求N个整数的平均值(注意N可能很大,N个数直接相加会造成整数溢出)
- 汇编入门基础与helloworld
- 关于setTimeout与setInterval返回值的问题
- vuejs2 directive
- 方法的递归调用
- Mybatis入门二一映射器
- 《算法竞赛入门经典训练指南》pdf
- 压缩机拆车件
- [模板]
- Oracle 中一些主要的V$视图种类
- egret 使用的一些小技巧
- 5 初始化与清理
- codeforces Naming Company 很思维题最优想法
- [构思]依据verilog源文件中的关键代码及其注释,使用脚本命令生成代码文档