MyBatis框架核心之(二)Mapper配置文件使用接口映射

2018-02-27 11:53:15来源:oschina作者:bugwfq人点击

分享
二、Mybatis接口映射(Mapper文件)
使用接口映射可以方便我们开发

配置方式


1.定义接口

定义一个接口指定方法,如果需要获取结果可以指定对应的返回类型,没有返回结果则可以,定义成void类型


注意:方法名和参数的格式


方法名:


因为方法名需要与mapper.xml配置中sql标签的id一样所以取名要注意


参数:


传入的参数是mapper.xml 文件中sql语句需要的参数,可以是自定义实体,也可以是单个变量,也可以是集合。

如果mapper.xml文件中需要根据形参名获取参数的值则需要添加

@Param (“参数名称”)注解


(在mapper.xml文件中获取值,在下面会讲到)



package cn.et.fuqiang.interfaceMap.xml;

import java.util.Map;

import org.apache.ibatis.annotations.Param;

/**

* 接口映射 mappersql标签的id必须与接口的方法名一样

* @authorAdministrator

*

*/

publicinterface InterfaceMyUser {

public Map queryMyUserById(@Param("userid") Integer userid);

publicvoid updateUserByMap(Mapmap);

publicvoid saveUserByMap(Mapmap);

publicvoid deleteUserById(Integer userid);

}




2.创建接口映射的Mapper.xml文件

1).Mapper.xml文件名要求


因为要在Mabatis.xml文件中注册接口所以有两种命名方式:


第一种:

如果在Mabatis.xml文件使用属性注册的话可以,任意起名


第二种:


如果在Mabatis.xml文件使用属性注册,则mapper.xml文件名必需与接口名相同


2).变量的取值


在mapper.xml文件中获取方法中传入的变量有多种方式取值


1.根据索引获取


从0开始(比如形参中有两个参数,索引就是0,1)


2.根据默认的参数名获取


从param1开始(比如形参中有两个参数,默认的属性名就是param1,param2)


3.根据自定义名获取


在形参的参数前使用 function name(@Param(“name”)Stringname)


则可以直接使用name


两种表达式:


el表达式取值(${})


只能用在形参中指定的名称 和 默认的参数名 param1,2,3…. 名字来取值,不能根据索引取值因为el表达式会把索引当运算的数字

注意:


el表达式取值的方法相当于字符串的拼接如果是字符串的话需要自己添加单引号 如:name=’${param1}’)


所以使用el表达式无法防止sql注入


ognl表达式取值(#{})


可以根据上面的三种的任意一种取值,并且取值的方法是以? 号的方式,相当与使用jdbc中 预编译的sql PreparedStatement 方法传入参数的,所以可以防止sql注入。


3).namespace的属性值


因为使用的是接口映射,所以namespace的属性值必须是接口的全类名(包名+接口名)


4).返回查询的结果

在查询的标签中加入resultType属性指定返回类型,


可以直接写全类名,也可以在Mybatis.xml文件中使用下面的注解自定义别名




<typeAliases>

""/>

"" alias=""/>




在mybatis中为一些类型默认自定义了别名可以在


TypeAliasRegistry.class类中查看



"queryMyUserById"resultType="map">

select * from myuser where userid=${userid}




详细配置



mapper.xml




<?xmlversion="1.0"encoding="UTF-8"?>

"cn.et.fuqiang.interfaceMap.xml.InterfaceMyUser">

"deleteUserById">

delete from myuser where id=#{param1}

"saveUserByMap" >

"userid" order="BEFORE" resultType="int">

select nvl(max(userid),0)+1 from myuser

insert into myuser(userid,username,userage) values(#{userid},#{username},#{userage})

"updateUserByMap">

update myuser set username=#{username},userage=#{userage} where userid=#{uid}




3.Mybatis.xml配置文件(Mybatis的大脑)

1).指定jdbc.properties文件的路径


使用" ">标签


2).配置jdbc环境




"development">

"development">

"JDBC" />

"POOLED">

"driver" value="${driverClass}" />

"url" value="${url}" />

"username" value="${user}" />

"password" value="${password}" />




3).配置接口映射



"cn.et.fuqiang.interfaceMap.xml.InterfaceMyUser" />



详细配置



Mybatis.xml




<?xmlversion="1.0"encoding="UTF-8"?>

"cn/et/fuqiang/interfaceMap/xml/jdbc.properties">

"development">

"development">

"JDBC" />

"POOLED">

"driver" value="${driverClass}" />

"url" value="${url}" />

"username" value="${user}" />

"password" value="${password}" />

"cn.et.fuqiang.interfaceMap.xml.InterfaceMyUser" />



所有实例的代码实现


jdbc.properties文件



url=jdbc:oracle:thin:@localhost:1521:orcl

user=mybatis

password=mybatis

driverClass=oracle.jdbc.OracleDriver



Mybatis.xml文件的配置



<?xmlversion="1.0"encoding="UTF-8"?>

"cn/et/fuqiang/interfaceMap/xml/jdbc.properties">

"development">

"development">

"JDBC" />

"POOLED">

"driver" value="${driverClass}" />

"url" value="${url}" />

"username" value="${user}" />

"password" value="${password}" />

"cn.et.fuqiang.interfaceMap.xml.InterfaceMyUser" />



接口的代码



package cn.et.fuqiang.interfaceMap.xml;

import java.util.Map;

import org.apache.ibatis.annotations.Param;

/**

* 接口映射 mapper 中sql标签的id必须与接口的方法名一样

* @author Administrator

*

*/

public interface InterfaceMyUser {

public Map queryMyUserById(@Param("userid") Integer userid);

public void updateUserByMap(Map map);

public void saveUserByMap(Map map);

public void deleteUserById(Integer userid);

}




Mapper.xml配置文件



InterfaceMyUser.xml




<?xmlversion="1.0"encoding="UTF-8"?>

"cn.et.fuqiang.interfaceMap.xml.InterfaceMyUser">

"deleteUserById">

delete from myuser where id=#{param1}

"saveUserByMap" >

"userid" order="BEFORE" resultType="int">

select nvl(max(userid),0)+1 from myuser

insert into myuser(userid,username,userage) values(#{userid},#{username},#{userage})

"updateUserByMap">

update myuser set username=#{username},userage=#{userage} where userid=#{uid}



测试类



InterfaceMapXmlTest.java




package cn.et.fuqiang.interfaceMap.xml;

import java.io.InputStream;

import java.util.HashMap;

import java.util.Map;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import org.junit.Test;

public class InterfaceMapXmlTest {

private static SqlSession session;

private static InterfaceMyUser mapper=null;

static{

//mybatis的配置文件

String resource = "mybatis.xml";

//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)

InputStream is = InterfaceMapXmlTest.class.getResourceAsStream(resource);

//构建sqlSession的工厂

SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);

//使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)

//Reader reader = Resources.getResourceAsReader(resource);

//构建sqlSession的工厂

//SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);

//创建能执行映射文件中sql的sqlSession

session = sessionFactory.openSession();

mapper=session.getMapper(InterfaceMyUser.class);

}

@Test

public void quesrUserById(){

System.out.println(mapper.queryMyUserById(1));

}

//@Test

public void deleteUserByID(){

mapper.deleteUserById(1);

session.commit();

}

//@Test

public void insertUserByMap(){

Map map = new HashMap();

map.put("username", "wfq");

map.put("userage", 120);

mapper.saveUserByMap(map);

session.commit();

}

@Test

public void updateUserByMap(){

Map map = new HashMap();

map.put("uid", 2);

map.put("username", "wahaha");

map.put("userage", 18);

mapper.updateUserByMap(map);

session.commit();

}

}



最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台