zoukankan      html  css  js  c++  java
  • MyBatis入门 -- 1、初识MyBatis

    MyBatis快速入门

    1、介绍

    mybatis封装了jdbc的持久层框架,是不完全ORM框架

    ORM框架(Object Relational Mapping) 对象关系映射

    指的是持久化数据和实体对象的映射模式,为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。

    映射规则

    数据表 <---> 类

    表字段 <---> 类属性

    表数据 <---> 对象

    • MyBatis 通过 xml 或注解的方式将要执行的各种Statement 配置起来,并通过Java 对象和 Statement 中 SQL 的动态参数进行映射生成最终要执行的SQL 语句。
    • 最后 MyBatis 框架执行完SQL 并将结果映射为 Java 对象并返回。采用ORM 思想解决了实体和数据库映射 的问题,对 JDBC 进行了封装,屏蔽了JDBC API 底层访问细节,使我们不用与JDBC API 打交道,就可以 完成对数据库的持久化操作。
    2、入门

    1、准备数据

    2、导入jar包 mybatis-3.5.3.jar mysql-connector-java-5.1.37-bin.jar

    3、在src下创建映射配置文件

    4、在src下创建核心配置文件

    5、编写测试类完成相关API的使用

    6、运行测试查看结果 junit-4.9.jar(测试包)log4j-1.2.17.jar(日志)

    1)准备sql、javabean
    public class Student {
        private Integer id;
        private String name;
        private Integer age;
        //构造方法
        //get、set
        //toString()
    }
    
    3)核心配置文件MyBatisConfig.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <!--MyBatis的DTD约束-->
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <!-- 环境配置顺序
    <!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?,
    objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>
    -->
    <!--configuration 核心根标签-->
    <configuration>
        <!--environments配置数据库环境 环境可以有多个,通过default指定-->
        <environments default="mysql">
            <!--environment配置数据库环境 id 属性唯一标识 -->
            <environment id="mysql">
                <!-- transactionManager事务管理。type属性,采用JDBC默认的事务-->
                <transactionManager type="JDBC"></transactionManager>
                <!--dataSource数据源信息 type属性 连接池 MyBatis默认有三种数据源-->
                <dataSource type="POOLED">
                    <!--数据库连接的配置-->
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/db4"/>
                    <property name="username" value="root"/>
                    <property name="password" value="123"/>
                </dataSource>
            </environment>
        </environments>
    
        <!-- mappers引入映射配置文件 -->
        <mappers>
            <!-- mapper 引入指定的映射配置文件  resource属性指定映射配置文件的名称 -->
            <mapper resource="StudentMapper.xml"/>
        </mappers>
    </configuration>
    
    4)映射配置文件StudentMapper.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <!--MyBatis的DTD约束-->
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!--
        mapper: 核心根标签
        namespace属性: 名称空间
    -->
    <mapper namespace="StudentMapper">
        <!--
            select: 查询功能的标签
            id属性: 唯一标识
            resultType属性:指定结果映射对象类型
            parameterType属性:指定参数映射对象类型
        -->
        <select id="selectAll" resultType="com.zhu.mybatis.bean.Student">
            SELECT * FROM student
        </select>
    </mapper>
    
    5)测试
    public class Test01 {
        @Test
        public void selectAll() throws IOException {
            //1.加载核心配置文件, Resources 类为从类路径中加载资源,提供了易于使用的方法。
            InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
            //InputStream is = Test01.class.getClassLoader().getResourceAsStream("MyBatisConfig.xml");
    
            //2.获取SqlSession工厂对象    建造者模式
            //https://blog.csdn.net/weixin_33716557/article/details/92423934
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    
            //3.获取SqlSession对象
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            //4.执行映射配置文件中的sql语句,并接受结果
            List<Student> list = sqlSession.selectList("StudentMapper.selectAll");
    
            //5.查看结果
            for (Student stu : list) {
                System.out.println(stu);
            }
             //6、释放资源
            sqlSession.close();
            is.close();
        }
    }
    
    3、小结
    • 核心配置文件 去做一些全局的配置,比如数据库连接信息、事务管理、插件(分页),日志...
    • SQL映射文件 该xml文件保存了SQL的映射信息,mybatis会将他们解析出来并执行;
    • ORM 对象关系映射,数据和实体对象的映射
    • 基本步骤 - 导jar包 - 编写映射配置文件 - 编写核心配置文件 - 使用API完成编程。

    MyBatis相关API

    1、Resources

    org.apache.ibatis.io.Resources

    加载资源的工具类。

    核心方法

    返回值 方法名 说明
    InputStream getResourceAsStream(String fileName) 通过类加载器返回指定资源的字节输入流
    2、SqlSessionFactoryBuilder

    org.apache.ibatis.session.SqlSessionFactoryBuilder

    获取SqlSessionFactory 工厂对象的功能类。

    核心方法

    返回值 方法名 说明
    SqlSessionFactory build(InputStreamis) 通过指定资源字节输入流获取SqlSession工厂对象
    3、SqlSessionFactory

    org.apache.ibatis.session.SqlSessionFactory

    获取SqlSession 构建者对象的工厂接口。

    注意:openSession() 默认是false,手动提交事物,但只针对增删改,查询SQL无需理会,框架会帮我们提交

    核心方法

    返回值 方法名 说明
    SqlSession openSession() 获取SqlSession构建者对象,并开启手动提交事务
    SqlSession openSession(booleanautoCommit) 获取SqlSession构建者对象,如果参数为true,则开启 自动提交事务
    4、SqlSession

    org.apache.ibatis.session.SqlSession

    构建者对象接口。用于执行SQL、管理事务、接口代理。

    返回值 方法名 说明
    List selectList(String statement,Object paramter) 执行查询语句,返回List集合
    T selectOne(String statement,Object paramter) 执行查询语句,返回一个结果对象
    int insert(String statement,Object paramter) 执行新增语句,返回影响行数
    int update(String statement,Object paramter) 执行修改语句,返回影响行数
    int delete(String statement,Object paramter) 执行删除语句,返回影响行数
    void commit() 提交事务
    void rollback() 回滚事务
    T getMapper(Class cls) 获取指定接口的代理实现类对象
    void close() 释放资源
    5、小结
    • Resources: 加载资源的工具类。
    • SqlSessionFactoryBuilder : 获取 SqlSessionFactory 工厂对象的功能类。
    • SqlSessionFactory: 获取 SqlSession 构建者对象的工厂接口。 指定事务的提交方式。
    • SqlSession: 构建者对象接口。 执行 SQL。 管理事务。 接口代理。

    MyBatis映射配置文件

    MyBatis的传入参数parameterType类型分两种

    ​ 基本数据类型:int,string,long,Date;

    ​ 复杂数据类型:类和Map

    如何获取参数中的值:

    基本数据类型:#{参数} 获取参数中的值

    复杂数据类型:#{属性名} ,map中则是#{key}

    1、查询功能

    StudentMapper.xml

        <!--
            resultType : 指定结果映射的对象类型(增删改无此属性)
            parameterType : 指定参数映射的对象类型
    
            SQL获取参数
            #{属性名}
        -->
        <select id="selectById"resultType="com.zhu.mybatis.bean.Student" parameterType="java.lang.Integer">
            SELECT * FROM student WHERE id= #{id}
        </select>
    
    

    Test

     //4.执行映射配置文件中的sql语句,并接受结果
    Student student = sqlSession.selectOne("StudentMapper.selectById",1);
    
    2、增加功能

    StudentMapper.xml

    <!--增加-->
    <insert id="insert" parameterType="com.zhu.mybatis.bean.Student">
        -- INSERT INTO student VALUES(4,'赵六',26)
        INSERT INTO student VALUES(#{id},#{name},#{age}
    </insert>
    

    Test

    //3.获取SqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //4.执行映射配置文件中的sql语句,并接受结果
    Student stu = new Student(7,"炎龙",25);
    int i = sqlSession.insert("StudentMapper.insert", stu);
    

    问题1:并没有修改成功,为什么?

    原因:openSession() 获取SqlSession构建者对象,并开启手动提交事务

    解决:sqlSession.commit();

    问题2:插入中文为??

    解决:修改数据库连接的配置信息

    <property name="url" value="jdbc:mysql://localhost:3306/db4?
          useUnicode=true&amp;characterEncoding=utf8"/>
    
    3、修改功能

    StudentMapper.xml

    <!--修改-->
    <update id="update" parameterType="com.zhu.mybatis.bean.Student">
        -- UPDATE student SET NAME='刑天',age=26 WHERE id = 4
        UPDATE student SET name=#{name},age=#{age} where id=#{id}
    </update>
    

    Test

    //4.执行映射配置文件中的sql语句,并接受结果
    Student stu = new Student(4,"刑天",26);
    int i = sqlSession.update("StudentMapper.update", stu);
    sqlSession.commit();
    
    4、删除功能

    StudentMapper.xml

    <!--删除-->
    <delete id="delete" parameterType="java.lang.Integer">
        -- DELETE FROM student WHERE id =3
        DELETE From student WHERE id=#{id}
    </delete>
    

    Test

    //4.执行映射配置文件中的sql语句,并接受结果
    int i = sqlSession.delete("StudentMapper.delete", 2);
    sqlSession.commit();
    
    5、小结
    <!--
    映射配置文件包含了数据和对象之间的映射关系以及要执行的SQL 语句。
    标签: 
        <mapper>:核心根标签。namespace 属性:名称空间
        <select>:查询功能标签。
        <insert>:新增功能标签。
        <update>:修改功能标签。
        <delete>:删除功能标签。
    属性: 
        id 属性:唯一标识,配合名称空间使用 
        parameterType 属性:指定参数映射的对象类型
        resultType 属性:指定结果映射的对象类型
    SQL 获取参数 
        #{属性名}
    -->
    

    MyBaties核心配置文件

    1、数据库连接配置文件引入

    jdbc.properties

    在properties文件中 & 不用转义

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/db4?useUnicode=true&characterEncoding=UTF-8
    username=root
    password=123
    

    MyBatisConfig.xml

    引入

    <!--
        标签:<properties>  引入数据库连接配置文件
        属性:resource 数据库连接配置文件路径
        获取数据库连接参数
             ${键名}
    -->
    <properties resource="jdbc.properties"/>
    

    使用

    <!--property获取数据库连接的配置信息-->
    <property name="driver" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
    
    2、起别名

    ​ 在核心配置文件中通过标签进行配置,为映射文件在使用参数和返回值类型时可以通过别名处理。

    MyBatisConfig.xml

    • 方式一:可以自己随意定义类的别名为任意字符串

      • <typeAliases>   
            <typeAlias type="com.zhu.mybatis.bean.Student" alias="student"/>
        </typeAliases>
        
    • 方式二(推荐):package标签 为某个包下(包含子包下)所有类批量起别名,name属性指向包路径,默认别名为类名小写

      • <!--默认名为类名首字母小写-->
        <typeAliases>
        	<package name="com.zhu.mybatis.bean"/>
        </typeAliases>
        
    3、小结
    <configuration>:核心根标签。 
        <properties>:引入数据库连接信息配置文件标签。
            <typeAliases>:起别名标签。 
                <environments>:配置数据库环境标签。
                    <environment>:配置数据库信息标签, 可以配置多个。 
                        <transactionManager>:事务管理标签。 
                            <dataSource>:数据源标签。 
                                <property>:数据库连接信息标签。 
                                    <mappers>:引入映射配置文件标签。
    

    日志框架

    1)导入jar包 log4j-1.2.17.jar

    2)修改核心配置文件。

    3)在 src 下编写 LOG4J 配置文件 log4j.properties。

    日志级别

    ERROR WARN INFO DEBUG

    log4j.properties

    # Global logging configuration
    # ERROR WARN INFO DEBUG
    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
    

    MyBatisConfig.xml

    <settings>
        <!--固定写法-->
    	<setting name="logImpl" value="log4j"/>
    </settings>
    

    扩展

    1、驼峰命名法

    数据库字段命名中存在多个单词使用下划线_ 分隔开,实体中对应的属性命名为 首个单词首字母小写,其他单词首字母大写

    user表字段名: user_name, pass_word, user_pay_status

    User实体属性对应命名: userName, passWrod, userPayStatus

    <!--配置驼峰命名映射, 默认false不支持-->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    
    2、使用@Alias注解为JavaBean起别名
    3、Mapper.xml 入参注意事项
    4、MyBatis传统方式实现Dao层

    分层思想 控制层(controller)、业务层(service)、持久层(dao)

    调用流程

    html页面 - 控制层 - 业务层 - 持久层 - DB

    解决Dao开发存在的问题–Mapper接口开发

    镜花水月
  • 相关阅读:
    HTML学习笔记之二(回到顶部 与 回究竟部)
    初次使用cocoapods注意事项
    struts2在web.xml中配置详情
    hdu 3631 Shortest Path(Floyd)
    bullet HashMap 内存紧密的哈希表
    论文摘抄
    oracle中从指定日期中获取月份或者部分数据
    漫谈机器学习经典算法—特征提取与特征选择
    为什么NULL能多次free
    栈的效率为什么比堆高?
  • 原文地址:https://www.cnblogs.com/fengbingshui/p/13412753.html
Copyright © 2011-2022 走看看