MyBatismybatis(一)

 

 mybatis的基础知识

mybatis和springmvc通过订单商品 案例使

 

基础知识(重点,内容量多)

本着原先生态jdbc程序(单独使用jdbc开发)问题总

mybatis框架原理 (掌握)

mybatis入门序

用户之长、删、改、查

mybatis开发dao两种方式:

原始dao开发方法(程序需要编制dao接口和dao实现类)(掌握)

mybaits的mapper接口(相当给dao接口)代理开发方法(掌握)

mybatis配置文件SqlMapConfig.xml

mybatis核心:

mybatis输入映射(掌握)

mybatis输出映射(掌握)

mybatis的动态sql(掌握)

 

高档知识

订单商品数据模型分析

高等结果集映射(一对一、一针对几近、多对准几近)

mybatis延迟加载

mybatis查询缓存(一级缓存、二级缓存)

mybaits和spring进行整并(掌握)

mybatis逆向工程

 

 

针对原本生态jdbc程序中问题总结

 

1.1 环境

java环境:jdk1.7.0_72

eclipse:indigo

mysql:5.1

 

1.2 创建mysql数据

MyBatis 1MyBatis 2

/*
SQLyog v10.2 
MySQL - 5.1.72-community : Database - mybatis
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
/*Table structure for table `items` */

CREATE TABLE `items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL COMMENT '商品名称',
  `price` float(10,1) NOT NULL COMMENT '商品定价',
  `detail` text COMMENT '商品描述',
  `pic` varchar(64) DEFAULT NULL COMMENT '商品图片',
  `createtime` datetime NOT NULL COMMENT '生产日期',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

/*Table structure for table `orderdetail` */

CREATE TABLE `orderdetail` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `orders_id` int(11) NOT NULL COMMENT '订单id',
  `items_id` int(11) NOT NULL COMMENT '商品id',
  `items_num` int(11) DEFAULT NULL COMMENT '商品购买数量',
  PRIMARY KEY (`id`),
  KEY `FK_orderdetail_1` (`orders_id`),
  KEY `FK_orderdetail_2` (`items_id`),
  CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

/*Table structure for table `orders` */

CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT '下单用户id',
  `number` varchar(32) NOT NULL COMMENT '订单号',
  `createtime` datetime NOT NULL COMMENT '创建订单时间',
  `note` varchar(100) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `FK_orders_1` (`user_id`),
  CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

/*Table structure for table `user` */

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` date DEFAULT NULL COMMENT '生日',
  `sex` char(1) DEFAULT NULL COMMENT '性别',
  `address` varchar(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

table

MyBatis 3MyBatis 4

/*
SQLyog v10.2 
MySQL - 5.1.72-community : Database - mybatis
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
/*Data for the table `items` */

insert  into `items`(`id`,`name`,`price`,`detail`,`pic`,`createtime`) values (1,'台式机',3000.0,'该电脑质量非常好!!!!',NULL,'2015-02-03 13:22:53'),(2,'笔记本',6000.0,'笔记本性能好,质量好!!!!!',NULL,'2015-02-09 13:22:57'),(3,'背包',200.0,'名牌背包,容量大质量好!!!!',NULL,'2015-02-06 13:23:02');

/*Data for the table `orderdetail` */

insert  into `orderdetail`(`id`,`orders_id`,`items_id`,`items_num`) values (1,3,1,1),(2,3,2,3),(3,4,3,4),(4,4,2,3);

/*Data for the table `orders` */

insert  into `orders`(`id`,`user_id`,`number`,`createtime`,`note`) values (3,1,'1000010','2015-02-04 13:22:35',NULL),(4,1,'1000011','2015-02-03 13:22:41',NULL),(5,10,'1000012','2015-02-12 16:13:23',NULL);

/*Data for the table `user` */

insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'王五',NULL,'2',NULL),(10,'张三','2014-07-10','1','北京市'),(16,'张小明',NULL,'1','河南郑州'),(22,'陈小明',NULL,'1','河南郑州'),(24,'张三丰',NULL,'1','河南郑州'),(25,'陈小明',NULL,'1','河南郑州'),(26,'王五',NULL,NULL,NULL);

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

data

MyBatis 5

 

1.1 jdbc程序

动jdbc查询mysql数据库被用户表的记录。

 

创建java工程,加入jar包:

数据库让包(mysql5.1)

 MyBatis 6

上面的凡mysql驱动。

下的是oracle的教。

 

package cn.itcast.mybatis.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 
 * <p>Title: JdbcTest</p>
 * <p>Description:通过单独的jdbc程序,总结其中的问题 </p>*/
public class JdbcTest {

    public static void main(String[] args) {

        //数据库连接
        Connection connection = null;
        //预编译的Statement,使用预编译的Statement提高数据库性能
        PreparedStatement preparedStatement = null;
        //结果 集
        ResultSet resultSet = null;

        try {
            //加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");

            //通过驱动管理类获取数据库链接
            connection =  DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "mysql");
            //定义sql语句 ?表示占位符
            String sql = "select * from user where username = ?";
            //获取预处理statement
            preparedStatement = connection.prepareStatement(sql);
            //设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
            preparedStatement.setString(1, "王五");
            //向数据库发出sql执行查询,查询出结果集
            resultSet =  preparedStatement.executeQuery();
            //遍历查询结果集
            while(resultSet.next()){
                System.out.println(resultSet.getString("id")+"  "+resultSet.getString("username"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            //释放资源
            if(resultSet!=null){
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(preparedStatement!=null){
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }


    }
}

 

1.1 题目总结

 

1、数据库连接,使用时就是创造,不动就放飞,对数据库进行反复连接开启同倒闭,造成数据库资源浪费,影响
数据库性能。

设想:使用数据库连接池管理数据库连接。

 

2、将sql语句硬编码到java代码中,如果sql 语句修改,需要还编译java代码,不便于系统保护。

考虑:将sql语句配置于xml配置文件被,即使sql变化,不待对java代码进行双重编译。

 

 

3、向preparedStatement中设置参数,对占位符号位置以及设置参数值,硬编码在java代码中,不便利系统保护。

设想:将sql语句及占位符号和参数全部布局于xml中。

 

4、从resutSet中遍历结果集数据常常,存在硬编码,将收获表底字段进行硬编码,,不便于系统保护。

考虑:将查询的结果集,自动映射成java对象。

 

mybatis框架

 

2.1 mybatis是什么?

 

mybatis是一个持久层的框架,是apache下的头等项目。

mybatis托管到goolecode下,再后来托管到github下(https://github.com/mybatis/mybatis-3/releases)。

mybatis让程序用重要精力放在sql上,通过mybatis提供的照方式,自由灵活变动(半自动化,大部分索要程序员编写sql)满足急需sql语句。

mybatis可以拿为
preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)

 

2.2 mybatis框架

MyBatis 7

 

3.1 入门程序

3.1.1 需求

根据用户id(主键)查询用户信息

依据用户称模糊查询用户信息

长用户

删除 用户

更新用户

 

3.1.1 环境

java环境:jdk1.7.0_72

eclipse:indigo

mysql:5.1

 

mybatis运行条件(jar包):

从https://github.com/mybatis/mybatis-3/releases下载,3.2.7版本

MyBatis 8

lib下:依赖包

mybatis-3.2.7.jar:核心 包

mybatis-3.2.7.pdf,操作指南

 

加入mysql的驱动包

 

3.2 log4j.properties

MyBatis 9

3.3 工程结构

MyBatis 10

 

3.4 SqlMapConfig.xml

MyBatis 11

 

3.5 根据用户id(主键)查询用户信息

 

3.5.1 创建po类

 

package cn.itcast.mybatis.po;

import java.util.Date;

/**
 * 
 * <p>Title: User</p>
 * <p>Description:用户po </p>
 * <p>Company: www.itcast.com</p> 
 * @author    传智.燕青
 * @date    2015-4-22上午10:24:16
 * @version 1.0
 */
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 + "]";
    }


}

 

3.5.2 辉映文件

辉映文件命名:

User.xml(原始ibatis命名),mapper代理开发映射文件名称叫XXXMapper.xml,比如:UserMapper.xml、ItemsMapper.xml

在炫耀文件被布置sql语句。

MyBatis 12

 

 

 

3.5.3 在SqlMapConfig.xml加载映射文件

 

在sqlMapConfig.xml中加载User.xml:

 

 

<!-- 加载 映射文件 -->
    <mappers>
        <mapper resource="sqlmap/User.xml"/>
       </mappers>

 

3.5.4 程序编制

MyBatis 13

 

 

 

3.6 因用户称模糊查询用户信息

 

 

 

3.6.1 照耀文件

 

 

 

采取User.xml,添加根据用户称模糊查询用户信息的sql语句。

 

MyBatis 14

 

3.6.2 程序代码

MyBatis 15

 

 

 

3.7 丰富用户

 

 

 

3.7.1 投文件

 

每当 User.xml中布局加上用户之Statement

MyBatis 16

 

 

3.7.2 程序代码

MyBatis 17

 

3.7.3 自加主键返回

mysql自添主键,执行insert提交之前自动生成一个自增主键。

由此mysql函数获取到刚插入记录的自增主键:

LAST_INSERT_ID()

 

凡是insert之后调用此函数。

 

修改insertUser定义:

MyBatis 18

 

 

3.7.4 非自增主键返回(使用uuid())

 

动mysql的uuid()函数生成主键,需要修改表中id字段类型也string,长度设置成35各。

 

实践思路:

先行通过uuid()查询到主键,将主键输入 到sql语句被。

 

执行uuid()语句顺序相对于insert语句之前实施。

 

MyBatis 19

 

 

 

经过oracle的队生成主键:

 

 

 

<selectKey keyProperty=”id” order=”BEFORE”
resultType=”java.lang.String”>

 

SELECT 序列名.nextval()

 

</selectKey>

 

insert into user(id,username,birthday,sex,address)
value(#{id},#{username},#{birthday},#{sex},#{address})

 

 

3.8 删去用户

3.8.1 映射文件

 

MyBatis 20

 

3.8.1代码:

MyBatis 21

 

3.9 更新用户

3.9.1 投文件

MyBatis 22

3.9.2  代码

MyBatis 23

 

 

 

3.10 总结

 

3.10.1 parameterType

每当投文件中经parameterType指定输入 参数的类。

3.10.2 resultType

当照文件中经过resultType指定输出结果的型。

 

3.10.3 #{}和${}

 

#{}表示一个占位符号,#{}接收输入参数,类型可以是简约类型,pojo、hashmap。

若果接简单类型,#{}中好形容成value或任何名称。

#{}接收pojo对象值,通过OGNL读取对象中之属性值,通过属性.属性.属性…的点子取得对象属性值。

 

${}表示一个凑合符号,会引用sql注入,所以不建议利用${}。

${}接收输入参数,类型可以是略类型,pojo、hashmap。

设接受简单类型,${}中不得不写成value。

${}接收pojo对象值,通过OGNL读取对象吃之属性值,通过属性.属性.属性…的措施取得对象属性值。

 

 

 3.10.4 selectOne和selectList

 

selectOne代表查询有同样长长的记下进行映射。如果使用selectOne可以实现以selectList也得以实现(list中只有生一个对象)。

 

selectList表示查询有一个列表(多长条记下)进行映射。如果应用selectList查询多漫长记下,不可知动用selectOne。

 

使运用selectOne报错:

org.apache.ibatis.exceptions.TooManyResultsException: Expected one
result (or null) to be returned by selectOne(), but found: 4

 

 

 

3.11 mybatis和hibernate本质区别和动场景

 

hibernate:是一个标准ORM框架(对象关联映射)。入帮派门槛比较高的,不需程序写sql,sql语句自动生成了。

本着sql语句进行优化、修改比较艰难的。

下场景:

适用和需要转变不多之中小型项目,比如:后台管理网,erp、orm、oa。。

 

mybatis:专注是sql本身,需要程序员自己修sql语句,sql修改、优化比较好。mybatis是一个非全 的ORM框架,虽然程序员自己写sql,mybatis 也足以实现映射(输入映射、输出映射)。

动用场景:

适用同需求转变于多的类,比如:互联网项目。

 

店展开技能选型,以低本钱 高回报作为技术选型的规则,根据项目组的技艺能力进行分选。

 

 

mybatis开发dao的方法

 

 

 

4.1 SqlSession使用范围

 

 

 

4.1.1 SqlSessionFactoryBuilder

 

 通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory

 

将SqlSessionFactoryBuilder算一个工具类使用即可,不待运用单例管理SqlSessionFactoryBuilder。

 

每当急需创造SqlSessionFactory时候,只待new一潮SqlSessionFactoryBuilder即可。

 

 

 

 

 

4.1.2 SqlSessionFactory

 

透过SqlSessionFactory创建SqlSession,使用单例模式管理sqlSessionFactory(工厂要创立,使用一个实例)。

 

 

 

明朝mybatis和spring整合后,使用单例模式管理sqlSessionFactory。

 

 

 

 

 

4.1.3 SqlSession

 

SqlSession是一个面向用户(程序员)的接口。

 

SqlSession中提供了多操作数据库的法:如:selectOne(返回单个对象)、selectList(返回单个或多单对象)、。

 

 

 

SqlSession是线程不安全的,在SqlSesion实现类似吃除有接口中之点子(操作数据库的主意)还闹数据域属性。

 

 

 

SqlSession最佳应用场合当方体内,定义成有变量使用。

 

 

4.2 原始dao开发方法(程序员需要写dao接口和dao实现类)

4.2.1 思路

程序员需要写dao接口和dao实现类。

欲往dao实现类中注入SqlSessionFactory,在法体内通过SqlSessionFactory创建SqlSession

 

 

 

4.2.2 dao接口

MyBatis 24

 

4.2.1 dao接口实现类似

 

public class UserDaoImpl implements UserDao {

    // 需要向dao实现类中注入SqlSessionFactory
    // 这里通过构造方法注入
    private SqlSessionFactory sqlSessionFactory;

    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

    @Override
    public User findUserById(int id) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();

        User user = sqlSession.selectOne("test.findUserById", id);

        // 释放资源
        sqlSession.close();

        return user;

    }

    @Override
    public void insertUser(User user) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //执行插入操作
        sqlSession.insert("test.insertUser", user);

        // 提交事务
        sqlSession.commit();

        // 释放资源
        sqlSession.close();

    }

    @Override
    public void deleteUser(int id) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //执行插入操作
        sqlSession.delete("test.deleteUser", id);

        // 提交事务
        sqlSession.commit();

        // 释放资源
        sqlSession.close();

    }

}

 

4.3.1 测试代码:

 

 

MyBatis 25

 

 

4.2.5  总结原始 dao开发问题

 

1、dao接口实现类似方式中有大量模板方法,设想能否拿这些代码提取出来,大大减轻程序员的工作量。

 

 

 

2、调用sqlsession方法时用statement的id硬编码了

 

 

 

3、调用sqlsession方法时传出的变量,由于sqlsession方法应用泛型,即使变量类型传入错误,在编译阶段也非报错,不便宜程序员开发。

 

 

 

 

 

4.3 mapper代理方法(程序员只待mapper接口(相当 于dao接口))

 

4.3.1 思路(mapper代理开发规范)

 

 

 

程序员还索要编制mapper.xml映射文件

 

程序员编写mapper接口需要以一些支规范,mybatis可以自动生成mapper接口实现类似代理对象。

 

 

 

付出规范:

 

1、在mapper.xml中namespace等于mapper接口地址

 

MyBatis 26

 

 

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

 

3、mapper.java接口中之艺术输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

 

4、mapper.java接口中之法子返回值类型和mapper.xml中statement的resultType指定的品种一致。

MyBatis 27

MyBatis 28

 

总结:

以上开发规范重大是针对性下的代码进行统一老成:

 

User user = sqlSession.selectOne(“test.findUserById”, id);

sqlSession.insert(“test.insertUser”, user);

。。。。

 

 

4.3.2mapper.java

MyBatis 29

4.3.3 mapper.xml

MyBatis 30

4.3.4 在SqlMapConfig.xml中加载mapper.xml

MyBatis 31

4.3.5 测试

MyBatis 32

4.6.3 一部分题材总结

4.6.3.1 代理对象中调用selectOne或selectList

 

一经mapper方法返回单个pojo对象(非集合对象),代理对象中通过selectOne查询数据库。

 

如果mapper方法返回集合对象,代理对象中通过selectList查询数据库。

 

 

4.6.3.2 mapper接口方法参数只能有一个是否影响系 开发

mapper接口方法参数只能发出一个,系统是否不便于扩展维护。

 

网 框架中,dao层的代码是为业务层公用的。

不畏mapper接口只出一个参数,可以使用包装档次的pojo满足不同之作业方法的需求。

 

注意:持久层方法的参数可以包档次、map。。。,service方法中建议不用采取包装档次(不便民业务层的不过扩大)。

 

SqlMapConfig.xml

mybatis的全局配置文件SqlMapConfig.xml,配置内容如下:

 

properties(属性)

settings(全局配置参数)

typeAliases(类型别名)

typeHandlers(类型处理器)

objectFactory(对象工厂)

plugins(插件)

environments(环境聚合属性对象)

environment(环境子属性对象)

transactionManager(事务管理)

dataSource(数据源)

mappers(映射器)

5.1 properties属性

 

需求:

以数据库连接参数单独安排当db.properties中,只需要在SqlMapConfig.xml中加载db.properties的属性值。

每当SqlMapConfig.xml中即使不需对数据库连接参数硬编码。

 

将数据库连接参数就安排在db.properties中,原因:方便对参数进行统一管理,其它xml可以引用该db.properties。

 

MyBatis 33MyBatis 34

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=mysql

db.properties

于sqlMapConfig.xml加载属性文件:

MyBatis 35

 

 

properties特性:

 

 

 

顾: MyBatis 将按照下面的次第来加以载属性:

 

# 在 properties 元素体内定义之习性首先给读取。

 

# 然后会读取properties 元素中resource或 url 加载的性能,它见面蒙已读取的同名属性。

 

# 最后念取parameterType传递的习性,它会挂已读取的同名属性。

 

 

 

建议:

 

毫不当properties元素体内长其它属性值,只将属于性值定义在properties文件被。

 

当properties文件中定义属性名要有肯定的特殊性,如:XXXXX.XXXXX.XXXX

 

 

5.2 settings全局参数配置

 

 

 

mybatis框架于运作时方可调整一些周转参数。

 

本:开启二级缓存、开启延迟加载。。

 

 

 

全局参数将会晤潜移默化mybatis的周转行为。

 

 

 

详细参见“学习材料/mybatis-settings.xlsx”文件

 

MyBatis 36

MyBatis 37MyBatis 38

 

 

5.3 typeAliases(别名)重点

 

5.3.1 需求

以mapper.xml中,定义很多之statement,statement需要parameterType指定输入参数的种类、需要resultType指定输出结果的照类型。

 

倘在指定项目时输入型全路线,不便宜开展付出,可以本着parameterType或resultType指定的类型定义一些号,在mapper.xml中通过别名定义,方便开发。

 

 

5.3.2 mybatis默认支持别名

 

 

别名

映射的类型

_byte

byte

_long

long

_short

short

_int

int

_integer

int

_double

double

_float

float

_boolean

boolean

string

String

byte

Byte

long

Long

short

Short

int

Integer

integer

Integer

double

Double

float

Float

boolean

Boolean

date

Date

decimal

BigDecimal

bigdecimal

BigDecimal 

 

 

 

 

5.3.1 从今定义别名

 

 

 

5.3.1.1 单个别名定义

 

 

    <!-- 别名定义 -->
    <typeAliases>

        <!-- 针对单个别名定义
        type:类型的路径
        alias:别名
         -->
        <!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> -->


    </typeAliases>

 

引用别名:

MyBatis 39

5.3.3.2 批量概念别名(常用)

MyBatis 40

 

5.4 typeHandlers(类型处理器)

 

mybatis中通过typeHandlers完成jdbc类型和java类型的更换。

 

通常状态下,mybatis提供的品类处理器满足普通需要,不需由定义.

 

mybatis支持项目处理器:

 

类型处理器

Java类型

JDBC类型

BooleanTypeHandler

Boolean,boolean

任何兼容的布尔值

ByteTypeHandler

Byte,byte

任何兼容的数字或字节类型

ShortTypeHandler

Short,short

任何兼容的数字或短整型

IntegerTypeHandler

Integer,int

任何兼容的数字和整型

LongTypeHandler

Long,long

任何兼容的数字或长整型

FloatTypeHandler

Float,float

任何兼容的数字或单精度浮点型

DoubleTypeHandler

Double,double

任何兼容的数字或双精度浮点型

BigDecimalTypeHandler

BigDecimal

任何兼容的数字或十进制小数类型

StringTypeHandler

String

CHAR和VARCHAR类型

ClobTypeHandler

String

CLOB和LONGVARCHAR类型

NStringTypeHandler

String

NVARCHAR和NCHAR类型

NClobTypeHandler

String

NCLOB类型

ByteArrayTypeHandler

byte[]

任何兼容的字节流类型

BlobTypeHandler

byte[]

BLOB和LONGVARBINARY类型

DateTypeHandler

Date(java.util)

TIMESTAMP类型

DateOnlyTypeHandler

Date(java.util)

DATE类型

TimeOnlyTypeHandler

Date(java.util)

TIME类型

SqlTimestampTypeHandler

Timestamp(java.sql)

TIMESTAMP类型

SqlDateTypeHandler

Date(java.sql)

DATE类型

SqlTimeTypeHandler

Time(java.sql)

TIME类型

ObjectTypeHandler

任意

其他或未指定类型

EnumTypeHandler

Enumeration类型

VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)。

 

 

5.5mappers(映射配置)

 

5.5.1 由此resource加载单个映射文件

 

<!--通过resource方法一次加载一个映射文件 -->
        <!-- <mapper resource="mapper/UserMapper.xml"/> -->

5.5.2经过mapper接口加载单个mapper

 

<!-- 通过mapper接口加载单个 映射文件
        遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中
        上边规范的前提是:使用的是mapper代理方法
         -->
        <!-- <mapper class="cn.itcast.mybatis.mapper.UserMapper"/> -->

 

遵照上的标准,将mapper.java和mapper.xml放在一个目录 ,且同名

 

MyBatis 41

5.5.3 批量加载mapper(推荐使用)

 

MyBatis 42

 

输入映射

经parameterType指定输入参数的种类,类型可以是简约类型、hashmap、pojo的包裹档次

 

6.1 传递pojo的包装对象

 

6.1.1 需求

 

成就用户信息之概括查询,需要传入查询条件大复杂(可能连用户信息、其它信息,比如商品、订单的)

 

6.1.2 概念包装档次pojo

 

对上需求,建议以于定义之包档次的pojo。

 

于包装档次的pojo中将复杂的查询条件包装上。

 

MyBatis 43

 

 

6.1.3 mapper.xml

 

每当UserMapper.xml中定义用户信息汇总查询(查询条件复杂,通过高档查询进行复杂关系查询)。

 

MyBatis 44

6.1.4 mapper.java

MyBatis 45

 

6.1.5 测试代码

MyBatis 46

 

输出映射

7.1 resultType

运resultType进行输出映射,只有查询出来的列名和pojo中之性名相同,该列才可以射成功。

而查询出来的列名和pojo中之属性名全部未等同,没有开创pojo对象。

使查询出来的列名和pojo中之习性有一个一样,就会创造pojo对象。

7.1.1 输出简单类型

7.1.1.1 需求

用户信息的汇总查询列表总数,通过询问总数和上用户综合查询列表才好兑现分页。

7.1.1.2 mapper.xml

MyBatis 47

7.1.1.3 mapper.java

MyBatis 48

7.1.1.4 测试代码

MyBatis 49

7.1.1.15小结

询问出来的结果集才出一行还同排,可以行使简便类型进行输出映射。

7.1.2输出pojo对象和pojo列表

任由是出口的pojo单个对象或一个列表(list中包括pojo),在mapper.xml中resultType指定的门类是一律的。

于mapper.java指定的章程返回值类型不雷同:

1、输出单个pojo对象,方法返回值是单个对象类型

MyBatis 50

2、输出pojo对象list,方法返回值是List<Pojo>

 MyBatis 51

别的动态代理对象中是冲mapper方法的归值类型确定是调用selectOne(返回单个对象调用)还是selectList (返回集合对象调用 ).

 

7.2 resultMap

 

mybatis中使resultMap完成高级输出结果映射。

 

7.2.1 resultMap使用方式

 

设若查询出来的列名和pojo的性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个炫耀关系。

 

1、定义resultMap

 

2、使用resultMap作为statement的输出映射类 

 

7.2.2 用下的sql使用User完成投

 

SELECT id id_,username username_ FROM USER WHERE id=#{value}

 

User类中属性名和上面查询列名不相同。

7.2.2.1 定义reusltMap

MyBatis 52

7.2.2.2使用resultMap作为statement的出口映射类型

MyBatis 53

7.2.2.3 mapper.java

MyBatis 54

 

7.2.2.4 测试

MyBatis 55

 

7.3 小结

行使resultType进行输出映射,只有查询出来的列名和pojo中之性名相同,该列才可射成功。

苟查询出来的列名和pojo的特性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个射关系。

 

动态sql

8.1 好家伙是动态sql

mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。

8.2 需求

用户信息汇总查询列表和用户信息查询列表总数就点儿个statement的概念使用动态sql。

针对查询条件进行判定,如果输入参数不为空才进行询问条件拼接。

8.3 mapper.xml

MyBatis 56

MyBatis 57

 

8.4 测试代码

MyBatis 58

8.5 sql片段

8.5.1 需求

用上面实现之动态sql判断代码块抽取出来,组成一个sql片段。其它的statement中不怕好引用sql片段。

惠及程序员进行付出。

8.5.2 定义sql片段

MyBatis 59

 

 

8.5.3 引用sql片段

 

在mapper.xml中定义的statement中援引sql片段:

 

 

MyBatis 60

MyBatis 61

 

8.6 foreach

 

于sql传递数组或List,mybatis使用foreach解析

8.6.1 需求

每当用户查询列表和询问总数的statement中长多单id输入查询。

sql语句如下:

些微栽艺术:

SELECT * FROM USER WHERE id=1 OR id=10 OR id=16

SELECT * FROM USER WHERE id IN(1,10,16)

 

 

8.6.2每当输入参数类型中添加List<Integer> ids传入多单id

 

MyBatis 62

 

 

8.6.3 修改mapper.xml

 

 

WHERE id=1 OR id=10 OR id=16

 

于询问条件被,查询条件定义成一个sql片段,需要改sql片段。

 

MyBatis 63

 

8.6.4 测试代码

 

MyBatis 64

 

8.6.5 除此以外一个sql的兑现:

MyBatis 65

 

网站地图xml地图