Mybatis

1 、数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响 数据库性能。
设想:使用数据库连接池管理数据库连接。
 
2 、将 sql 语句 硬编码 java 代码中,如果 sql 语句修改,需要重新编译 java 代码,不利于系统维护。
设想:将 sql 语句 配置在 xml 配置文件中,即使 sql 变化,不需要对 java 代码进行重新编译。
 
 
3 、向preparedStatement 中设置参数,对占位符号位置和设置参数值,硬编码在 java 代码中,不利于系统维护。
设想:将 sql 语句 及占位符号和参数全部配置在 xml 中。
 
4 、从 resutSet 中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,,不利于系统维护。
设想:将查询的结果集,自动映射成 java 对象。
1 mybatis 框架
         1.1 mybatis 是什么?
        mybatis是一个持久层的框架,是 apache 下的顶级项目。
        mybatis 托管到 goolecode 下,再后来托管到 github (https://github.com/mybatis/mybatis-3/releases )
        mybatis让程序将主要精力放在 sql 上,通过 mybatis 提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写 sql )满足需要 sql 语句。
        mybatis 可以将向 preparedStatement 中的输入参数自动进行 输入映 射,将查询结果集灵活映射成 java 对象。( 输出映射
 
    1.2 mybatis 框架
 
                                
    1.3入门程序
 
        1.3.1 创建 po
                                            
 
 
        1.3.2 映射文件
                映射文件命名:
                User.xml (原始 ibatis 命名), mapper 代理开发映射文件名称叫 XXXMapper.xml ,比如: UserMapper.xml ItemsMapper.xml
                在映射文件中配置 sql 语句。
 
                            
                        
        1.4. 总结
 
            1.2.1 parameterType
                            在映射文件中通过 parameterType 指定输入 参数的类型。
            1.4.2 resultType
                            在映射文件中通过 resultType 指定输出结果的类型。
 
            1.4.3 #{} ${}
                            #{} 表示一个占位符号, #{} 接收输入参数,类型可以是简单类型, pojo hashmap
                            如果接收简单类型, #{} 中可以写成 value 或其它名称。
                            #{} 接收 pojo 对象值,通过 OGNL 读取对象中的属性值,通过属性 . 属性 . 属性 ... 的方式获取对象属性值。
 
                            ${} 表示一个拼接符号,会引用 sql 注入, 所以不建议使用 ${}
                            ${} 接收输入参数,类型可以是简单类型, pojo hashmap
                            如果接收简单类型, ${} 中只能写成 value
                            ${} 接收 pojo 对象值,通过 OGNL 读取对象中的属性值,通过属性 . 属性 . 属性 ... 的方式获取对象属性值。
 
            
        1.5.1 selectOne selectList
 
                selectOne 表示查询出一条记录进行映射。如果使用 selectOne 可以实现使用 selectList 也可以实现( list 中只有一个对象)。
 
                selectList 表示查询出一个列表(多条记录)进行映射。如果使用 selectList 查询多条记录,不能使用 selectOne
 
                如果使用 selectOne 报错:
                                        org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4

            
        1.6.1 非自增主键返回 ( 使用 uuid())
                要求:插入的表必须是非自增主键的,且类型应是varchar
                使用 mysql uuid() 函数生成主键,需要修改表中 id 字段类型为 string ,长度设置成 35 位。
 
                执行思路:
                    先通过 uuid() 查询到主键,将主键输入 到 sql 语句中。
 
                    执行 uuid() 语句顺序相对于 insert 语句之前执行。
 
            
    2.1 mybatis hibernate 本质区别和应用场景
 
            hibernate :是一个标准 ORM 框架(对象关系映射)。入门门槛较高的,不需要程序写 sql sql 语句自动生成了。
            对 sql 语句进行优化、修改比较困难的。
            应用场景:
                适用与需求变化不多的中小型项目,比如:后台管理系统, erp orm oa 。。
 
            mybatis :专注是 sql 本身,需要程序员自己编写 sql 语句, sql 修改、优化比较方便。 mybatis 是一个不完全 的 ORM 框架,虽然程序员自己写 sql mybatis 也可以实现映射(输入映射、输出映射)。
            应用场景:
                适用与需求变化较多的项目,比如:互联网项目。
 
            企业进行技术选型,以低成本 高回报作为技术选型的原则,根据项目组的技术力量进行选择。

            
2 mybatis 开发 dao 的方法
 
2.1 SqlSession 使用范围
 
    2.1.1  SqlSessionFactoryBuilder
                通过SqlSessionFactoryBuilder 创建会话工厂SqlSessionFactory
                将SqlSessionFactoryBuilder 当成一个工具类使用即可 ,不需要使用单例管理SqlSessionFactoryBuilder
                在需要创建SqlSessionFactory 时候,只需要 new 一次SqlSessionFactoryBuilder 即可。
 
 
    2.1.2  SqlSessionFactory
                通过SqlSessionFactory 创建 SqlSession ,使用单例模式管理 sqlSessionFactory (工厂一旦创建,使用一个实例)。
 
                将来 mybatis spring 整合后,使用单例模式管理 sqlSessionFactory
 
 
    2.1.3 SqlSession
                SqlSession 是一个面向用户(程序员)的接口。
                SqlSession 中提供了很多操作数据库的方法:如: selectOne( 返回单个对象 ) selectList (返回单个或多个对象)、。
 
                SqlSession 是线程不安全的,在 SqlSesion 实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。
 
              SqlSession 最佳应用场合在方法体内,定义成局部变量使用。
 
  2.2 原始 dao 开发方法(程序员需要写 dao 接口和 dao 实现类)
    2.2.1 思路
                程序员需要写 dao 接口和 dao 实现类。
                需要向 dao 实现类中注入 SqlSessionFactory ,在方法体内通过 SqlSessionFactory 创建 SqlSession
 
    2.2.2 dao 接口
                            
 
    2.2.3 dao 接口实现类
            public   class  UserDaoImpl implements  UserDao {
 
                // 需要向 dao 实现类中注入 SqlSessionFactory
                // 这里通过构造方法注入
                private  SqlSessionFactory sqlSessionFactory ;
 
                public  UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
                    this . sqlSessionFactory  = sqlSessionFactory;
                }
 
                @Override
                public  User findUserById( int  id) throws  Exception {
                    SqlSession sqlSession = sqlSessionFactory .openSession();
 
                    User user = sqlSession.selectOne( "test.findUserById" , id);
 
                    // 释放资源
                    sqlSession.close();
 
                return  user;
 
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值