博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net转Java自学之路—Mybatis框架篇二(SqlSession、原始开发、代理开发)
阅读量:6259 次
发布时间:2019-06-22

本文共 4056 字,大约阅读时间需要 13 分钟。

SqlSession范围:

  1、SqlSessionFactoryBuilder:通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory。

    将SqlSessionFactory当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder,在需要创建SqlSessionFactory时,只需要new一次SqlSessionFactoryBuilder即可。

  2、SqlSessionFactory:通过SqlSessionFactory创建SqlSession,使用单例模式管理sqlSessionFactory。在Mybatis和spring整合后,使用单例模式管理SqlSessionFactory。

  3、SqlSession:

    SqlSession是一个面向用户的接口。它提供了很多的操作数据库方法。
    SqlSession是线程不安全的,在SqlSession实现类中除了有接口中的方法,还有数据域属性。
    SqlSession最佳应用场合在方法体内。定义成局部变量使用。

原始开发方式:

  程序需要编写dao接口和dao实现类。在dao的实现类中需要注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession。

public class TestDaoImpl implements TestDao {    //通过构造函数方法注入SqlSessionFactory    private SqlSessionFactory sqlSessionFactory;    public TestDaoImpl(SqlSessionFactory sqlSessionFactory){        this.sqlSessionFactory=sqlSessionFactory;    }        public User findUserById(int id) throws Exception{        SqlSession sqlSession=sqlSessionFactory.openSession();        User user=sqlSession.selectOne("test.findUserById",id);        sqlSession.close();        return user;    }        public List
findUserByName(String username) throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); List
list = sqlSession.selectList("test.findUserByName",username); sqlSession.close(); return list; } ...... }

  由上述实例可发现原始开发方式存在的问题:

    1、dao接口实现类方法中存在大量模板方法。若将这些代码提取,将大大降低工作量。
    2、调用SqlSession方法时将statement的id实施了硬编码。
    3、调用sqlSession方法时传入的变量,由于sqlSession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,所以不利于开发。

代理开发方式:

  1、配置mapper.xml映射文件。同时需要在SqlMapConfig.xml中加载UserMapper.xml。

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

    开发规范:
      》在mapper.xml中namespace的属性值为mapper接口地址。

      》mapper接口中的方法名和mapper.xml中statement的id一致。

      》mapper接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。
      》mapper接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。

public interface UserMapper{    public User findUserById(int id) thorws Exception;    public List
findUserByName(String name) throws Exception;}public class UserMapperTest{ private SqlSessionFactory sqlSessionFactory; //指定测试方法前执行。 @Before public void setUp() throws Exception{ String resource="SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsString(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } public void testFindUserById(){ SqlSession sqlSession = sqlSessionFactory.openSession(); //创建UserMapper对象,Mybatis自动生成mapper代理对象。 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.findUserById(1); }}

    mapper接口方法参数只能有一个参数。在系统框架中,dao层的代码是被业务层公用的。即使mapper接口只有一个参数,也可以使用包装类型的pojo来满足不同的业务方法的需求。

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

Mybatis配置文件SqlMapConfig.xml:

  Mybatis的全局配置文件,配置内容如下:

    properties:属性。

      Mybatis将按照下面的顺序来加载属性:
        1、在properties元素体内定义的属性首先被读取。
        2、然后读取properties元素中resource/url加载的属性,它会覆盖已读取的同名属性。
        3、最后读取parameterType传递的属性,它会覆盖已读取的同名属性。
      建议:
        不要在properties元素体内添加任何属性值,只将属性值定义在properties文件中。在properties文件中定义属性名要有一定的特殊性。

    settings:全局参数配置。

      Mybatis框架在运行时可以调整一些运行参数。如:开启二级缓存、开启延迟加载等。全局参数将会影响Mybatis的运行行为。

    typeAliases:类型别名。

      如:在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型,需要resultType指定输出结果的映射类型。
      若在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。
      Mybatis有一些默认的别名(),而pojo的类型定义别名则需要定义别名:

    typeHandlers:类型处理器。

      Mybatis中通过typeHandlers完成jdbc类型和java类型的转换。
      Mybatis默认支持的类型处理器:
        通常情况下,mybatis提供的类型处理器已经满足日常需要,不需要自定义。

    objectFactory:对象工厂

    pluglns:插件

    environments:环境集合属性对象

      > environment:环境子属性对象
        > transactionManager:事务管理
        > dataSource:数据源

    mappers:映射配置

 

转载于:https://www.cnblogs.com/zltao/p/10546135.html

你可能感兴趣的文章
HDU - 4118 Holiday's Accommodation
查看>>
函数式编程——C#理解
查看>>
java数组或集合返回空的问题
查看>>
【转】gc日志分析工具
查看>>
java多线程系列2-线程控制
查看>>
godep 包管理工具
查看>>
爬虫工程师要求
查看>>
Linux 远程查看tomcat控制台
查看>>
【转】七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)...
查看>>
[转] “error LNK2019: 无法解析的外部符号”之分析
查看>>
演示-JQuery关系选择器
查看>>
微信支付接口之jsApiPay教程
查看>>
C#十种语法糖
查看>>
PHP 如何显示大数字,防止显示为 科学计数法 形式
查看>>
数据扩展性探讨和总结--转
查看>>
spider RPC高级特性
查看>>
C# 导出资源文件到硬盘
查看>>
修复 ThinkPHP3.2.3 抛出异常模块的一个BUG,关闭字段缓存功能
查看>>
更改MySQL数据库的编码为utf8mb4
查看>>
android自动化测试--appium运行的坑问题及解决方法
查看>>