zoukankan      html  css  js  c++  java
  • MyBatis深入浅出--入门

    mybatis概述

    mybatis简介

    MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。

    MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

    MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

    为什么要使用mybatis。

    MyBatis是一个半自动化的持久化层框架。 

    jdbc编程---当我们使用jdbc持久化的时候,sql语句被硬编码到java代码中。这样耦合度太高。代码不易于维护。在实际项目开发中会经常添加sql或者修改sql,这样我们就只能到java代码中去修改。

    Hibernate和JPA。

    长难复杂SQL,对于Hibernate而言处理也不容易。

    内部自动生产的SQL,不容易做特殊优化。

    基于全映射的全自动框架,javaBean存在大量字段时无法只映射部分字段。导致数据库性能下降。

    对开发人员而言,核心sql还是需要自己优化

    sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。

    可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。成为业务代码+底层数据库的媒介

     搭建mybatis开发环境

    添加mybatis的核心 mybatis-3.2.8.jar   

    添加mysql数据库连接驱动 mysql-connector-java-5.1.7-bin.

    添加log4j日记需要的核心 log4j-1.2.17.jar

    在src目录下添加 log4j.properties 日记配置文件

    # Global logging configuration
    log4j.rootLogger=DEBUG, stdout
    # 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

    BookMapper.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">
    <!-- namespace 命名空间(名称空间)类似java类的包名 一般使用对应的类的全类名 或者 类的dao的接口名 -->
    <mapper namespace="com.soyoungboy.bean.Book">
    
        <!-- select标签配置一个select查询语句 id属性 给select语句配置一个唯一标识 #{id} 表示一个占位符 resultType 
            配置查询语句返回的一个对象的全类名 -->
        <select id="selectUserById" resultType="com.soyoungboy.bean.Book">
            SELECT `id`, `name`,
            `author`, `price`, `sales`, `stock`, `img_path` imgPath FROM
            `soyoungboy`.`t_book` where id = #{id}
        </select>
    
        <select id="selectAllBooks" resultType="com.soyoungboy.bean.Book">
            SELECT `id`, `name`,
            `author`, `price`, `sales`, `stock`, `img_path` imgPath FROM
            `soyoungboy`.`t_book`
        </select>
    
        <insert id="saveBook" resultType="int">
            INSERT INTO
            `soyoungboy`.`t_book`( `name`, `author`, `price`, `sales`,
            `stock`,
            `img_path`) VALUES ( #{name}, #{author}, #{price}, #{sales},
            #{stock},#{imgPath})
        </insert>
    
        <delete id="deleteBookById" resultType="int">
            DELETE FROM
            `soyoungboy`.`t_book`WHERE `id` = #{id}
        </delete>
    
        <update id="updateBook" resultType="int">
            UPDATE `soyoungboy`.`t_book`
            SET
            `name` = #{name},
            `author` = #{author},
            `price` = #{price},
            `sales` =
            #{sales},
            `stock` = #{stock},
            `img_path` = #{imgPath}
            WHERE
            `id` = #{id}
        </update>
    
    
    </mapper>

    mybatis-config.xml里面进行修改

            <mappers>
             <mapper resource="BookMapper.xml"/> 
        </mappers>    

    我们测试下:

    public class BookTest {
    
        static SqlSessionFactory sqlSessionFactory;
        @BeforeClass
        public static void setUpBeforeClass() throws Exception {
        String res = "mybatis-config.xml";
        InputStream resourceAsStream = Resources.getResourceAsStream(res);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        System.out.println(sqlSessionFactory);
        }
    
        @Test
        public final void test() {
            SqlSession openSession = sqlSessionFactory.openSession();
            try {
                Book book = openSession.selectOne("com.soyoungboy.bean.Book.selectUserById",30);
                System.out.println("book = "+book);
            } finally {
                openSession.close();
            }
            
        }
    }
  • 相关阅读:
    TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常?
    当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
    @Qualifier 注解?
    Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()?它们有何区别?
    Filter是什么?有什么作用?
    List和 Map区别?
    Spring框架的事务管理有哪些优点?
    Listener是什么?有什么作用?
    字节流与字符流的区别?
    Struts2里面有什么隐式对象?
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/7302586.html
Copyright © 2011-2022 走看看