mybatis 的mapper代理小结

  Mapper动态代理方式 

   实现步骤

1.      mapper.xml 配置文件 (重)

2.      mapper.java  接口(重)

3.      记得加载映射文件SqlMapConfig.xml

     实现原理

       Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

Mapper接口开发需要遵循以下规范:(重要)

1、  Mapper.xml文件中的namespacemapper接口的类路径相同。

2、  Mapper接口方法名和Mapper.xml中定义的每个statementid相同

3、  Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql parameterType的类型相同

4、  Mapper接口方法的输出参数类型和mapper.xml中定义的每个sqlresultType的类型相同

Mapper.xml(映射文件)

       定义mapper映射文件UserMapper.xml(内容同Users.xml),需要修改namespace的值为 UserMapper接口路径。将UserMapper.xml放在classpath 下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">

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

<!-- 根据id获取用户信息 -->

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

       select * from user where id =#{id}

    </select>

<!-- 自定义条件查询用户列表 -->

    <select id="findUserByUsername" parameterType="java.lang.String"

           resultType="cn.hpu.mybatis.po.User">

      select * from user where username like '%${value}%'

    </select>

<!-- 添加用户 -->

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

    <selectKey keyProperty="id" order="AFTER"resultType="java.lang.Integer">

       select LAST_INSERT_ID()

    </selectKey>

     insert into user(username,birthday,sex,address)

     values(#{username},#{birthday},#{sex},#{address})

    </insert>

</mapper>

    Mapper.java(接口文件)

/**

 * 用户管理mapper

 */

Public interface UserMapper {

    //根据用户id查询用户信息

    public User findUserById(int id) throws Exception;

    //查询用户列表

    public List<User>findUserByUsername(String username) throws Exception;

    //添加用户信息

    public void insertUser(Useruser)throws Exception;

}

接口定义有如下特点:

1.Mapper接口方法名和Mapper.xml中定义的statementid相同

2、 Mapper接口方法的输入参数类型和mapper.xml中定义的statementparameterType的类型相同

3、 Mapper接口方法的输出参数类型和mapper.xml中定义的statementresultType的类型相同

1.1.5      加载UserMapper.xml文件

修改SqlMapConfig.xml文件:

  <!-- 加载映射文件 -->

  <mappers>

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

  </mappers>

1.1.6  测试

Public class UserMapperTest extends TestCase {

    private SqlSessionFactory sqlSessionFactory;

    protected void setUp() throws Exception {

       //mybatis配置文件

       String resource = "sqlMapConfig.xml";

       InputStream inputStream =Resources.getResourceAsStream(resource);

       //使用SqlSessionFactoryBuilder创建sessionFactory

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

    }

    Public void testFindUserById() throws Exception {

       //获取session

       SqlSession session = sqlSessionFactory.openSession();

//创建usermapper对象,mybatis自动生成mapper代理对象

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

       //调用代理对象方法

       User user = userMapper.findUserById(1);

       System.out.println(user);

       //关闭session

       session.close();

    }

    @Test

    public voidtestFindUserByUsername() throws Exception {

       SqlSession sqlSession = sqlSessionFactory.openSession();

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

       List<User> list =userMapper.findUserByUsername("");

       System.out.println(list.size());

    }

Public void testInsertUser() throws Exception {

       //获取session

       SqlSession session = sqlSessionFactory.openSession();

       //获取mapper接口的代理对象

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

       //要添加的数据

       User user = new User();

       user.setUsername("张三");

       user.setBirthday(new Date());

       user.setSex("1");

       user.setAddress("北京市");

       //通过mapper接口添加用户

       userMapper.insertUser(user);

       //提交

       session.commit();

       //关闭session

       session.close();

    }

}

1.1.7  总结    再次重申一下#{}和${}

#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。

如果接收简单类型,#{}中可以写成value或其它名称。

#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

 

${}表示一个拼接符号,会引用sql注入,所以不建议使用${}

${}接收输入参数,类型可以是简单类型,pojo、hashmap。

如果接收简单类型,${}中只能写成value。

${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。


selectOne和selectList

动态代理对象调用sqlSession.selectOne()和sqlSession.selectList()是根据mapper接口方法的返回值决定,如果返回list则调用selectList方法,如果返回单个对象则调用selectOne方法。

namespace

mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。

你可能感兴趣的:(java,Web,mybatis)