原始 dao开发问题

1、dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。

2、调用sqlsession方法时将statement的id硬编码了

3、调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误(传入的是泛型类),在编译阶段也不报错,不利于程序员开发。

mapper代理方法(程序员只需要mapper接口(相当 于dao接口))

思路(mapper代理开发规范):

Mapper代理开发避免了原始的dao接口开发中实现类的很多重复代码,让程序员减轻了工作量

Sql语句的删除、更新、添加操作要进行会话的提交才会生效

程序员还需要编写mapper.xml映射文件

程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。

开发规范:

1、在mapper.xml中namespace等于mapper接口地址

2、mapper.java接口中的方法名和mapper.xml中statement的id一致

(使用mapper代理对象,mybatis会自动根据接口地址和命名空间去查找相对应的statement的id)

3、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。

代理对象内部调用selectOne或selectList

如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。

如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。

mapper接口方法参数只能有一个是否影响系统 开发

mapper接口方法参数只能有一个,系统是否不利于扩展维护。

系统 框架中,dao层的代码是被业务层公用的。

即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。

注意:持久层方法的参数可以包装类型、map。。。,service方法中建议不要使用包装类型(不利于业务层的可扩展)。

eclipse项目的结构

UserMapper.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">
<!-- namespace命名空间,作用就死对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用(刚开始学还不能理解) -->
<mapper namespace="ql.mybatis.mapper.UserMapper">
<!-- 在映射文件中配置很多sql语句-->
<!-- 需求:通过id查询用户表的记录 -->
<!-- 通过select 执行数据库的查询
id:标识映射文件的sql
将sql语句封装到mappedStatement对象中,所以将id称为statement的id
parameterType:指定输入参数的类型,这里指定int型
#{}表示一个占位符
#{id}:其中的id表示接受输入的参数,参数名称就是id,如果输入的参数是简单类型,#{}中的参数可以任意
resultType:指定sql输出的结果的所映射的java对象类型,select指定restultType表示将单条记录映射成java对象
-->
<select id="findUserById" parameterType="int" resultType="ql.mybatis.pojo.User">
select * from User where id=#{id}
</select> <select id="findUserById2" parameterType="ql.mybatis.pojo.User" resultType="ql.mybatis.pojo.User">
select * from User where sex=#{sex} and address=#{address}
</select> <!-- 根据用户名称模糊查询用户信息,可能返回多条
resultType:指定就是单条记录所映射的java对象 类型
${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。
使用${}拼接sql,引起 sql注入
${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value
-->
<select id="findUserByName" parameterType="String" resultType="ql.mybatis.pojo.User">
SELECT * FROM USER WHERE username LIKE '%${value}%'
</select> <!-- 添加用户
parameterType:指定输入 参数类型是pojo(包括 用户信息)
#{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值
-->
<insert id="insertUser" parameterType="ql.mybatis.pojo.User">
insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
</insert> <!-- 删除用户 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete> <!-- 更新用户
必须指定id,否则将会将表的内容全部更新
-->
<update id="updateUser" parameterType="ql.mybatis.pojo.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
</mapper>

UserMapper接口:

package ql.mybatis.mapper;

import java.util.List;

import ql.mybatis.pojo.User;

public interface UserMapper {

    public User findUserById(int id) throws Exception;
public List<User> findUserByName(String name) throws Exception;
public User findUserById2(User user) throws Exception;
public void insertUser(User user) throws Exception;
public void deleteUser(int id) throws Exception;
}

单元测试类:

package ql.mybatis.test;

import java.io.InputStream;
import java.util.Date;
import java.util.List; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test; import ql.mybatis.mapper.UserMapper;
import ql.mybatis.pojo.User; public class UserMapperTest { SqlSession sqlSession = null; @Before
public void setUp() throws Exception {
// mybatis配置文件
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
sqlSession = sqlSessionFactory.openSession();
} @Test
public void testFindUserById() throws Exception { UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserById(22);
System.out.println(user); } @Test
public void testFindUserByName() throws Exception {
// 得到代理对象,接口回调
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> list = userMapper.findUserByName("小明");
System.out.println(list);
} @Test
public void testInsertUser() throws Exception { UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setSex("1");
user.setAddress("北京市");
user.setBirthday(new Date());
user.setUsername("王大东");
userMapper.insertUser(user);
sqlSession.commit(); } @Test
public void testDeleteUser() throws Exception {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.deleteUser(10);
sqlSession.commit();
}
@Test
public void testFindUserById2() throws Exception {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user=new User();
user.setSex("1");
user.setAddress("福建福州");
User user2=userMapper.findUserById2(user);
System.out.println(user2);
} }

 还应在配置文件中SqlMapConfig.xml加上:

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

可以看到并没有写UserMapper接口的实现类,mybatis帮我们生成了一个Mapper代理对象

mapper代理(十一)的更多相关文章

  1. mybatis入门基础(二)----原始dao的开发和mapper代理开发

    承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重复代码,看起来不是很清楚,但第一次那样写,是为了解mybatis的执行步骤,先 ...

  2. Spring+SpringMVC+Mybatis大整合(SpringMVC采用REST风格、mybatis采用Mapper代理)

    整体目录结构: 其中包下全部是采用mybatis自动生成工具生成. mybatis自动生成文件 <?xml version="1.0" encoding="UTF- ...

  3. mybatis——使用mapper代理开发方式

    ---------------------------------------------------------------generatorConfig.xml------------------ ...

  4. 12Mybatis_用mapper代理的方式去开发以及总结mapper开发的一些问题

    上一篇文章总结了一些Dao开发的问题,所以我们这里开始讲一种mapper代理的方式去开发. 我先给出mapper代理开发的思路(mapper代理开发的规范): 我们用mapper代理开发时要写2个: ...

  5. 10_Mybatis开发Dao方法——mapper代理实现

    [工程截图(几个关键的标红框)] [UserMapper.xml] <?xml version="1.0" encoding="UTF-8"?> & ...

  6. mybatis入门-mapper代理原理

    原始dao层开发 在我们用mybatis开发了第一个小程序后,相信大家对于dao层的开发其实已经有了一个大概的思路了.其他的配置不用变,将原来的test方法,该为dao的方法,将原来的返回值,直接在d ...

  7. mybatis系列笔记(2)---mapper代理方法

    mapper代理方法 在我们在写MVC设计的时候,都会写dao层和daoimp实现层,但假如我们使用mapper代理的方法,我们就可以不用先daoimp实现类 当然这得需要遵守一些相应的规则: (1) ...

  8. Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6869133.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)——My ...

  9. 用mybatis实现dao的编写或者实现mapper代理

    一.mybatis和hibernate的区别和应用场景hibernate:是一个标准的ORM框架(对象关系映射).入门门槛较高的,不需要写sql,sql语句自动生成了.对sql语句进行优化.修改比较困 ...

随机推荐

  1. 部分转 php kafka

    Step 1: 下载Kafka (官网地址:http://kafka.apache.org) Kafka入门经典教程 http://www.aboutyun.com/thread-12882-1-1. ...

  2. macOS(Sierra 10.12)上Android源码(AOSP)的下载、编译与导入到Android Studio

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  3. PHP使用JpGraph绘制折线图

    PHP使用JpGraph绘制折线图 下载jpgraph类库,使用的是src目录下的类文件. require_once './src/jpgraph.php'; require_once './src/ ...

  4. ThinkPHP 的 Vender的简单实用

    ThinkPHP 的 Vender的简单实用 框架版本:3.2 示例一.调用二维码类: Vendor('phpqrcode.phpqrcode'); $QRcode = new \QRcode (); ...

  5. 阿里云oss教程

    OSS是提供非结构化数据存取的服务.对于刚开始使用OSS的用户,非结构数据可以理解为word文档.PDF.PPT.EXCEL表格.MP3.MKV.RMVB.HTML等各种类型文件.OSS提供API去进 ...

  6. Vue.js实战:初识Vue.js

    一.Vue.js是什么 简单小巧的核心,渐进式技术栈,足以应付任何规模的应用. 简单小巧指的是Vue.js 压缩后大小仅有17KB 所谓渐进式(Progressive)就是你一步一步,有阶段性地来使用 ...

  7. [Inside HotSpot] UseParallelGC和UseParallelOldGC的区别

    JVM的很多参数命名很有迷惑性,-XX:+UseParallel,-XX:+UseParallelOldGC,-XX:+UseParNewGC,-XX:+UseConcMarkSweepGC咋一看容易 ...

  8. 蚂蚁金服CTO程立:金融级分布式交易的技术路径

    总结: 强一致的微服务 oceanbase里面的投票选举以及多中心多地部署 单元化市异地多活的基础.支付宝是异地多活和容灾结合,而容灾的基础也是单元化.基于单元化进行单元的调度.部署.容灾. 混合云架 ...

  9. HAXM 6.0.5显示不兼容Windows

    HAXM 6.0.5显示不兼容Windows 最近更新Android后,用户会在Android Manager中发现,以前可以安装Intel x86模拟器现在不能安装了.提示错误信息如下:intel  ...

  10. MySql_ procedure

    返回参数示例 下面是一个示例: delimiter //S drop procedure if EXISTS myzrz; CREATE PROCEDURE myzrz(in pin int,out ...