码迷,mamicode.com
首页 > 移动开发 > 详细

4.MyBatis Mapper代理开发方式(推荐使用)

时间:2015-06-20 22:15:11      阅读:618      评论:0      收藏:0      [点我收藏+]

标签:mybatis mapper接口开发

1 Mapper代理开发方式(推荐)

Mapper代理的开发方式,程序员只需要编写mapper接口(相当于dao接口)即可。Mybatis会自动的为mapper接口生成动态代理实现类。

不过要实现mapper代理的开发方式,需要遵循一些开发规范。

    1.1  Mapper开发规范

        1、 mapper接口的全限定名要和mapper映射文件的namespace的值相同。

        2、 mapper接口的方法名称要和mapper映射文件中的statementid相同;

        3、 mapper接口的方法参数只能有一个,且类型要和mapper映射文件中statementparameterType的值保持一致。

        4、 mapper接口的返回值类型要和mapper映射文件中statementresultType值或resultMap中的type值保持一致;

 

    1.2  mapper接口编程步骤

        前提:SqlMapConfig.xml文件和PO类已经创建

        1、  编写mapper接口;

        2、  编写mapper映射文件;

        3、  加载mapper映射文件;

        4、  编写测试代码。

 

    1.3  程序编写

    

           编写mapper接口

        内容同UserDao接口一样。

        publicinterface UserMapper {

            //根据用户ID来查询用户信息

            public User findUserById(int id);

            //根据用户名称来模糊查询用户信息列表

            public List<User> findUsersByName(String username);

            //添加用户

            publicvoid insertUser(User user);

        }

         

              编写mapper映射文件

        重新定义mapper映射文件UserMapper.xml(内容同Users.xml除了namespace的值),放到新创建的目录mapper下。

        注意:由于是先开发的mapper接口,所以此时mapper映射文件要按照开发规范向mapper接口靠拢。

         

        <?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">

        <!-- namespace:此时用mapper代理方式,它的值必须等于对应mapper接口的全限定名  -->

        <mapper namespace="cn.itcast.mybatis.mapper.UserMapper">

         

            <!-- 根据用户ID,查询用户信息 -->

            <!--

               [id]statementid,要求在命名空间内唯一 

               [parameterType]:入参的java类型,可是是简单类型、POJOHashMap

               [resultType]:查询出的单条结果集对应的java类型

               [#{}]表示一个占位符?

               [#{id}]:表示该占位符待接收参数的名称为id。注意:如果参数为简单类型时,#{}里面的参数名称可以是任意定义

             -->

            <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">

               SELECT * FROM USER WHERE id = #{id}

            </select>

           

           

            <!-- 根据用户名称模糊查询用户信息列表 -->

            <!--

               [${}]:表示拼接SQL字符串,即不加解释的原样输出

                [${value}]:表示要拼接的是简单类型参数。

                注意:

               1、如果参数为简单类型时,${}里面的参数名称必须为value

               2${}会引起SQL注入,一般情况下不推荐使用。但是有些场景必须使用${},比如order by ${colname}

            -->

            <select id="findUsersByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">

               SELECT * FROM USER WHERE username LIKE ‘%${value}%‘

            </select>

           

            <!-- 添加用户之自增主键返回(selectKey方式) -->

            <!--

               [selectKey标签]:通过select查询来生成主键

               [keyProperty]:指定存放生成主键的属性

               [resultType]:生成主键所对应的Java类型

               [order]:指定该查询主键SQL语句的执行顺序,相对于insert语句,此时选用AFTER

               [last_insert_id]MySQL的函数,要配合insert语句一起使用

             -->

            <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">

               <selectKey keyProperty="id"resultType="int" order="AFTER">

                   SELECT LAST_INSERT_ID()

               </selectKey>

               INSERT INTO USER(username,sex,birthday,address) VALUES(#{username},#{sex},#{birthday},#{address})

            </insert>

           

        </mapper>

         

             加载mapper映射文件

        <!-- 加载mapper -->

        <mappers>

            <mapper resource="sqlmap/User.xml"/>

            <mapper resource="mapper/UserMapper.xml"/>

        </mappers>

              编写测试代码

         

        publicclass UserMapperTest {

         

            // 声明全局的SqlSessionFactory

            private SqlSessionFactory sqlSessionFactory;

         

            @Before

            publicvoid setUp() throws Exception {

               // 1、读取配置文件

               String resource = "SqlMapConfig.xml";

               InputStream inputStream = Resources.getResourceAsStream(resource);

               // 2、根据配置文件创建SqlSessionFactory

               sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

            }

         

            @Test

            publicvoid testFindUserById() {

               // 创建SqlSession

               SqlSession sqlSession = sqlSessionFactory.openSession();

               // 通过SqlSession,获取mapper接口的动态代理对象

               UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

               // 调用mapper对象的方法

               User user = userMapper.findUserById(1);

         

               System.out.println(user);

               // 关闭SqlSession

               sqlSession.close();

         

            }

         

            @Test

            publicvoid testFindUsersByName() {

               // 创建SqlSession

               SqlSession sqlSession = sqlSessionFactory.openSession();

               // 通过SqlSession,获取mapper接口的动态代理对象

               UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

               // 调用mapper对象的方法

               List<User> list = userMapper.findUsersByName("小明");

         

               System.out.println(list);

               // 关闭SqlSession

               sqlSession.close();

            }

         

            @Test

            publicvoid testInsertUser(){

               // 创建SqlSession

               SqlSession sqlSession = sqlSessionFactory.openSession();

               // 通过SqlSession,获取mapper接口的动态代理对象

               UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

              

               // 构建一个用户
                User user = new User();
                user.setUsername("刘泽栋");
                user.setAddress("湖北黄冈");
                user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("1994-01-15"));
                user.setSex("1");

              

               // 调用mapper对象的方法

               userMapper.insertUser(user);

         

               System.out.println(user.getId());

              

               //执行SqlSessioncommit操作

               sqlSession.commit();

               // 关闭SqlSession

               sqlSession.close();

            }

         

        }


4.MyBatis Mapper代理开发方式(推荐使用)

标签:mybatis mapper接口开发

原文地址:http://liuzedong.blog.51cto.com/8906170/1663817

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!