MyBatis框架核心之(二)Mapper配置文件使用接口映射
2017-12-12 20:02
856 查看
二、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; /** * 接口映射 mapper 中sql标签的id必须与接口的方法名一样 * @author Administrator * */ public interface InterfaceMyUser { public Map<String,Object> queryMyUserById(@Param("userid") Integer userid); public void updateUserByMap(Map<String,Object> map); public void saveUserByMap(Map<String,Object> map); public void deleteUserById(Integer userid); } |
2. 创建接口映射的Mapper.xml文件
1).Mapper.xml文件名要求因为要在Mabatis.xml文件中注册接口所以有两种命名方式:
第一种:
如果在Mabatis.xml文件使用<mapper resource="mapper
文件的类路径">属性注册的话可以,任意起名
第二种:
如果在Mabatis.xml文件使用<mapper class="接口的全类名">属性注册,则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> <package name=""/> <typeAlias type="" alias=""/> </typeAliases> |
在mybatis中为一些类型默认自定义了别名可以在
TypeAliasRegistry.class类中查看
<select id="queryMyUserById" resultType="map"> select * from myuser where userid=${userid} </select> |
详细配置
mapper.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,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的 例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml文件去除后缀) --> <!-- 对应的执行语句 如果是接口映射 namespace必须是接口的全类名 也就是在mybatis中设置的mapper class的value --> <mapper namespace="cn.et.fuqiang.interfaceMap.xml.InterfaceMyUser"> <select id="queryMyUserById" resultType="map"> select * from myuser where userid=${userid} </select> <delete id="deleteUserById"> delete from myuser where id=#{param1} </delete> <insert id="saveUserByMap" > <selectKey keyProperty="userid" order="BEFORE" resultType="int"> select nvl(max(userid),0)+1 from myuser </selectKey> insert into myuser(userid,username,userage) values(#{userid},#{username},#{userage}) </insert> <update id="updateUserByMap"> update myuser set username=#{username},userage=#{userage} where userid=#{uid} </update> </mapper> |
3.Mybatis.xml配置文件(Mybatis的大脑)
1).指定jdbc.properties文件的路径使用<properties
resource=" "></properties>标签
2).配置jdbc环境
<!-- 配置jdbc环境 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <!-- 配置数据库连接信息 根据el表达式取值--> <dataSource type="POOLED"> <property name="driver" value="${driver 12f3b Class}" /> <property name="url" value="${url}" /> <property name="username" value="${user}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> |
3).配置接口映射
<mappers> <!-- 注册接口 如果使用的是注解则不需要mappers文件--> <!-- 接口映射设置接口的全类名 如果是xml文件映射则 则需要配置mapper配置文件 注意: 如果是xml映射 文件名必须与接口名相同 并且 namespace 值与下面的class值相同 --> <!-- 有两种方式配置mapper 第一种 如果有mapper.xml文件直接配置该文件 <mapper resource="mapper 文件的类路径"> 第二种 配置接口的全类名 重点:若果配置的是接口的全类名则mapper.xml 配置文件的名字必须与接口名字相同 <mapper class="接口的全类名"> --> <mapper class="cn.et.fuqiang.interfaceMap.xml.InterfaceMyUser" /> </mappers> |
详细配置
Mybatis.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> <!-- 指定jdbc的配置文件位置 --> <properties resource="cn/et/fuqiang/interfaceMap/xml/jdbc.properties"></properties> <!-- 配置jdbc环境 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <!-- 配置数据库连接信息 --> <dataSource type="POOLED"> <property name="driver" value="${driverClass}" /> <property name="url" value="${url}" /> <property name="username" value="${user}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> <!-- 使用接口映射 配置查询语句 --> <mappers> <!-- 注册接口 如果使用的是注解则不需要mappers文件--> <!-- 接口映射设置接口的全类名 如果是xml文件映射则 则需要配置mapper配置文件 注意: 如果是xml映射 文件名必须与接口名相同 并且 namespace 值与下面的class值相同 --> <!-- 有两种方式配置mapper 第一种 如果有mapper.xml文件直接配置该文件 <mapper resource="mapper 文件的类路径"> 第二种 配置接口的全类名 重点:若果配置的是接口的全类名则mapper.xml 配置文件的名字必须与接口名字相同 <mapper class="接口的全类名"> --> <mapper class="cn.et.fuqiang.interfaceMap.xml.InterfaceMyUser" /> </mappers> </configuration> |
所有实例的代码实现
jdbc.properties文件
url=jdbc:oracle:thin:@localhost:1521:orcl user=mybatis password=mybatis driverClass=oracle.jdbc.OracleDriver |
Mybatis.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> <!-- 指定jdbc的配置文件位置 --> <properties resource="cn/et/fuqiang/interfaceMap/xml/jdbc.properties"></properties> <!-- 配置jdbc环境 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <!-- 配置数据库连接信息 --> <dataSource type="POOLED"> <property name="driver" value="${driverClass}" /> <property name="url" value="${url}" /> <property name="username" value="${user}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> <!-- 使用接口映射 配置查询语句 --> <mappers> <!-- 注册接口 如果使用的是注解则不需要mappers文件--> <!-- 接口映射设置接口的全类名 如果是xml文件映射则 则需要配置mapper配置文件 注意: 如果是xml映射 文件名必须与接口名相同 并且 namespace 值与下面的class值相同 --> <!-- 有两种方式配置mapper 第一种 如果有mapper.xml文件直接配置该文件 <mapper resource="mapper 文件的类路径"> 第二种 配置接口的全类名 重点:若果配置的是接口的全类名则mapper.xml 配置文件的名字必须与接口名字相同 <mapper class="接口的全类名"> --> <mapper class="cn.et.fuqiang.interfaceMap.xml.InterfaceMyUser" /> </mappers> </configuration> |
接口的代码
|
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<String,Object> queryMyUserById(@Param("userid") Integer userid); public void updateUserByMap(Map<String,Object> map); public void saveUserByMap(Map<String,Object> map); public void deleteUserById(Integer userid); } |
Mapper.xml配置文件
InterfaceMyUser.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,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的 例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml文件去除后缀) --> <!-- 对应的执行语句 如果是接口映射 namespace必须是接口的全类名 也就是在mybatis中设置的mapper class的value --> <mapper namespace="cn.et.fuqiang.interfaceMap.xml.InterfaceMyUser"> <select id="queryMyUserById" resultType="map"> select * from myuser where userid=${userid} </select> <delete id="deleteUserById"> delete from myuser where id=#{param1} </delete> <insert id="saveUserByMap" > <selectKey keyProperty="userid" order="BEFORE" resultType="int"> select nvl(max(userid),0)+1 from myuser </selectKey> insert into myuser(userid,username,userage) values(#{userid},#{username},#{userage}) </insert> <update id="updateUserByMap"> update myuser set username=#{username},userage=#{userage} where userid=#{uid} </update> </mapper> |
测试类
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<String,Object> map = new HashMap<String,Object>(); map.put("username", "wfq"); map.put("userage", 120); mapper.saveUserByMap(map); session.commit(); } @Test public void updateUserByMap(){ Map<String,Object> map = new HashMap<String,Object>(); map.put("uid", 2); map.put("username", "wahaha"); map.put("userage", 18); mapper.updateUserByMap(map); session.commit(); } } |
相关文章推荐
- 使用mybatis-generator自动生成实体类,接口实现类和Mapper映射配置文件
- mybatis逆向工程自动生成实体类、接口以及映射Mapper.xml配置文件
- 使用Mybatis-Generator逆向生成po,映射文件和mapper接口
- 【SSM-MyBatis框架】Mapper.xml配置文件(mybatis的核心)
- Java的MyBatis框架中Mapper映射配置的使用及原理解析
- 简单三步快速学会使用Mybatis-Generator自动生成entity实体、dao接口以及mapper映射文件(postgre使用实例)
- mybatis之入门到开发(二)之核心配置文件+Mapper映射文件详解
- 使用Mybatis-Generator自动生成entity实体、dao接口以及mapper映射文件
- Java的MyBatis框架中Mapper映射配置的使用及原理解析
- 使用Mybatis生成工具自动生成实体类和对应的mapper映射文件以及接口文件
- Java的MyBatis框架中Mapper映射配置的使用及原理解析
- IDEA maven项目下测试mybatis例子,使用mappper class或package引入mapper映射文件,总是报错Invalid bound statement(所有配置完全正确)
- MyBatis框架核心之(四)Mapper文件使用resultMap及多表查询
- Mybatis使用generator自动生成映射配置文件信息
- 深入浅出Mybatis系列(七)---mapper映射文件配置之insert、update、delete
- Mybatis使用generator自动生成映射配置文件信息
- Mybatis使用generator自动生成映射配置文件信息
- Mybatis 框架使用的最核心内容(一):Mybatis的特点和映射管理
- Mybatis 框架使用的最核心内容(二):mapper.xml中常用的标签详解
- 【MyBatis框架】mapper配置文件-foreach标签