MyBatis

一、MyBatis概念:

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

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

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

二、示例:

  1)用maven骨架创建一个webapp项目:

    

  2)创建相关目录:

    

  3)编写mybatis配置文件:

<?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>
    <!-- 引入db配置文件,可以使用${}配置服务器 -->
    <properties resource="db.properties"/>

    <!--配置对象别名-->
    <typeAliases>
        <!--<typeAlias type="com.qf.entity.User" alias="user"></typeAlias>-->
        <!-- 批量别名,只写包名,包下的所有类的别名为首字母小写 -->
        <package name="com.qf.entity"/>
    </typeAliases>
    <!--配置转换器-->
    <!--<typeHandlers>-->
    <!--    <typeHandler handler="全限命名" javaType="" jdbcType="" />-->
    <!--</typeHandlers>-->

    <!-- 开发环境 default指定使用的环境id -->
    <environments default="development">
        <!-- 开发环境id-->
        <environment id="development">
            <!-- 事务提交方式:
                  JDBC:利用JDBC方式处理事务(commit、rollback、close);
                  MANAGED:将事务交由其它组件托管(spring、jobss),默认关闭连接;
             -->
            <transactionManager type="JDBC"/>
            <!-- 数据源类型:
                  UNPOOLED:传统JDBC模式,不使用连接池;
                  POOLED:使用数据库连接池,三方连接池;
                  JNDI:从tomcat中获取一个内置的连接池;
             -->
            <dataSource type="POOLED">
                <!--配置数据库信息 -->
                <property name="driver" value="${db.driver}"/>
                <property name="url" value="${db.url}"/>
                <property name="username" value="${db.username}"/>
                <property name="password" value="${db.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!-- 加载映射文件 -->
        <!--<mapper resource="com.qf.entity/UserMapper.xml" />-->
        <!-- 批量加载映射文件,只写包名;要求xml和mapper接口放一个包内,且名称相同 -->
        <package name="com.qf.mapper"/>
    </mappers>
</configuration>
mybatis.xml
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/test
db.username=root
db.password=000000
db.properties

   4)导入依赖:

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.46</version>
    </dependency>

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.0</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>

    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.12</version>
    </dependency>
依赖

  5)在pom中的build标签中配置导入mapper.xml文件:默认只会导入resource文件下的xml;

  <build>
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
        </includes>
        <!--默认是true-->
        <!--<filtering>true</filtering>-->
      </resource>
    </resources>
  </build>
resources

  6)bean:

public class User {
    private Long id;
    private String name;
    private Integer age;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
entity

  7)mapper:

<?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="com.qf.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="com.qf.entity.User">
        <id column="id" jdbcType="BIGINT" property="id"/>
        <result column="name" jdbcType="VARCHAR" property="name"/>
        <result column="age" jdbcType="INTEGER" property="age"/>
    </resultMap>
    <sql id="Base_Column_List">
    id, name, age
    </sql>
    <select id="selectAll" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from user
    </select>
</mapper>
mapper

  8)接口:

public interface UserMapper {
    List<User> selectAll();
}
View Code

  9)测试类:

public class test {
    @Test
    public void test01() throws IOException {
        // 1、加载mybatis配置文件
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        // 2、构建SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 3、构建SqlSessionFactory工厂
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(reader);
        // 4、构建SqlSession
        SqlSession sqlSession = sessionFactory.openSession();
        
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = userMapper.selectAll();
        for (Iterator<User> iterator = users.iterator(); iterator.hasNext(); ) {
            User user = iterator.next();
            System.out.println(user);
        }
    }
}
View Code

三、映射表配置的三种方式:

  1)自然映射:bean的属性名和数据库中的字段名完全一致;

  2)resultMap标签配置:

    <resultMap id="BaseResultMap" type="com.qf.entity.User">
        <id column="id" jdbcType="BIGINT" property="id"/>
        <result column="name" jdbcType="VARCHAR" property="name"/>
        <result column="age" jdbcType="INTEGER" property="age"/>
    </resultMap>

  3)构造函数配置:

    1.bean的属性顺序必须和构造内的一致;

    2.属性名不再需要对应,但是属性类型必须一致;

    <resultMap id="BaseResultMap" type="com.qf.entity.User">
        <constructor>
            <idArg column="id" jdbcType="BIGINT" javaType="java.lang.Long"></idArg>
            <arg column="name" jdbcType="VARCHAR" javaType="java.lang.String"></arg>
            <arg column="user_id" jdbcType="INTEGER" javaType="java.lang.Integer"></arg>
        </constructor>
    </resultMap>
View Code

四、映射表SQL语句参数:

1、参数类型:

  1)输入类型:parameterType;

    1、如果输入的是简单类型(8个基本类型+String),占位符可以是#{随意};

    2、如果输入的是对象,占位符必须是对象的属性名,#{属性名};

  2)输出类型:

    1、resultType:输出类型,自然映射;//包名+类名;

    2、resultMap:映射表ID;

      //返回值是集合和数组的情况,都只需设置为单数;

  PS:输入输出参数只能为1个值;

2、#{}/${}区别

类型

简单类型

复杂类型

区别

安全

适用

#{}

#{任意}

#{字段名}

自动加''单引号

防止sql注入

/

${}

${value}

${字段名}

不加单号

不防止

动态排序

3、多参数传入:

  (1)map集合:#{键名};

  (2)注解:#{参数名};//接口中参数设置:@Param(value="参数名");

  (3)编号:#{0};//参数和编号保持一致;(了解)

 

posted @ 2019-08-06 19:36  开拖拉机的拉风少年  阅读(148)  评论(0编辑  收藏  举报