您的位置:首页 > 移动开发

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;

/**

 * 接口映射  
mappersql标签的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指定一个唯一的namespacenamespace的值习惯上设置成包名+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指定一个唯一的namespacenamespace的值习惯上设置成包名+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();

         }

        

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐