美文网首页
2.平凡之路-初识MyBatis

2.平凡之路-初识MyBatis

作者: 胖先森 | 来源:发表于2017-08-23 21:51 被阅读0次

    MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。[来自官方文档]

    1.MyBatis的优点和缺点

    • 优点
      1. 易于上手和掌握。
      2. sql写在xml里,便于统一管理和优化。
      3. 解除sql与程序代码的耦合。
      4. 提供映射标签,支持对象与数据库的ORM字段关系映射
      5. 提供对象关系映射标签,支持对象关系组建维护
      6. 提供xml标签,支持编写动态sql。
    • 缺点
      1. sql工作量很大,尤其是字段多、关联表多时,更是如此。
      2. sql依赖于数据库,导致数据库移植性差。
      3. 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。[重点注意]
      4. 字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。(比如配置了一对多Collection标签,如果sql里没有join子表或查询子表的话,查询后返回的对象是不具备对象关系的,即Collection的对象为null)
      5. DAO层过于简单,对象组装的工作量较大。
      6. 不支持级联更新、级联删除。
      7. 编写动态sql时,不方便调试,尤其逻辑复杂时。
      8. 提供的写动态sql的xml标签功能简单(连struts都比不上),编写动态sql仍然受限,且可读性低。
      9. 若不查询主键字段,容易造成查询出的对象有“覆盖”现象。
      10. 参数的数据类型支持不完善。(如参数为Date类型时,容易报没有get、set方法,需在参数上加@param)
      11. 多参数时,使用不方便,功能不够强大。(目前支持的方法有map、对象、注解@param)
      12. 缓存使用不当,容易产生脏数据。二级缓存机制不佳,需要使用第三方的缓存框架。

    2.MyBatis安装

    首先我们需要声明一下iBatis和MyBatis都是一个组织开发,只是版本不相同而已,就想我们学习的Java的版本命名规则类似,实际上MyBatis就是iBatis的一个大版本号的提升。
    下载地址:https://github.com/mybatis/mybatis-3/releases
    官方文档:http://www.mybatis.org/mybatis-3/

    MyBatis解压目录说明

    3.MyBatis的环境搭建

    (1) 新建Java项目

    新建Java项目
    • 新建lib文件夹,导入mybatis-3.4.2.jar的框架核心包和MySQL的数据库驱动包
    • 选中两个Jar包,右键选择Bulid Path

    (2) 新建MyBatis核心配置文件

    个人建议将核心配置文件建立在mybatis-config.xml文件

    • 新建核心xml文件
      需要设置文档类型
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration
      PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    
    </configuration>
    
    • 配置数据源
        <!-- 配置数据库环境 -->
        <environments default="development">
            <environment id="development">
                <!-- 事务管理器:保证数据的完整性和一致性 -->
                <!-- 框架:默认情况下CUD操作需要手动提交事务 -->
                <transactionManager type="JDBC" />
                <!-- 使用的是连接池 -->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver" />
                    <property name="url" value="jdbc:mysql://127.0.0.1:3306/cy42_mss" />
                    <property name="username" value="root" />
                    <property name="password" value="shxt" />
                </dataSource>
            </environment>
        </environments>
    

    百度Java如何实行连接池的原理?

    • 配置加载映射文件
        <mappers>
            <mapper resource="com/shxt/model/ShxtMapper.xml"/>
        </mappers>
    
    • 附录


      完整代码

    (3) 新建MyBatis映射文件

    • 位置建立: com/shxt/model/ShxtMapper.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">
    <!-- <mapper namespace="命名空间,唯一的不能重复"> -->
    <mapper namespace="shxt.cy42.mss">
      
    </mapper>
    

    目前我们使用的传统模式,那么namespace一般建议使用持久化类的全路径com.shxt.model.User这样的字符串保持一致,方便后面代码处理.
    但是,我们现在没有持久化类,所以就是设置了一个简单的字符串

    • 定制SQL语句,简单测试
    <!-- 定制SQL语句 -->
      <insert id="add01">
        INSERT INTO skill  (skill_name,num) VALUES ('JS',75)
      </insert>
    
    • 附录


      映射文件代码

    (4) 测试代码

    public class API的调用过程演示 {
        public static void main( String[] args ) {
            //读取核心配置文件的位置
            //InputStream is = Resources.getResourceAsStream("com/shxt/model/mybatis-config.xml");
            SqlSession sqlSession = null;
            try {
                //1.读取核心配置文件
                InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
                //2.创建SqlSession工厂
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
                //3.获取SqlSession 
                //****** SqlSession完成所有的持久化操作CRUD
                sqlSession = sqlSessionFactory.openSession();
                //4.关键步骤: 定位执行SQL语句 重点重点重点
                //****如何定位  (namespace+"."+id)
                int row = sqlSession.insert("shxt.cy42.mss.add01");
                //5.针对于CUD操作需要手动提交事务
                sqlSession.commit();
                System.out.println("影响的行数:"+row);
            } catch (IOException ex) {
                ex.printStackTrace();
            }finally {
                //6.关闭资源
                if(sqlSession!=null){
                    sqlSession.close();
                }
            }
        }
    
    }
    
    image.png

    相关文章

      网友评论

          本文标题:2.平凡之路-初识MyBatis

          本文链接:https://www.haomeiwen.com/subject/pvvjdxtx.html