• MyBatis基础入门--知识点总结


    对原生态jdbc程序的问题总结

    下面是一个传统的jdbc连接oracle数据库的标准代码:

    public static void main(String[] args) throws Exception {
             Connection con = null;// 创建一个数据库连接
                PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement
                ResultSet result = null;// 创建一个结果集对象
                try
                {
                    Class.forName("oracle.jdbc.driver.OracleDriver");// 加载Oracle驱动程序
                    System.out.println("开始尝试连接数据库!");
                    String url = "jdbc:oracle:" + "thin:@127.0.0.1:1521:ORCl";// 127.0.0.1是本机地址,XE是精简版Oracle的默认数据库名
                    String user = "scott";// 用户名,系统默认的账户名
                    String password = "scott";// 你安装时选设置的密码
                    con = DriverManager.getConnection(url, user, password);// 获取连接
                    System.out.println("连接成功!");
                    String sql = "select * from tuser where username=?";// 预编译语句,“?”代表参数
                    pre = con.prepareStatement(sql);// 实例化预编译语句
                    pre.setString(1, "wang");// 设置参数,前面的1表示参数的索引,而不是表中列名的索引
                    result = pre.executeQuery();// 执行查询,注意括号中不需要再加参数
                    while (result.next())
                        // 当结果集不为空时
                        System.out.println("学号:" + result.getInt("id") + "姓名:"
                                + result.getString("username"));
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
                finally
                {
                    try
                    {
                        // 逐一将上面的几个对象关闭,因为不关闭的话会影响性能、并且占用资源
                        // 注意关闭的顺序,最后使用的最先关闭
                        if (result != null)
                            result.close();
                        if (pre != null)
                            pre.close();
                        if (con != null)
                            con.close();
                        System.out.println("数据库连接已关闭!");
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            
        }

    对于传统jdbc连接数据库的操作有一些问题,问题及相应的解决构想总结如下:

    1. 数据库连接,使用时创建,不使用时释放.对数据库进行频繁的开始和释放连接,造成数据库资源浪费.

        方案:使用数据库连接池管理连接

    1. 将sql语句,占位符,参数,硬编码到java代码中,如果sql语句修改,需要重新编译java代码,不利于系统维护

        方案:将sql语句,占位符,参数等配置到xml文件中,修改sql语句,无需重新编译项目.

    1. 从resultSet中遍历结果集数据时,存在硬编码,不利于维护

        方案:将查询结果,自动映射成java对象

    Myatis和Hibernate的区别

      由于jdbc的这些问题,由此出现很多的ORM框架比较流行的有hibernate,Mybatis等,这些框架底层对jdbc进行了封装,使开发人员将精力放在业务上,大大提高了开发的效率,那么mybatis和hibernate有哪些异同呢?  

       Hibernate是一个标准的ORM(对象关系映射)框架,不需要程序员编写sql语句,sql语句自动生成,对sql语句的修改,优化是比较困难的.

             适用于需求变化不多的中小型项目,比如后台管理系统,ERP,OA系统

       Mybatis专注于sql语句本身,需要程序员自己编写sql语句,优化比较方便,mybatis不是一个完全的ORM框架,是一个半自动化的ORM框架.

             适用于需求变化比较多的互联网项目.

    入门项目(简单的数据库查询,根据用户id查询用户信息)

      1.导入jar包 

    ant-1.9.6.jar

    ant-launcher-1.9.6.jar

    asm-5.0.4.jar

    cglib-3.2.2.jar

    commons-logging-1.2.jar

    javassist-3.20.0-GA.jar

    log4j-1.2.17.jar

    log4j-api-2.3.jar

    log4j-core-2.3.jar

    mybatis-3.4.1.jar

    ognl-3.1.8.jar

    ojdbc6.jar

    slf4j-api-1.7.21.jar

    slf4j-log4j12-1.7.21.jar

      2. src目录下新建mybatis的配置文件mybatis-config.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>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC" />
                <!-- 配置数据库连接信息 -->
                <dataSource type="POOLED">
                    <property name="driver" value="oracle.jdbc.driver.OracleDriver" />
                    <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
                    <property name="username" value="scott" />
                    <property name="password" value="scott" />
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="sqlMap/User.xml"/>
        </mappers>
    </configuration>

       3.配置log4j.properties,将sql语句以及相关信息打印到控制台上,便于分析查看:

         a.src目录(classpath)下新建log4j.properties: 

    # Global logging configuration  
    log4j.rootLogger=ERROR, stdout  
    # MyBatis logging configuration...  
    log4j.logger.org.mybatis.example.BlogMapper=TRACE  
    # Console output...  
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n 

        b.在mybatis-config.xml中加入以下配置:

    <settings>
            <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>

        我当时没有加这个配置,结果控制台连个毛也不给我打印,加上这句配置,就好了.

        4.新建一个pojo类User,包含属性id,username,password及对应get/set方法,代码省略

        5.d.src目录下新建sqlMap文件夹,其下新建一个User.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="test">  
    <!--parameterType:指定传入参数的类型
        resultType:指定返回结果的类型
        #{}:表示一个占位符,如果需要填入的是简单数据类型,可以填入value或其他名称
        ${}:表示拼接字符串
      -->
      <select id="findUserById" parameterType="int" resultType="com.wang.pojo.User">  
        select * from tuser where id = #{value}  
      </select>  
    </mapper>  

      6.测试代码:

    @Test
        public void findUserById() throws IOException{
            //mybatis配置文件
            String resource ="sqlMapConfig.xml";
            //得到配置文件的流
            InputStream inputStream=Resources.getResourceAsStream(resource);
            //创建会话工厂,传入mybatis配置文件信息
            SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(inputStream);
            //通过工厂得到session
            SqlSession session = ssf.openSession();
            //通过session操作数据库
            User user=session.selectOne("test.findUserById", 1);
            System.out.println(user);
            session.close();
        }

      这是一个简单的使用mybatis的小例子,下面介绍几个配置文件中需要关注的几点:

    typeAliases(别名)

      mapper.xml,定义很多的statement,statement需要parameterType,resultType指定输入,输出类型.如果在指定类型时,输入类型全路径,不方便进行开发,可以针对parameterTyperesultType指定的类型定义一些别名,mapper.xml中通过别名定义,方便快捷.

         <typeAliases>
            <!-- 单个别名的定义 -->
            <!-- <typeAlias type="com.wang.pojo.User" alias="user"/> -->
            <!-- 批量别名的定义 自动扫描指定包下的po类,默认别名为类名(首字母大写或小写都可以) -->
            <package name="com.wang.pojo"/>
        </typeAliases>

    mapper映射器

      使用mapper代理的方法只需要程序员编写mapper接口即可(就是dao接口),程序员在编写mapper.xml(映射文件)和mapper.java时需要遵循一些规范:

        1.mapper.xml中的namespace就是mapper.java的类全路径.

        2.mapper.xml中的statement的id和mapper.java中的方法名一致.

        3.mapper.xml中的parameterType和resultType和mapper.java中的参数类型和返回值类型一致.

    <mappers>
            <!-- 单个映射文件的加载,通过resource 一次加载一个 -->
            <!-- <mapper resource="sqlMap/User.xml"/>
            <mapper resource="sqlMap/UserMapper.xml"/> -->
            <!-- 通过mapper接口加载配置文件,需要将mapper接口类型和对应的mapper.xml放在一个目录下
            且保持名称一致 -->
            <mapper class="com.wang.mapper.UserMapper"/>
    <!-- 批量加载mapper配置文件,推荐使用 -->
            <package name="com.wang.mapper"/>
        </mappers>

     

    输出映射

    resultType

      使用resultType进行输出映射,只有查询出来的列名和pojo的属性名一致,才会映射成功

      只要查询出来的列名有一个和pojo类中的属性名一致,就会创建pojo对象,如果全部的都不一致,就不会创建pojo对象

      ResultType的类型 不仅可以是pojo 还可以是map,或者简单数据类型

      像select Count(*) from user;这种sql resultType类型为int

      返回值不管是User(pojo对象)还是List<User>(pojo列表),resultType的值都是一样的,User. 

    resultMap

      使用resultMap可以实现高级输出映射.

             如果查询出来的列名和pojo属性名不一致,通过定义一个resultMap对列名和pojo属性名之间做一个映射关系.

        1.       先定义resultMap(mapper.xml):

    <!-- 定义resultMap
              type:映射的java对象类型,可以使用被别名
              id:resultMap的唯一标示
               -->
      <resultMap type="user" id="userResultMap">
          <!-- id表示查询结果集中的唯一标示(主键列)
              column:查询出来的列名
              property:对应的pojo类中的属性名
           -->
          <id column="iddd" property="id"/>
          <!-- result表示普通列 -->
          <result column="name" property="username"/>
      </resultMap>

        2.    使用resultMap:

    <select id="findUserById" parameterType="int" resultMap="userResultMap">  
        select id iddd ,username name from tuser where id = #{value}  
      </select>

     

     

     

  • 相关阅读:
    Java-使用IO流对大文件进行分割和分割后的合并
    Java-单向链表算法
    Java-二分查找算法
    Java-二叉树算法
    Java-对象比较器
    Android中Activity的四种开发模式
    Struts2工作原理
    C++实现单例模式
    数组中有一个数字出现的次数超过数组的一半,请找出这个数字
    c++ enum用法【转】
  • 原文地址:https://www.cnblogs.com/fingerboy/p/5712991.html
Copyright © 2020-2023  润新知