目录


SqlSession 是线程不安全的

SqlSession线程不安全 的;

对于它,我们建议在方法体内部使用;这样,即使多个线程同时访问了,每个线程都占用一片自己的内存,因此 ,sqlsession 对象就在不同的内存区域内,因此,就可以避免掉线程冲突的问题 ;


原始 dao 开发方法

原始 dao 层开发,需要我们写 接口实现类

  1. 接口

    package xin.ijava.dao;
    
    import xin.ijava.pojo.User;
    
    /**
    * @author An
    */
    public interface UserDao { /**
    * 添加用户
    * @param user 封装好的用户信息
    * @throws Exception
    */
    public void insertUser(User user) throws Exception ; /**
    * 删除用户 根据 id
    * @param id 用户 id
    * @throws Exception
    */
    public void deleteUserById(int id ) throws Exception ; /**
    * 更新用户
    * @param user 封装新信息的用户对象
    * @throws Exception
    */
    public void updateUser(User user) throws Exception ; /**
    * 查找用户
    * @param id 用户id
    * @return 用户对象
    * @throws Exception
    */
    public User findUserById(int id) throws Exception ; }
  2. 实现类

    package xin.ijava.dao;
    
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import xin.ijava.pojo.User; /**
    * @author An
    */
    public class UserDaoImpl implements UserDao{ /**
    * 注入sqlSessionFactory 工厂
    */
    private SqlSessionFactory factory ; public UserDaoImpl(SqlSessionFactory factory){
    this.factory = factory ;
    } @Override
    public void insertUser(User user) throws Exception {
    SqlSession sqlSession = factory.openSession() ;
    sqlSession.insert("test.insertUser",user) ;
    sqlSession.close();
    } @Override
    public void deleteUserById(int id) throws Exception {
    SqlSession sqlSession = factory.openSession() ;
    sqlSession.delete("test.deleteUserById",id) ;
    sqlSession.close();
    } @Override
    public void updateUser(User user) throws Exception {
    SqlSession sqlSession = factory.openSession() ;
    sqlSession.update("test.updateUserById",user) ;
    sqlSession.close();
    } @Override
    public User findUserById(int id) throws Exception {
    SqlSession sqlSession = factory.openSession() ;
    User user = sqlSession.selectOne("test.findUserById",id) ;
    sqlSession.close();
    return user;
    }
    }

  3. 总结

    1、上面的实现类代码中,可以看出,代码中存在着大量的模板代码,我们重复的写着这些代码;

    2、硬编码问题,我们把 statementid 硬编码到了代码中 ;

    3、参数是 object 类型,导致传任何类型的数据进去,都不会报错,即使传的数据类型根本不是映射关系中要求的类型,也不会得到报错,导致编译期间不会提示错误,直到运行期才能知道错哪了 ;


Mapper 代理方法

程序员只需要写出 mapper 接口(相当于 dao 接口)即可,无须写出实现类 ;

mapper 的开发规范:

  1. mapper.xmlnamespace 等于 mapper 接口地址

    <mapper namespace="xin.ijava.dao.UserMapper">
  2. mapper.java 接口中的方法名和 mapper.xml 中的 statementid 一致 ;

  3. mapper.java 接口中的方法输入参数类型和 mapper.xml 中的 statementparameterType 指定的类型一致 ;
  4. mapper.java 接口中的方法返回值类型和 mapper.xml 中的 statementresultType 指定的类型一致 ;

以上操作完成以后,就可以利用 mybatis 生成代理对象 ;

@Test
public void test2() throws Exception {
SqlSession sqlSession = factory.openSession() ;
// 获取代理对象,参数写上类的全路径名
UserMapper userMapper = sqlSession.getMapper(xin.ijava.dao.UserMapper.class) ;
// 利用代理对象,操作
User user = userMapper.findUserById(1) ;
System.out.println(user);
}

关于代理对象

代理对象是怎么知道具体调用什么方法的呢?

在构建代理对象的时候,会去查询 xxxMapper,xml 映射关系,根据标签名,就可以知道是调用什么方法了;标签名有: <select> 、<delete> 、<update> 、<insert>

根据接口方法名字,也就是 标签的 id 值,查询标签的名字,从而知道调用什么方法 ;

其中 select 方法,有点不同;因为有2中,selectOneselectList ;

代理对象,是根据接口的返回值来,判断调用哪一个的 ,假如接口的方法,返回单个 pojo 对象,则调用 selectOne,返回集合类型,则调用 selectList

(五)mybatis开发dao层的更多相关文章

  1. MyBatis开发Dao层的两种方式(原始Dao层开发)

    本文将介绍使用框架mybatis开发原始Dao层来对一个对数据库进行增删改查的案例. Mapper动态代理开发Dao层请阅读我的下一篇博客:MyBatis开发Dao层的两种方式(Mapper动态代理方 ...

  2. MyBatis开发Dao层的两种方式(Mapper动态代理方式)

    MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Ma ...

  3. 基于Mybatis的Dao层的开发

    基于Mybatis的Dao层开发 SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFa ...

  4. mybatis 学习笔记(三):mapper 代理开发 dao 层

    mybatis 学习笔记(三):mapper 代理开发 dao 层 优势 通过使用mapper 代理,我们可以不需要去编写具体的实现类(使用 getMapper() 方法自动生成),只需编写接口即可, ...

  5. 基于Mybatis的Dao层开发

    转自:https://www.cnblogs.com/rodge-run/p/6528398.html 基于Mybatis的Dao层开发 SqlSessionFactoryBuilder用于创建 Sq ...

  6. mybatis开发dao的方式

    mybatis基于传统dao的开发方式 第一步:开发接口 public interface UserDao { public User getUserById(int id) throws Excep ...

  7. MyBatis学习--mybatis开发dao的方法

    简介 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. 主要概念介绍: MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFac ...

  8. 四 mybatis开发dao的方法

    mybatis开发dao的方法 1.1     SqlSession使用范围 1.1.1     SqlSessionFactoryBuilder //以流的方式读取总的配置文件 Reader rea ...

  9. MyBatis开发Dao的原始Dao开发和Mapper动态代理开发

    目录 咳咳...初学者看文字(Mapper接口开发四个规范)属实有点费劲,博主我就废了点劲做了如下图,方便理解: 原始Dao开发方式 1. 编写映射文件 3.编写Dao实现类 4.编写Dao测试 Ma ...

随机推荐

  1. HTML标签---学习笔记

    第一章 HTML标准结构学习: 顶层标签:html 投标签:head 主题标签:boby <html> <head> <meta charset="utf-8& ...

  2. CF1197B

    CF1197B 题意: 出n个柱子,每个柱子一个圆盘,其半径各不相同,每次只能将柱子上只有一个圆盘的移到相邻位置,问能否全部移到一个柱子上. 解法: 思路题. 如果所有盘子都能移动到同一个柱子上,那么 ...

  3. hive 调优(一)coding调优

    本人认为hive是很好的工具,目前支持mr,tez,spark执行引擎,有些大公司原来封装的sparksql,开发py脚本,但是目前hive支持spark引擎(不是很稳定,建议Tez先),所以离线还是 ...

  4. [MyBatis]org.apache.ibatis.binding.BindingException的避免

    我遇到的org.apache.ibatis.binding.BindingException问题是因为Mapper.java中接口和SQL的参数多于一个,Mybatis不知道如何一一对应,解决方法是加 ...

  5. Mac下持续集成-与JMeter与Ant执行后自动发送邮件的整合+定时任务

    mac定时任务的开启: Last login: Tue Aug 13 22:49:54 on ttys004 (base) localhost:~ ligaijiang$ sudo launchctl ...

  6. vue2.0+vue-dplayer实现hls播放

    vue2.0+vue-dplayer实现hls播放 开始 安装依赖 npm install vue-dplayer -S 1,编写组件HelloWorld.vue <template> & ...

  7. Qt编写数据可视化大屏界面电子看板8-调整间距

    一.前言 在数据可视化大屏界面电子看板系统中,前期为了使用目标客户机,调整间距是必不可少的工作,QMainWindow中的QDockWidget,会默认生成布局和QSplitter调整宽高大小,鼠标移 ...

  8. windows10下idea快捷键文件

    没详细测试. https://my.oschina.net/superwen/blog/833482 |快捷键|英文说明|说明|冲突 |---|---|--| |Ctrl + Shift + F||根 ...

  9. 如何不让Excel图表随源数据改变而改变

    如何不让Excel图表随源数据改变而改变 一般我们在用Excel时,经常会碰到一些问题,比如,如何才能不让Excel图表随源数据改变而改变呢,下面就谈一下,一般在默认情况下,Excel的图表在一个区域 ...

  10. 阿里云服务出现TCP连接快速增加尤其是NON_ESTABLISHED大量增加导致内存和CPU暴增系统无法使用的问题

    TCP状态转移要点TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不 会被释放.网络服务器程序要同时管理大 ...