zoukankan      html  css  js  c++  java
  • MyBatis学习之初识MyBatis(一)

    MyBatis的介绍

      Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

    1、MyBatis架构

    1、  mybatis配置

       SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。

    mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

    2、  通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂

    3、  由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。

    4、  mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。

    5、  Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。

    6、  Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。

    7、  Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

    2、创建工程

    开发环境:

    STS开发工具

    JDK:1.7

    2.1 第一步:创建java工程

    使用STS创建java工程,jdk使用1.7.0_72.

    2.2 第二步:加入jar包

    加入mybatis核心包、依赖包、数据驱动包

     2.3 第三步:log4j.properties

    mybatis默认使用log4j作为输出日志信息。

    在classpath下创建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

    注意:log4j.properties中log4j.rootLogger=DEBUG, stdout必须是debug,不是ssh框架中的info ,因为我们的sql语句是配置到mapper。xml文件中,

    使用debug可以方便我们调试sql语句。

    2.4 第四步: SqlMapConfig.xml

    在classpath下创建SqlMapConfig.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>
        <!-- 配置属性 
            先加载内部属性,再加载外部属性,如果有同名属性会覆盖。
        -->
        <properties resource="db.properties">
            <property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="jdbc.url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>
            <property name="jdbc.username" value="hello"/>
        </properties>
        <!-- 配置pojo别名 -->
        <typeAliases>
            <typeAlias type="com.mybatis.po.User" alias="user"/>
        </typeAliases>
        <!-- 和spring整合后 environments配置将废除-->
        <environments default="development">
            <environment id="development">
            <!-- 使用jdbc事务管理-->
                <transactionManager type="JDBC" />
            <!-- 数据库连接池-->
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc.driver}" />
                    <property name="url" value="${jdbc.url}" />
                    <property name="username" value="${jdbc.username}" />
                    <property name="password" value="${jdbc.password}" />
                </dataSource>
            </environment>
        </environments>
        <!-- 加载mapper文件 -->
        <mappers>
            <!-- resource基于classpath查找 -->
            <mapper resource="sqlmap/user.xml"/>
        </mappers>
    </configuration>

    SqlMapConfig.xml是mybatis核心配置文件,上边文件的配置内容为数据源、事务管理。

     2.5 第五步:po类

    package com.mybatis.po;
    
    import java.util.Date;
    
    public class User {
    
        private int id;
        private String username;// 用户姓名
        private String sex;// 性别
        private Date birthday;// 生日
        private String address;// 地址
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        public Date getBirthday() {
            return birthday;
        }
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
        public String getAddress() {
            return address;
        }
        public void setAddress(String address) {
            this.address = address;
        }
        @Override
        public String toString() {
            return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address="
                    + address + "]";
        }
    
        
    }
    po类

    2.6 第六步:sql映射文件

    在classpath下的sqlmap目录下创建sql映射文件Users.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">
        <!-- 根据id获取用户信息 -->
        <select id="findUserById" parameterType="int" resultType="com.mybatis.po.User">
            select * from user where id = #{id}
        </select>    
    </mapper>

    2.7 第七步: 加载映射文件

    mybatis框架需要加载映射文件,将Users.xml添加在SqlMapConfig.xml,如下:

    2.8 第八步:数据库准备数据

     2.9 第九步:测试

    package test;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.logging.slf4j.Slf4jImpl;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.mybatis.po.User;
    
    public class MyBatisTest {
    
        //会话工厂
            private SqlSessionFactory sqlSessionFactory;
    
            @Before
            public void createSqlSessionFactory() throws IOException {
                // 配置文件
                String resource = "SqlMapConfig.xml";
                InputStream inputStream = Resources.getResourceAsStream(resource);
    
                // 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactory
                sqlSessionFactory = new SqlSessionFactoryBuilder()
                        .build(inputStream);
    
            }
            @Test
            public void test(){
                SqlSession sqlSession = sqlSessionFactory.openSession();
                User user = sqlSession.selectOne("findUserById", 10);
                System.out.println(user);
            }
    
    }
    测试代码

    测试结果:

    2.10 小结

     #{}和${}的区别

      #{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

      ${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。

  • 相关阅读:
    操作系统死锁原因及必要条件
    微信公众平台实现获取用户OpenID的方法
    开源授权协议使用调查报告,Apache最受欢迎 狼人:
    软件工程师,你真的喜欢你的工作吗? 狼人:
    程序员的本质 狼人:
    推荐16个最流行的JavaScript框架 狼人:
    11个完全免费的线框图工具 狼人:
    消息队列软件产品大比拼 狼人:
    FreeMarker 2.3.17版发布! 狼人:
    分享9个实用的jQuery倒计时插件 狼人:
  • 原文地址:https://www.cnblogs.com/lxk233/p/8489776.html
Copyright © 2011-2022 走看看