黑马程序员技术交流社区

标题: [学习交流] [石家庄校区]803班学习笔记总结 [打印本页]

作者: 魏北北    时间: 2018-10-10 15:59
标题: [学习交流] [石家庄校区]803班学习笔记总结
一.Mybatis的概述

       mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql语句本身, 而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。 mybatis通过xml 或注解的方式将要执行的各种statement配置起来,并通过java对象和statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并 返回。 采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc进行了封装,屏蔽了 jdbc api 底层访问细节,使我 们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。 为了我们能够更好掌握框架运行的内部过程,并且有更好的体验,下面我们将从自定义 Mybatis 框架开始来 学习框架。此时我们将会体验框架从无到有的过程体验,也能够很好的综合前面阶段所学的基础。

二.Mybatis的使用流程:

创建maven模板 --- 配置pop.xml --- 创建实体类对象 --- 创建sql表 ---全局的配置文件 ---

创建mapper接口 --- 写mapper配置文件

1.创建实体类对象JavaBean.实现 序列化接口,用ORM思想.跟数据库结果集的字段名一一对应;

2.全局的配置文件SqlMapConfig.xml
[AppleScript] 纯文本查看 复制代码
 <!-- 配置properties
        可以在标签内部配置连接数据库的信息。也可以通过属性引用外部配置文件信息
        resource属性: 常用的
            用于指定配置文件的位置,是按照类路径的写法来写,并且必须存在于类路径下。
        url属性:
            是要求按照Url的写法来写地址
            URL:Uniform Resource Locator 统一资源定位符。它是可以唯一标识一个资源的位置。
            它的写法:
                http://localhost:8080/mybatisserver/demo1Servlet
                协议      主机     端口       URI
            URI:Uniform Resource Identifier 统一资源标识符。它是在应用中可以唯一定位一个资源的。
    -->
    <!--<properties url="file:///D:/IdeaProjects/day02_eesy_01mybatisCRUD/src/main/resources/jdbcConfig.properties">-->
       <!--<!– <property name="driver" value="com.mysql.jdbc.Driver"></property>-->
        <!--<property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"></property>-->
        <!--<property name="username" value="root"></property>-->
        <!--<property name="password" value="1234"></property>–>-->
    <!--</properties>-->

    <!--<!–使用typeAliases配置别名,它只能配置domain中类的别名 –>-->
    <!--<typeAliases>-->
        <!--<!–typeAlias用于配置别名。type属性指定的是实体类全限定类名。alias属性指定别名,当指定了别名就再区分大小写 -->
        <!--<typeAlias type="com.itheima.domain.User" alias="user"></typeAlias>–>-->

        <!--<!– 用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写–>-->
        <!--<package name="com.itheima.domain"></package>-->
    <!--</typeAliases>-->
    <properties resource="jdbcConfig.properties"></properties>
    <typeAliases>
        <!--<typeAlias type="com.itheima.domain.User" alias="user"></typeAlias>-->
        <package name="com.itheima.domain"></package>
    </typeAliases>

    <!--配置环境-->
    <environments default="mysql">
        <!-- 配置mysql的环境-->
        <environment id="mysql">
            <!-- 配置事务 -->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"></property>
                <property name="url" value="${url}"></property>
                <property name="username" value="${username}"></property>
                <property name="password" value="${password}"></property>
            </dataSource>

        </environment>
    </environments>
    <!-- 配置映射文件的位置 -->
    <mappers>
        <mapper resource="com/itheima/dao/IUserDao.xml"></mapper>
        <!-- package标签是用于指定dao接口所在的包,当指定了之后就不需要在写mapper以及resource或者class了 -->
        <!--<package name="com.itheima.dao"></package>-->
    </mappers>

三.入门案例

1.步骤

[AppleScript] 纯文本查看 复制代码
 private InputStream in;
    private SqlSession sqlSession;
    private IUserDao userDao;
    @Before//用于在测试方法执行之前执行
    public void init()throws Exception{
        //1.读取配置文件,生成字节输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.获取SqlSessionFactory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3.获取SqlSession对象
        sqlSession = factory.openSession();
        //4.获取dao的代理对象
        userDao = sqlSession.getMapper(IUserDao.class);
    }

    @After//用于在测试方法执行之后执行
    public void destroy()throws Exception{
        //提交事务
        sqlSession.commit();
        //6.释放资源
        sqlSession.close();
        in.close();
    }
    @Test
    public void testFindAll(){
        //5.执行查询所有方法
        List<User> users = userDao.findAll();
        for(User user : users){
            System.out.println(user);
        }
    }

C:/Users/47616/AppData/Local/YNote/data/qqA1D4460845C245DFA31D1673BD51BE03/a2496fa964a04f29976f1760e50e5d05/clipboard.png

2.配置文件路径:

以后用相对路径和绝对路径都比较少,大部分使用两种方式写配合文件:

第一个:使用类加载器,它只读取类路径的配置文件

第二个:使用ServletContext的getRealPath()方法获取真实路径

3.使用了三种设计模式

1.构建者模式 : 把对象的创建细节隐藏,使使用者直接调用方法即可拿到对象

2.工厂模式

3.代理对象模式

sql语句中参数的传入

<!-- 保存用户--> <insert id="saveUser" parameterType="com.itheima.domain.User">  insert into user(username,birthday,sex,address)      values(#{username},#{birthday},#{sex},#{address}) </insert>

细节:  parameterType 属性:   代表参数的类型,因为我们要传入的是一个类的对象,所以类型就写类的全名称。  sql 语句中使用#{}字符:   它代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。    具体的数据是由#{}里面的内容决定的。  #{}中内容的写法:    由于我们保存方法的参数是 一个 User 对象,此处要写 User 对象中的属性名称。    它用的是 ognl 表达式。  ognl 表达式:   它是 apache 提供的一种表达式语言,全称是:   Object Graphic Navigation Language  对象图导航语言   它是按照一定的语法格式来获取数据的。   语法格式就是使用  #{对象.对象}的方式

#{user.username}它会先去找 user 对象,然后在 user 对象中找到 username 属性,并调用 getUsername()方法把值取出来。但是我们在 parameterType 属性上指定了实体类名称,所以可以省略 user. 而直接写 username.

以基本数据类型: mybatis中已经给基本数据类型和一些常见的集合类型等起了别名;

以map集合为参数 : 在#{写key值} ,获取map集合中的value值

sql语句中有两个参数: 在接口的方法中的参数前面加@param("起别名")注解,在sql语句中传别名;


四.mapper配置文件的一些注意事项

1.实体类的属性名称和表中的字段名必须一致才能实现封装,如果不一致时,有两种解决办法可以使其一致;

     1.在sql语句中给查询的结果集的字段名起和pojo属性一致的属性名;代码增多;

     2.在mapper配置文件中,配置<resultMap>标签配置;解析比较麻烦,但是减少代码的书写,方便开发

     2.mappers(映射器)

     1.<mapper resource=" " />

使用相对于类路径的资源 如:<mapper resource="com/itheima/dao/IUserDao.xml" />

     2.<mapper class=" " />

使用 mapper 接口类路径 如:<mapper class="com.itheima.dao.UserDao"/> 注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。

     3.<package name=""/>

注册指定包下的所有 mapper 接口 如:<package name="cn.itcast.mybatis.mapper"/> 注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。

     3.起别名注意事项:

     基本类型和String我们以直接写类型名称, 也可以使用包名 . 类名的方式 ,例如 java.lang.String。  实体类类型,目前我们只能使用全限定类名。  究其原因,是 mybaits 在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名, 而我们的是实体类并没有注册别名,所以必须写全限定类名。我们可以通过<typeAliases>标签配置别名.


  









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2