MyBatis详解

未来的你,一定会感激现在拼命的自己

MyBatis

        MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。

     本教程是用maven构建项目、不会maven的看这篇文章!-----
Maven教程
  • 开发工具:idea
  • 语言:java
  • 项目结构:maven项目
  • mysql数据库


    本教程有 MyBatis三种开发方式:

       mybatis本地调试、代理开发方式、传统开发方式!



1、入门案例


1.1、db.properties文件

[java] view plain copy
print ?
  1. "font-size:18px;">jdbc.driver=com.mysql.jdbc.Driver  
  2. jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8  
  3. jdbc.username=用户名  
  4. jdbc.password=密码  
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8
jdbc.username=用户名
jdbc.password=密码


1.1.1SQL语句、数据表

[java] view plain copy
print ?
  1. /* 
  2. SQLyog v10.2  
  3. MySQL - 5.1.72-community : Database - mybatis 
  4. ********************************************************************* 
  5. */  
  6. /*Table structure for table `items` */  
  7.   
  8. CREATE TABLE `items` (  
  9.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  10.   `name` varchar(32) NOT NULL COMMENT '商品名称',  
  11.   `price` float(10,1) NOT NULL COMMENT '商品定价',  
  12.   `detail` text COMMENT '商品描述',  
  13.   `pic` varchar(64) DEFAULT NULL COMMENT '商品图片',  
  14.   `createtime` datetime NOT NULL COMMENT '生产日期',  
  15.   PRIMARY KEY (`id`)  
  16. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;  
  17.   
  18. /*Table structure for table `orderdetail` */  
  19.   
  20. CREATE TABLE `orderdetail` (  
  21.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  22.   `orders_id` int(11) NOT NULL COMMENT '订单id',  
  23.   `items_id` int(11) NOT NULL COMMENT '商品id',  
  24.   `items_num` int(11) DEFAULT NULL COMMENT '商品购买数量',  
  25.   PRIMARY KEY (`id`),  
  26.   KEY `FK_orderdetail_1` (`orders_id`),  
  27.   KEY `FK_orderdetail_2` (`items_id`),  
  28.   CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,  
  29.   CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION  
  30. ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;  
  31.   
  32. /*Table structure for table `orders` */  
  33.   
  34. CREATE TABLE `orders` (  
  35.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  36.   `user_id` int(11) NOT NULL COMMENT '下单用户id',  
  37.   `number` varchar(32) NOT NULL COMMENT '订单号',  
  38.   `createtime` datetime NOT NULL COMMENT '创建订单时间',  
  39.   `note` varchar(100) DEFAULT NULL COMMENT '备注',  
  40.   PRIMARY KEY (`id`),  
  41.   KEY `FK_orders_1` (`user_id`),  
  42.   CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION  
  43. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;  
  44.   
  45. /*Table structure for table `user` */  
  46.   
  47. CREATE TABLE `user` (  
  48.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  49.   `username` varchar(32) NOT NULL COMMENT '用户名称',  
  50.   `birthday` date DEFAULT NULL COMMENT '生日',  
  51.   `sex` char(1) DEFAULT NULL COMMENT '性别',  
  52.   `address` varchar(256) DEFAULT NULL COMMENT '地址',  
  53.   PRIMARY KEY (`id`)  
  54. ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;  
/*
SQLyog v10.2 
MySQL - 5.1.72-community : Database - mybatis
*********************************************************************
*/
/*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;


插入数据:

[java] view plain copy
print ?
  1. /* 
  2. SQLyog v10.2  
  3. MySQL - 5.1.72-community : Database - mybatis 
  4. ********************************************************************* 
  5. */  
  6. /*Data for the table `items` */  
  7.   
  8. insert  into `items`(`id`,`name`,`price`,`detail`,`pic`,`createtime`) values (1,'台式机',3000.0,'该电脑质量非常好!!!!',NULL,'2016-02-03 13:22:53'),(2,'笔记本',6000.0,'笔记本性能好,质量好!!!!!',NULL,'2015-02-09 13:22:57'),(3,'背包',200.0,'名牌背包,容量大质量好!!!!',NULL,'2016-02-06 13:23:02');  
  9.   
  10. /*Data for the table `orderdetail` */  
  11.   
  12. 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);  
  13.   
  14. /*Data for the table `orders` */  
  15.   
  16. insert  into `orders`(`id`,`user_id`,`number`,`createtime`,`note`) values (3,1,'1000010','2016-02-04 13:22:35',NULL),(4,1,'1000011','2016-02-03 13:22:41',NULL),(5,10,'1000012','2016-02-12 16:13:23',NULL);  
  17.   
  18. /*Data for the table `user` */  
  19.   
  20. insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'王五',NULL,'2',NULL),(10,'张三','2016-07-10','1','北京市'),(16,'张小明',NULL,'1','河南郑州'),(22,'陈小明',NULL,'1','河南郑州'),(24,'张三丰',NULL,'1','河南郑州'),(25,'陈小明',NULL,'1','河南郑州'),(26,'王五',NULL,NULL,NULL);  
/*
SQLyog v10.2 
MySQL - 5.1.72-community : Database - mybatis
*********************************************************************
*/
/*Data for the table `items` */

insert into items(id,name,price,detail,pic,createtime) values (1,‘台式机’,3000.0,‘该电脑质量非常好!!!!’,NULL,‘2016-02-03 13:22:53’),(2,‘笔记本’,6000.0,‘笔记本性能好,质量好!!!!!’,NULL,‘2015-02-09 13:22:57’),(3,‘背包’,200.0,‘名牌背包,容量大质量好!!!!’,NULL,‘2016-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’,‘2016-02-04 13:22:35’,NULL),(4,1,‘1000011’,‘2016-02-03 13:22:41’,NULL),(5,10,‘1000012’,‘2016-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,‘张三’,‘2016-07-10’,‘1’,‘北京市’),(16,‘张小明’,NULL,‘1’,‘河南郑州’),(22,‘陈小明’,NULL,‘1’,‘河南郑州’),(24,‘张三丰’,NULL,‘1’,‘河南郑州’),(25,‘陈小明’,NULL,‘1’,‘河南郑州’),(26,‘王五’,NULL,NULL,NULL);

1.2、pom.xml文件

[java] view plain copy
print ?
  1. "http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  3.     4.0.0  
  4.     web-test-com  
  5.     MyBatis  
  6.     0.0.1-SNAPSHOT  
  7.     war  
  8.   
  9.       
  10.   
  11.   
  12.           
  13.             junit  
  14.             junit  
  15.             4.12  
  16.             provided  
  17.           
  18.   
  19.           
  20.             log4j  
  21.             log4j  
  22.             1.2.17  
  23.           
  24.   
  25.           
  26.             org.mybatis  
  27.             mybatis  
  28.             3.1.1  
  29.           
  30.           
  31.             mysql  
  32.             mysql-connector-java  
  33.             5.1.38  
  34.           
  35.   
  36.       
  37.   
  38.   
  39.   

    4.0.0
    web-test-com
    MyBatis
    0.0.1-SNAPSHOT
    war
<dependencies>


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

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.1.1</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.38</version>
    </dependency>

</dependencies>

1.3、SqlMappingConfig.xml文件

[java] view plain copy
print ?
  1. "1.0" encoding="UTF-8" ?>  
  2. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
  3. "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  4.   
  5.   
  6.       
  7.     "db.properties">  
  8.           
  9.           
  10.       
  11.   
  12.       
  13.       
  14.   
  15.       
  16.           
  17.           
  18.           
  19.         "cn.com.czy.mybatis.pojo.User" alias="user" />  
  20.           
  21.         <package name="cn.com.mybatis.mapper" />  
  22.       
  23.   
  24.       
  25.     default="development">  
  26.         "development">  
  27.               
  28.             "JDBC" />  
  29.               
  30.             "POOLED">  
  31.                 "driver" value="${jdbc.driver}" />  
  32.                 "url" value="${jdbc.url}" />  
  33.                 "username" value="${jdbc.username}" />  
  34.                 "password" value="${jdbc.password}" />  
  35.               
  36.           
  37.       
  38.   
  39.   
  40.       
  41.       
  42.       
  43.       
  44.           
  45.                   
  46.                "sqlMapper/user.xml" />  
  47.         "sqlMapper/userMapper.xml" />  
  48.         "sqlMapper/OrdersMapperCustom.xml"/>  
  49.   
  50.           
  51.           
  52.           
  53.           
  54.       
  55.   
  56.   



<!-- 加载属性文件 -->
<properties resource="db.properties">
	<!--properties中还可以配置一些属性名和属性值 -->
	<!-- <property name="jdbc.driver" value=""/> -->
</properties>

<!-- 全局配置参数,需要时再设置 -->
<!-- <settings> </settings> -->

<typeAliases>
	<!-- 别名定义 -->
	<!-- 针对单个别名定义 type:类型的路径 alias:别名 -->
	<!-- <typeAlias type="cn.czy.mybatis.po.User" alias="user"/> -->
	<typeAlias type="cn.com.czy.mybatis.pojo.User" alias="user" />
	<!-- 批量别名定义 指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以) -->
	<package name="cn.com.mybatis.mapper" />
</typeAliases>

<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
	<environment id="development">
		<!-- 使用jdbc事务管理,事务控制由mybatis -->
		<transactionManager type="JDBC" />
		<!-- 数据库连接池,由mybatis管理 -->
		<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>


<!-- 加载 映射文件 -->
<mappers>


	<!--通过resource方法一次加载一个映射文件 -->
            <!--注意这里的路径和xml文件 -->
           <mapper resource="sqlMapper/user.xml" />
	<mapper resource="sqlMapper/userMapper.xml" />
	<mapper resource="sqlMapper/OrdersMapperCustom.xml"/>

	<!-- 批量加载mapper 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载 -->
	<!-- 遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 -->
	<!-- 中 上边规范的前提是:使用的是mapper代理方法 
	<package name="cn.com.czy.mybatis.two.mapper" />-->
	
</mappers>


1.4、user.xml文件(注意在SqlMappingConfig.xml文件中已经引用它

[java] view plain copy
print ?
  1. "1.0" encoding="UTF-8" ?>  
  2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  4.   
  5. "test">  
  6.   
  7.       
  8.       
  9.       
  10.       
  11.       
  12.       
  13.     "findUserById" parameterType="int"  resultType="user">  
  14.         SELECT * FROM USER WHERE id=#{value}  
  15.       
  16.   


<!-- 在 映射文件中配置很多sql语句 -->
<!-- 将sql语句封装到mappedStatement对象中,所以将id称为statement的id -->
<!-- parameterType:指定输入 参数的类型,这里指定int型 #{}表示一个占位符号 -->
<!-- #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 -->
<!-- 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称 -->
<!-- resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。 -->
<select id="findUserById" parameterType="int"  resultType="user">
	SELECT * FROM USER WHERE id=#{value}
</select>



1.5、测试类

[java] view plain copy
print ?
  1. package cn.com.czy.mybatis.first;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.Date;  
  6. import java.util.List;  
  7.   
  8. import org.apache.ibatis.io.Resources;  
  9. import org.apache.ibatis.session.SqlSession;  
  10. import org.apache.ibatis.session.SqlSessionFactory;  
  11. import org.apache.ibatis.session.SqlSessionFactoryBuilder;  
  12. import cn.com.czy.mybatis.pojo.User;  
  13. import org.junit.Test;  
  14.   
  15. /** 
  16.  * 《单表映射》 
  17.  * 入门程序总结:这是简单的mybatis入门程序 
  18.  * -- 1、映射(mapper)文件是user.xml --  --  
  19.  * -- 2、逻辑基本的resultType、parameterType等一下基础知识  --  --  
  20.  * -- 3、SqlSessionFactory、SqlSession的原理  --  --  
  21.  */  
  22. public class MybatisFirst {  
  23.   
  24.     public SqlSessionFactory getSqlSessionFactory() throws IOException {  
  25.         // mybatis配置文件  
  26.         String resource = "config/SqlMapConfig.xml";  
  27.         // 得到配置文件流  
  28.         InputStream inputStream = Resources.getResourceAsStream(resource);  
  29.         // 创建会话工厂,传入mybatis的配置文件信息  
  30.         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  
  31.         return sqlSessionFactory;  
  32.     }  
  33.   
  34.     // 根据id查询用户信息,得到一条记录结果  
  35.     @Test  
  36.     public void findUserByIdTest() throws IOException {  
  37.   
  38.         // 通过工厂得到SqlSession  
  39.         SqlSession sqlSession = this.getSqlSessionFactory().openSession();  
  40.   
  41.         // 通过SqlSession操作数据库  
  42.         // 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id  
  43.         // 第二个参数:指定和映射文件中所匹配的parameterType类型的参数  
  44.         // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象  
  45.           
  46.                 // selectOne查询出一条记录(这种很麻烦的!!!往后看看)  
  47.         User user = sqlSession.selectOne("test.findUserById"1);  
  48.         System.out.println(user);  
  49.         // 释放资源  
  50.         sqlSession.close();  
  51.     }  
  52. }  
package cn.com.czy.mybatis.first;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import cn.com.czy.mybatis.pojo.User;
import org.junit.Test;

/**

  • 《单表映射》

  • 入门程序总结:这是简单的mybatis入门程序

  • – 1、映射(mapper)文件是user.xml – –

  • – 2、逻辑基本的resultType、parameterType等一下基础知识 – –

  • – 3、SqlSessionFactory、SqlSession的原理 – –
    */
    public class MybatisFirst {

    public SqlSessionFactory getSqlSessionFactory() throws IOException {
    // mybatis配置文件
    String resource = “config/SqlMapConfig.xml”;
    // 得到配置文件流
    InputStream inputStream = Resources.getResourceAsStream(resource);
    // 创建会话工厂,传入mybatis的配置文件信息
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    return sqlSessionFactory;
    }

    // 根据id查询用户信息,得到一条记录结果
    @Test
    public void findUserByIdTest() throws IOException {

     // 通过工厂得到SqlSession
     SqlSession sqlSession = this.getSqlSessionFactory().openSession();
    
     // 通过SqlSession操作数据库
     // 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id
     // 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
     // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象
     
             // selectOne查询出一条记录(这种很麻烦的!!!往后看看)
     User user = sqlSession.selectOne("test.findUserById", 1);
     System.out.println(user);
     // 释放资源
     sqlSession.close();
    

    }
    }


1.6、selectOne和selectList的解释

      selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。

      selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。




总结:mybatis和hibernate本质区别和应用场景?

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

对sql语句进行优化、修改比较困难的。

 

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


     


2.1、传统的方式写mybatis的应用程序

2.3、环境搭建

pom.xml文件

[java] view plain copy
print ?
  1. "font-size:18px;">"http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  3.     4.0.0  
  4.     web-test-com  
  5.     MyBatis  
  6.     0.0.1-SNAPSHOT  
  7.     war  
  8.   
  9.       
  10.   
  11.           
  12.             junit  
  13.             junit  
  14.             4.12  
  15.             provided  
  16.           
  17.   
  18.           
  19.             log4j  
  20.             log4j  
  21.             1.2.17  
  22.           
  23.   
  24.           
  25.             org.mybatis  
  26.             mybatis  
  27.             3.1.1  
  28.           
  29.           
  30.             mysql  
  31.             mysql-connector-java  
  32.             5.1.38  
  33.           
  34.   
  35.       
  36.   
  37.   
  38.   

    4.0.0
    web-test-com
    MyBatis
    0.0.1-SNAPSHOT
    war
<dependencies>

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

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.1.1</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.38</version>
    </dependency>

</dependencies>


2.4、SqlMappingConfig.xml文件(看注释)

[java] view plain copy
print ?
  1. "1.0" encoding="UTF-8" ?>  
  2. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
  3. "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  4.   
  5.   
  6.       
  7.     "db.properties">  
  8.           
  9.           
  10.       
  11.   
  12.       
  13.       
  14.   
  15.       
  16.           
  17.           
  18.           
  19.         "cn.com.czy.mybatis.pojo.User" alias="user" />  
  20.           
  21.         <package name="cn.com.mybatis.mapper" />  
  22.       
  23.   
  24.       
  25.     default="development">  
  26.         "development">  
  27.               
  28.             "JDBC" />  
  29.               
  30.             "POOLED">  
  31.                 "driver" value="${jdbc.driver}" />  
  32.                 "url" value="${jdbc.url}" />  
  33.                 "username" value="${jdbc.username}" />  
  34.                 "password" value="${jdbc.password}" />  
  35.               
  36.           
  37.       
  38.   
  39.   
  40.       
  41.       
  42.       
  43.       
  44.           
  45.         "sqlMapper/user.xml" />  
  46.         "sqlMapper/userMapper.xml" />  
  47.         "sqlMapper/OrdersMapperCustom.xml"/>  
  48.   
  49.           
  50.           
  51.           
  52.           
  53.       
  54.   
  55.   



<!-- 加载属性文件 -->
<properties resource="db.properties">
	<!--properties中还可以配置一些属性名和属性值 -->
	<!-- <property name="jdbc.driver" value=""/> -->
</properties>

<!-- 全局配置参数,需要时再设置 -->
<!-- <settings> </settings> -->

<typeAliases>
	<!-- 别名定义 -->
	<!-- 针对单个别名定义 type:类型的路径 alias:别名 -->
	<!-- <typeAlias type="cn.czy.mybatis.po.User" alias="user"/> -->
	<typeAlias type="cn.com.czy.mybatis.pojo.User" alias="user" />
	<!-- 批量别名定义 指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以) -->
	<package name="cn.com.mybatis.mapper" />
</typeAliases>

<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
	<environment id="development">
		<!-- 使用jdbc事务管理,事务控制由mybatis -->
		<transactionManager type="JDBC" />
		<!-- 数据库连接池,由mybatis管理 -->
		<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>


<!-- 加载 映射文件 -->
<mappers>


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

	<!-- 批量加载mapper 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载 -->
	<!-- 遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 -->
	<!-- 中 上边规范的前提是:使用的是mapper代理方法 
	<package name="cn.com.czy.mybatis.two.mapper" />-->
	
</mappers>



2.5、映射文件user.xml注意在SqlMappingConfig.xml文件中已经引用它

[java] view plain copy
print ?
  1. "font-size:18px;">"1.0" encoding="UTF-8" ?>  
  2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  4.   
  5.   
  6.   
  7.   
  8. "test">  
  9.   
  10.       
  11.       
  12.       
  13.       
  14.       
  15.       
  16.     "findUserById" parameterType="int"  
  17.         resultType="user">  
  18.           
  19.         SELECT * FROM USER WHERE id=#{value}  
  20.       
  21.   
  22.       
  23.       
  24.       
  25.       
  26.     "findUserByName" parameterType="java.lang.String"  
  27.         resultType="user">  
  28.           
  29.         SELECT * FROM USER WHERE username LIKE '%${value}%'  
  30.       
  31.   
  32.       
  33.        
  34.       
  35.     "insertUser" parameterType="user">  
  36.           
  37.           
  38.           
  39.           
  40.         "id" order="AFTER" resultType="java.lang.Integer">  
  41.               
  42.             SELECT LAST_INSERT_ID()  
  43.           
  44.         insert into user(username,birthday,sex,address)  
  45.         value(#{username},#{birthday},#{sex},#{address})  
  46.           
  47.           
  48.           
  49.           
  50.           
  51.       
  52.   
  53.   
  54.     "deleteUser" parameterType="java.lang.Integer">  
  55.           
  56.         delete from user where  
  57.         id=#{id}  
  58.       
  59.   
  60.   
  61.       
  62.       
  63.       
  64.     "updateUser" parameterType="user">  
  65.           
  66.         update user set  
  67.         username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}  
  68.         where id=#{id}  
  69.       
  70.   
  71.   
  72.   
  73.   
  74.   




<!-- 在 映射文件中配置很多sql语句 -->
<!-- 将sql语句封装到mappedStatement对象中,所以将id称为statement的id -->
<!-- parameterType:指定输入 参数的类型,这里指定int型 #{}表示一个占位符号 -->
<!-- #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 -->
<!-- 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称 -->
<!-- resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。 -->
<select id="findUserById" parameterType="int"
	resultType="user">
	<!-- 需求:通过select执行id查询用户表的记录 -->
	SELECT * FROM USER WHERE id=#{value}
</select>

<!-- resultType:指定就是单条记录所映射的java对象类型  -->
<!-- ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。 使用${}拼接sql,引起 sql注入  -->
<!-- ${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value -->
<!-- 这个mapper文件user对象已经用别名代替 -->
<select id="findUserByName" parameterType="java.lang.String"
	resultType="user">
	<!-- 根据用户名称模糊查询用户信息,可能返回多条  -->
	SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>


<!-- parameterType:指定输入 参数类型是pojo(包括 用户信息)--> 
<!-- #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值 -->
<insert id="insertUser" parameterType="user">
	<!-- SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用与自增主键 -->
	<!-- keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性 -->
	<!-- order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序 -->
	<!-- resultType:指定SELECT LAST_INSERT_ID()的结果类型 -->
	<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
		<!-- 将插入数据的主键返回,返回到user对象中 -->
		SELECT LAST_INSERT_ID()
	</selectKey>
	insert into user(username,birthday,sex,address)
	value(#{username},#{birthday},#{sex},#{address})
	<!-- 使用mysql的uuid()生成主键 执行过程: -->
	<!-- 首先通过uuid()得到主键,将主键设置到user对象的id属性中 其次在insert执行时,从user对象中取出id属性值 -->
	<!-- <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> -->
	<!-- SELECT uuid() </selectKey> insert into user(id,username,birthday,sex,address) -->
	<!-- value(#{id},#{username},#{birthday},#{sex},#{address}) -->
</insert>


<delete id="deleteUser" parameterType="java.lang.Integer">
	<!-- 删除 用户 根据id删除用户,需要输入 id值 -->
	delete from user where
	id=#{id}
</delete>


<!-- 需要传入用户的更新信息 parameterType指定user对象,包括 id和更新信息, -->
<!-- 注意:id必须存在 -->
<!-- #{id}:从输入 user对象中获取id属性值 -->
<update id="updateUser" parameterType="user">
	<!-- 根据id更新用户 分析: 需要传入用户的id -->
	update user set
	username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
	where id=#{id}
</update>


2.6、pojo类
[java] view plain copy
print ?
  1. "font-size:18px;">package cn.com.czy.mybatis.pojo;  
  2.   
  3. import java.util.Date;  
  4.   
  5.   
  6. /** 
  7.  *  
  8.  * 

    Title: User

     
  9.  * 

    Description:用户pojo 

     
  10.  */  
  11. public class User {  
  12.       
  13.     //属性名和数据库表的字段对应  
  14.     private int id;  
  15.     private String username;    // 用户姓名  
  16.     private String sex;     // 性别  
  17.     private Date birthday;      // 生日  
  18.     private String address;     // 地址  
  19.       
  20.     public int getId() {  
  21.         return id;  
  22.     }  
  23.     public void setId(int id) {  
  24.         this.id = id;  
  25.     }  
  26.     public String getUsername() {  
  27.         return username;  
  28.     }  
  29.     public void setUsername(String username) {  
  30.         this.username = username;  
  31.     }  
  32.     public String getSex() {  
  33.         return sex;  
  34.     }  
  35.     public void setSex(String sex) {  
  36.         this.sex = sex;  
  37.     }  
  38.     public Date getBirthday() {  
  39.         return birthday;  
  40.     }  
  41.     public void setBirthday(Date birthday) {  
  42.         this.birthday = birthday;  
  43.     }  
  44.     public String getAddress() {  
  45.         return address;  
  46.     }  
  47.     public void setAddress(String address) {  
  48.         this.address = address;  
  49.     }  
  50.     @Override  
  51.     public String toString() {  
  52.         return "User [id=" + id + ", username=" + username + ", sex=" + sex  
  53.                 + ", birthday=" + birthday + ", address=" + address + "]";  
  54.     }  
  55.   
  56.   
  57. }  
  58.   
package cn.com.czy.mybatis.pojo;

import java.util.Date;

/**
*

  • Title: User

  • Description:用户pojo


    */
    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 + “]”;
    }

}



2.7、测试类(传统的不用接口、只是简单的)

[java] view plain copy
print ?
  1. package cn.com.czy.mybatis.first;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.Date;  
  6. import java.util.List;  
  7.   
  8. import org.apache.ibatis.io.Resources;  
  9. import org.apache.ibatis.session.SqlSession;  
  10. import org.apache.ibatis.session.SqlSessionFactory;  
  11. import org.apache.ibatis.session.SqlSessionFactoryBuilder;  
  12. import cn.com.czy.mybatis.pojo.User;  
  13. import org.junit.Test;  
  14.   
  15. /** 
  16.  * 《单表映射》 
  17.  * 入门程序总结:这是简单的mybatis入门程序 
  18.  * -- 1、映射(mapper)文件是user.xml --  --  
  19.  * -- 2、逻辑基本的resultType、parameterType等一下基础知识  --  --  
  20.  * -- 3、SqlSessionFactory、SqlSession的原理  --  --  
  21.  */  
  22. public class MybatisFirst {  
  23.   
  24.     public SqlSessionFactory getSqlSessionFactory() throws IOException {  
  25.         // mybatis配置文件  
  26.         String resource = "config/SqlMapConfig.xml";  
  27.         // 得到配置文件流  
  28.         InputStream inputStream = Resources.getResourceAsStream(resource);  
  29.         // 创建会话工厂,传入mybatis的配置文件信息  
  30.         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  
  31.         return sqlSessionFactory;  
  32.     }  
  33.   
  34.       
  35.   
  36.     // 根据id查询用户信息,得到一条记录结果  
  37.     @Test  
  38.     public void findUserByIdTest() throws IOException {  
  39.   
  40.         // 通过工厂得到SqlSession  
  41.         SqlSession sqlSession = this.getSqlSessionFactory().openSession();  
  42.   
  43.         // 通过SqlSession操作数据库  
  44.         // 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id  
  45.         // 第二个参数:指定和映射文件中所匹配的parameterType类型的参数  
  46.         // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象  
  47.         // selectOne查询出一条记录  
  48.         User user = sqlSession.selectOne("test.findUserById"1);  
  49.   
  50.         System.out.println(user);  
  51.   
  52.         // 释放资源  
  53.         sqlSession.close();  
  54.   
  55.     }  
  56.   
  57.     // 根据用户名称模糊查询用户列表  
  58.     @Test  
  59.     public void findUserByNameTest() throws IOException {  
  60.   
  61.         // 通过工厂得到SqlSession  
  62.         SqlSession sqlSession = this.getSqlSessionFactory().openSession();  
  63.         // list中的user和映射文件中resultType所指定的类型一致  
  64.         List list = sqlSession.selectList("test.findUserByName""小明");  
  65.         System.out.println("信息:" + list);  
  66.         sqlSession.close();  
  67.   
  68.     }  
  69.   
  70.     // 添加用户信息  
  71.     @Test  
  72.     public void insertUserTest() throws IOException {  
  73.   
  74.         // 通过工厂得到SqlSession  
  75.         SqlSession sqlSession = this.getSqlSessionFactory().openSession();  
  76.         // 插入用户对象  
  77.         User user = new User();  
  78.         user.setUsername("王小军");  
  79.         user.setBirthday(new Date());  
  80.         user.setSex("1");  
  81.         user.setAddress("河南郑州");  
  82.   
  83.         sqlSession.insert("test.insertUser", user);  
  84.   
  85.         // 提交事务  
  86.         sqlSession.commit();  
  87.   
  88.         // 获取用户信息主键  
  89.         System.out.println(user.getId());  
  90.         // 关闭会话  
  91.         sqlSession.close();  
  92.   
  93.     }  
  94.   
  95.     // 根据id删除 用户信息  
  96.     @Test  
  97.     public void deleteUserTest() throws IOException {  
  98.   
  99.         // 通过工厂得到SqlSession  
  100.         SqlSession sqlSession = this.getSqlSessionFactory().openSession();  
  101.   
  102.         // 传入id删除 用户  
  103.         sqlSession.delete("test.deleteUser"49);  
  104.   
  105.         // 提交事务  
  106.         sqlSession.commit();  
  107.   
  108.         // 关闭会话  
  109.         sqlSession.close();  
  110.   
  111.     }  
  112.   
  113.     // 更新用户信息  
  114.     @Test  
  115.     public void updateUserTest() throws IOException {  
  116.   
  117.         // 通过工厂得到SqlSession  
  118.         SqlSession sqlSession = this.getSqlSessionFactory().openSession();  
  119.         // 更新用户信息  
  120.   
  121.         User user = new User();  
  122.         // 必须设置id  
  123.         user.setId(41);  
  124.         user.setUsername("王大军");  
  125.         user.setBirthday(new Date());  
  126.         user.setSex("2");  
  127.         user.setAddress("河南郑州");  
  128.   
  129.         sqlSession.update("test.updateUser", user);  
  130.   
  131.         // 提交事务  
  132.         sqlSession.commit();  
  133.   
  134.         // 关闭会话  
  135.         sqlSession.close();  
  136.   
  137.     }  
  138.   
  139. }  
package cn.com.czy.mybatis.first;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import cn.com.czy.mybatis.pojo.User;
import org.junit.Test;

/**

  • 《单表映射》

  • 入门程序总结:这是简单的mybatis入门程序

  • – 1、映射(mapper)文件是user.xml – –

  • – 2、逻辑基本的resultType、parameterType等一下基础知识 – –

  • – 3、SqlSessionFactory、SqlSession的原理 – –
    */
    public class MybatisFirst {

    public SqlSessionFactory getSqlSessionFactory() throws IOException {
    // mybatis配置文件
    String resource = “config/SqlMapConfig.xml”;
    // 得到配置文件流
    InputStream inputStream = Resources.getResourceAsStream(resource);
    // 创建会话工厂,传入mybatis的配置文件信息
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    return sqlSessionFactory;
    }

    // 根据id查询用户信息,得到一条记录结果
    @Test
    public void findUserByIdTest() throws IOException {

     // 通过工厂得到SqlSession
     SqlSession sqlSession = this.getSqlSessionFactory().openSession();
    
     // 通过SqlSession操作数据库
     // 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id
     // 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
     // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象
     // selectOne查询出一条记录
     User user = sqlSession.selectOne("test.findUserById", 1);
    
     System.out.println(user);
    
     // 释放资源
     sqlSession.close();
    

    }

    // 根据用户名称模糊查询用户列表
    @Test
    public void findUserByNameTest() throws IOException {

     // 通过工厂得到SqlSession
     SqlSession sqlSession = this.getSqlSessionFactory().openSession();
     // list中的user和映射文件中resultType所指定的类型一致
     List<User> list = sqlSession.selectList("test.findUserByName", "小明");
     System.out.println("信息:" + list);
     sqlSession.close();
    

    }

    // 添加用户信息
    @Test
    public void insertUserTest() throws IOException {

     // 通过工厂得到SqlSession
     SqlSession sqlSession = this.getSqlSessionFactory().openSession();
     // 插入用户对象
     User user = new User();
     user.setUsername("王小军");
     user.setBirthday(new Date());
     user.setSex("1");
     user.setAddress("河南郑州");
    
     sqlSession.insert("test.insertUser", user);
    
     // 提交事务
     sqlSession.commit();
    
     // 获取用户信息主键
     System.out.println(user.getId());
     // 关闭会话
     sqlSession.close();
    

    }

    // 根据id删除 用户信息
    @Test
    public void deleteUserTest() throws IOException {

     // 通过工厂得到SqlSession
     SqlSession sqlSession = this.getSqlSessionFactory().openSession();
    
     // 传入id删除 用户
     sqlSession.delete("test.deleteUser", 49);
    
     // 提交事务
     sqlSession.commit();
    
     // 关闭会话
     sqlSession.close();
    

    }

    // 更新用户信息
    @Test
    public void updateUserTest() throws IOException {

     // 通过工厂得到SqlSession
     SqlSession sqlSession = this.getSqlSessionFactory().openSession();
     // 更新用户信息
    
     User user = new User();
     // 必须设置id
     user.setId(41);
     user.setUsername("王大军");
     user.setBirthday(new Date());
     user.setSex("2");
     user.setAddress("河南郑州");
    
     sqlSession.update("test.updateUser", user);
    
     // 提交事务
     sqlSession.commit();
    
     // 关闭会话
     sqlSession.close();
    

    }

}



3.1、mapper代理方法来实现(实际开发用到的)

1、pom.xml文件一样

2、SqlMappingConfig.xml一样

3、开发规范:编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。




3.2、接口UserMapping.xml文件(可能有点多、挑着看就好)

注意在SqlMappingConfig.xml文件中已经引用它

[java] view plain copy
print ?
  1. "1.0" encoding="UTF-8" ?>  
  2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  4.   
  5.   
  6.   
  7.   
  8.   
  9. "cn.com.mybatis.mapper.UserMapper">  
  10.   
  11.       
  12.       
  13.       
  14.     "query_user_where">  
  15.         <if test="userCustom!=null">  
  16.             <if test="userCustom.sex!=null and userCustom.sex!=''">  
  17.                 and user.sex = #{userCustom.sex}  
  18.             if>  
  19.             <if test="userCustom.username!=null and userCustom.username!=''">  
  20.                 and user.username LIKE '%${userCustom.username}%'  
  21.             if>  
  22.         if>  
  23.       
  24.   
  25.       
  26.       
  27.       
  28.       
  29.     "findUserList" parameterType="UserQueryVo"  
  30.         resultType="UserCustom">  
  31.         SELECT * FROM USER  
  32.           
  33.           
  34.               
  35.             "query_user_where">  
  36.               
  37.           
  38.       
  39.   
  40.       
  41.     "findUserCount" parameterType="UserQueryVo"  
  42.         resultType="int">  
  43.         SELECT count(*) FROM USER  
  44.           
  45.           
  46.               
  47.             "query_user_where">  
  48.               
  49.           
  50.       
  51.   
  52.       
  53.       
  54.       
  55.       
  56.       
  57.       
  58.       
  59.       
  60.       
  61.       
  62.       
  63.       
  64.     "findUserById" parameterType="int" resultType="user">  
  65.         SELECT * FROM USER WHERE id=#{value}  
  66.       
  67.   
  68.       
  69.     "findUserByName" parameterType="java.lang.String"  
  70.         resultType="user">  
  71.         SELECT * FROM USER WHERE username LIKE '%${value}%'  
  72.       
  73.   
  74.   
  75.   
  76.       
  77.       
  78.       
  79.       
  80.     "user" id="userResultMap">  
  81.           
  82.           
  83.           
  84.         "id_" property="id" />  
  85.           
  86.           
  87.           
  88.         "username_" property="username" />  
  89.       
  90.   
  91.       
  92.       
  93.     "findUserByIdResultMap" parameterType="int"  
  94.         resultMap="userResultMap">  
  95.         SELECT id id_,username username_ FROM USER WHERE id=#{value}  
  96.       
  97.   
  98.   
  99.   





<!-- 定义sql片段 -->
<!-- id:sql片段的唯 一标识 -->
<!-- 经验:是基于单表来定义sql片段,这样话这个sql片段可重用性才高 在sql片段中不要包括 where -->
<sql id="query_user_where">
	<if test="userCustom!=null">
		<if test="userCustom.sex!=null and userCustom.sex!=''">
			and user.sex = #{userCustom.sex}
		</if>
		<if test="userCustom.username!=null and userCustom.username!=''">
			and user.username LIKE '%${userCustom.username}%'
		</if>
	</if>
</sql>

<!-- 已经指定好别名! -->
<!-- 运用sql片段   -->
<!-- 用户信息综合查询 #{userCustom.sex}:取出pojo包装对象中性别值  -->
<!-- ${userCustom.username}:取出pojo包装对象中用户名称 -->
<select id="findUserList" parameterType="UserQueryVo"
	resultType="UserCustom">
	SELECT * FROM USER
	<!-- where可以自动去掉条件中的第一个and -->
	<where>
		<!-- 引用sql片段 的id,如果refid指定的id不在本mapper文件中,需要前边加namespace -->
		<include refid="query_user_where"></include>
		<!-- 在这里还要引用其它的sql片段 -->
	</where>
</select>

<!-- 用户信息综合查询总数 parameterType:指定输入类型和findUserList一样 resultType:输出结果类型 -->
<select id="findUserCount" parameterType="UserQueryVo"
	resultType="int">
	SELECT count(*) FROM USER
	<!-- where可以自动去掉条件中的第一个and -->
	<where>
		<!-- 引用sql片段 的id,如果refid指定的id不在本mapper文件中,需要前边加namespace -->
		<include refid="query_user_where"></include>
		<!-- 在这里还要引用其它的sql片段 -->
	</where>
</select>

<!-- 在 映射文件中配置很多sql语句 -->
<!-- 需求:通过id查询用户表的记录 -->
<!-- 通过 select执行数据库查询 -->
<!-- id:标识 映射文件中的 sql -->
<!-- 将sql语句封装到mappedStatement对象中,所以将id称为statement的id -->
<!-- parameterType:指定输入 参数的类型,这里指定int型 -->
<!-- #{}表示一个占位符号 -->
<!-- #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称 -->
<!-- resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。 -->
<!-- mapper开发代理规范2:UserMapper 接口中的接口方法名跟id名一样 -->
<!-- mapper开发代理规范3:UserMapper 接口中的返回类型名跟resultType类型一样 -->
<!-- mapper开发代理规范 4:UserMapper 接口中的参数类型名跟parameterType类型一样 -->
<select id="findUserById" parameterType="int" resultType="user">
	SELECT * FROM USER WHERE id=#{value}
</select>

<!-- 根据用户名称模糊查询用户信息,可能返回多条 resultType:指定就是单条记录所映射的java对象 类型 ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。 
	使用${}拼接sql,引起 sql注入 ${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value -->
<select id="findUserByName" parameterType="java.lang.String"
	resultType="user">
	SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>



<!-- 定义resultMap -->
<!-- 将SELECT id id_,username username_ FROM USER 和User类中的属性作一个映射关系 -->
<!-- type:resultMap最终映射的java对象类型,可以使用别名 -->
<!-- id:对resultMap的唯一标识 -->
<resultMap type="user" id="userResultMap">
	<!--id表示查询结果集中唯一标识 -->
	<!--column:查询出来的列名 -->
	<!--property:type指定的pojo类型中的属性名 最终resultMap对column和property作一个映射关系 (对应关系) -->
	<id column="id_" property="id" />
	<!--result:对普通名映射定义 -->
	<!--column:查询出来的列名 -->
	<!--property:type指定的pojo类型中的属性名 最终resultMap对column和property作一个映射关系 (对应关系) -->
	<result column="username_" property="username" />
</resultMap>

<!-- 使用resultMap进行输出映射 -->
<!--resultMap:指定定义的resultMap的id,如果这个resultMap在其它的mapper文件,前边需要加namespace -->
<select id="findUserByIdResultMap" parameterType="int"
	resultMap="userResultMap">
	SELECT id id_,username username_ FROM USER WHERE id=#{value}
</select>



3.3、UserMapping.java类

[java] view plain copy
print ?
  1. package cn.com.mybatis.mapper;  
  2.   
  3. import java.util.List;  
  4.   
  5. import cn.com.czy.mybatis.pojo.User;  
  6.   
  7. /** 
  8.  * 总结: 
  9.  * 1、mapper代理方式、理解mapper开发规范  
  10.  * 2、mapper文件是usermapper.xml 
  11.  * 3、了解动态sql、别名、sql代码片、 
  12.  * 4、了解  resultMap 
  13.  *  
  14.  * 

     

  15.  * Title: UserMapper 
  16.  * 

     
  17.  * 

     

  18.  * Description: mapper接口,相当 于dao接口,用户管理 
  19.  * 

     
  20.  */  
  21. public interface UserMapper {  
  22.   
  23.     // 根据id查询用户信息  
  24.     public User findUserById(int id) throws Exception;  
  25.   
  26.     // 根据用户名列查询用户列表  
  27.     public List findUserByName(String name) throws Exception;  
  28.   
  29.     // 根据id查询用户信息,使用resultMap输出  
  30.     public User findUserByIdResultMap(int id) throws Exception;  
  31.   
  32.     // 用户信息综合查询  
  33.     public List findUserList(UserQueryVo userQueryVo) throws Exception;  
  34.   
  35.     // 用户信息综合查询总数  
  36.     public int findUserCount(UserQueryVo userQueryVo) throws Exception;  
  37.   
  38.     // 插入用户  
  39.     public void insertUser(User user) throws Exception;  
  40.   
  41.     // 删除用户  
  42.     public void deleteUser(int id) throws Exception;  
  43.   
  44. }  
package cn.com.mybatis.mapper;

import java.util.List;

import cn.com.czy.mybatis.pojo.User;

/**

  • 总结:

  • 1、mapper代理方式、理解mapper开发规范

  • 2、mapper文件是usermapper.xml

  • 3、了解动态sql、别名、sql代码片、

  • 4、了解 resultMap

  • Title: UserMapper

  • Description: mapper接口,相当 于dao接口,用户管理


  • */
    public interface UserMapper {

    // 根据id查询用户信息
    public User findUserById(int id) throws Exception;

    // 根据用户名列查询用户列表
    public List findUserByName(String name) throws Exception;

    // 根据id查询用户信息,使用resultMap输出
    public User findUserByIdResultMap(int id) throws Exception;

    // 用户信息综合查询
    public List findUserList(UserQueryVo userQueryVo) throws Exception;

    // 用户信息综合查询总数
    public int findUserCount(UserQueryVo userQueryVo) throws Exception;

    // 插入用户
    public void insertUser(User user) throws Exception;

    // 删除用户
    public void deleteUser(int id) throws Exception;

}



3.3、包装类、继承类(这些只是为了以后更好的拓展罢了)

UserMapping的子类

[java] view plain copy
print ?
  1. package cn.com.mybatis.mapper;  
  2.   
  3. import cn.com.czy.mybatis.pojo.User;  
  4.   
  5. /** 
  6.  * 总结: 
  7.  * 1、mapper代理方式、理解mapper开发规范  
  8.  * 2、mapper文件是usermapper.xml 
  9.  * 3、了解动态sql、别名、sql代码片、 
  10.  * 4、了解  resultMap 
  11.  *  
  12.  * 

    Title: UserCustom

     
  13.  * 

    Description: 用户的扩展类

     
  14.  */  
  15. public class UserCustom extends User{  
  16.       
  17.     //可以扩展用户的信息  
  18.   
  19. }  
package cn.com.mybatis.mapper;

import cn.com.czy.mybatis.pojo.User;

/**

  • 总结:

  • 1、mapper代理方式、理解mapper开发规范

  • 2、mapper文件是usermapper.xml

  • 3、了解动态sql、别名、sql代码片、

  • 4、了解 resultMap

  • Title: UserCustom

  • Description: 用户的扩展类


    */
    public class UserCustom extends User{

    //可以扩展用户的信息

}


UserMapping的包装类

[java] view plain copy
print ?
  1. package cn.com.mybatis.mapper;  
  2.   
  3.   
  4. /** 
  5.  * 总结: 
  6.  * 1、mapper代理方式、理解mapper开发规范  
  7.  * 2、mapper文件是usermapper.xml 
  8.  * 3、了解动态sql、别名、sql代码片、 
  9.  * 4、了解  resultMap 
  10.  *  
  11.  * 

    Title: UserQueryVo

     
  12.  * 

    Description:包装类型 

     
  13.  */  
  14. public class UserQueryVo {  
  15.       
  16.       
  17.     //在这里包装所需要的查询条件  
  18.       
  19.     //用户查询条件  
  20.     private UserCustom userCustom;  
  21.   
  22.     public UserCustom getUserCustom() {  
  23.         return userCustom;  
  24.     }  
  25.   
  26.     public void setUserCustom(UserCustom userCustom) {  
  27.         this.userCustom = userCustom;  
  28.     }  
  29.   
  30.     //可以包装其它的查询条件,订单、商品  
  31.     //....  
  32. }  
package cn.com.mybatis.mapper;

/**

  • 总结:

  • 1、mapper代理方式、理解mapper开发规范

  • 2、mapper文件是usermapper.xml

  • 3、了解动态sql、别名、sql代码片、

  • 4、了解 resultMap

  • Title: UserQueryVo

  • Description:包装类型


    */
    public class UserQueryVo {

    //在这里包装所需要的查询条件

    //用户查询条件
    private UserCustom userCustom;

    public UserCustom getUserCustom() {
    return userCustom;
    }

    public void setUserCustom(UserCustom userCustom) {
    this.userCustom = userCustom;
    }

    //可以包装其它的查询条件,订单、商品
    //…
    }


3.5测试类

[java] view plain copy
print ?
  1. package cn.com.mybatis.mapper;  
  2.   
  3. import java.io.InputStream;  
  4. import java.util.List;  
  5.   
  6. import org.apache.ibatis.io.Resources;  
  7. import org.apache.ibatis.session.SqlSession;  
  8. import org.apache.ibatis.session.SqlSessionFactory;  
  9. import org.apache.ibatis.session.SqlSessionFactoryBuilder;  
  10. import org.junit.Before;  
  11. import org.junit.Test;  
  12.   
  13. import cn.com.czy.mybatis.pojo.User;  
  14.   
  15. /* 
  16.  *  
  17.  * 总结: 
  18.  * 1、mapper代理方式、理解mapper开发规范  
  19.  * 2、mapper文件是usermapper.xml 
  20.  * 3、了解动态sql、别名、sql代码片、 
  21.  * 4、了解  resultMap 
  22.  * 
  23.  */  
  24. public class UserMapperTest {  
  25.   
  26.     private SqlSessionFactory sqlSessionFactory;  
  27.   
  28.     // 此方法是在执行testFindUserById之前执行  
  29.     @Before  
  30.     public void setUp() throws Exception {  
  31.   
  32.         // mybatis配置文件  
  33.         String resource = "config/SqlMapConfig.xml";  
  34.         // 得到配置文件流  
  35.         InputStream inputStream = Resources.getResourceAsStream(resource);  
  36.   
  37.         // 创建会话工厂,传入mybatis的配置文件信息  
  38.         sqlSessionFactory = new SqlSessionFactoryBuilder()  
  39.                 .build(inputStream);  
  40.     }  
  41.   
  42.     //用户信息的综合 查询  
  43.     @Test  
  44.     public void testFindUserList() throws Exception {  
  45.           
  46.         SqlSession sqlSession = sqlSessionFactory.openSession();  
  47.           
  48.         //创建UserMapper对象,mybatis自动生成mapper代理对象  
  49.         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  
  50.           
  51.         //创建包装对象,设置查询条件  
  52.         UserQueryVo userQueryVo = new UserQueryVo();  
  53.         UserCustom userCustom = new UserCustom();  
  54.         userCustom.setSex("1");  
  55.         userCustom.setUsername("郑游");  
  56.         userQueryVo.setUserCustom(userCustom);  
  57.           
  58.         //调用userMapper的方法  
  59.         List list = userMapper.findUserList(userQueryVo);  
  60.           
  61.         System.out.println(list);  
  62.     }  
  63.       
  64.       
  65.       
  66.     @Test  
  67.     public void testFindUserCount() throws Exception {  
  68.           
  69.         SqlSession sqlSession = sqlSessionFactory.openSession();  
  70.           
  71.         //创建UserMapper对象,mybatis自动生成mapper代理对象  
  72.         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  
  73.           
  74.         //创建包装对象,设置查询条件  
  75.         UserQueryVo userQueryVo = new UserQueryVo();  
  76.         UserCustom userCustom = new UserCustom();  
  77.         userCustom.setSex("1");  
  78.         userCustom.setUsername("郑游");  
  79.         userQueryVo.setUserCustom(userCustom);  
  80.         //调用userMapper的方法  
  81.         int count = userMapper.findUserCount(userQueryVo);  
  82.           
  83.         System.out.println(count);  
  84.     }  
  85.       
  86.       
  87.       
  88.     @Test  
  89.     public void testFindUserById() throws Exception {  
  90.           
  91.         SqlSession sqlSession = sqlSessionFactory.openSession();  
  92.           
  93.         //创建UserMapper对象,mybatis自动生成mapper代理对象  
  94.         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  
  95.           
  96.         //调用userMapper的方法  
  97.           
  98.         User user = userMapper.findUserById(1);  
  99.           
  100.         System.out.println(user);  
  101.           
  102.           
  103.     }  
  104.       
  105.       
  106.     @Test  
  107.     public void testFindUserByName() throws Exception {  
  108.           
  109.         SqlSession sqlSession = sqlSessionFactory.openSession();  
  110.           
  111.         //创建UserMapper对象,mybatis自动生成mapper代理对象  
  112.         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  
  113.           
  114.         //调用userMapper的方法  
  115.           
  116.         List list = userMapper.findUserByName("小明");  
  117.           
  118.         sqlSession.close();  
  119.           
  120.         System.out.println(list);  
  121.           
  122.           
  123.     }  
  124.       
  125.     @Test  
  126.     public void testFindUserByIdResultMap() throws Exception {  
  127.           
  128.         SqlSession sqlSession = sqlSessionFactory.openSession();  
  129.           
  130.         //创建UserMapper对象,mybatis自动生成mapper代理对象  
  131.         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  
  132.           
  133.         //调用userMapper的方法  
  134.           
  135.         User user = userMapper.findUserByIdResultMap(1);  
  136.           
  137.         System.out.println(user);  
  138.           
  139.     }  
  140.   
  141. }  
package cn.com.mybatis.mapper;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
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 cn.com.czy.mybatis.pojo.User;

/*
*

  • 总结:
  • 1、mapper代理方式、理解mapper开发规范
  • 2、mapper文件是usermapper.xml
  • 3、了解动态sql、别名、sql代码片、
  • 4、了解 resultMap

*/
public class UserMapperTest {

private SqlSessionFactory sqlSessionFactory;

// 此方法是在执行testFindUserById之前执行
@Before
public void setUp() throws Exception {

	// mybatis配置文件
	String resource = "config/SqlMapConfig.xml";
	// 得到配置文件流
	InputStream inputStream = Resources.getResourceAsStream(resource);

	// 创建会话工厂,传入mybatis的配置文件信息
	sqlSessionFactory = new SqlSessionFactoryBuilder()
			.build(inputStream);
}

//用户信息的综合 查询
@Test
public void testFindUserList() throws Exception {
	
	SqlSession sqlSession = sqlSessionFactory.openSession();
	
	//创建UserMapper对象,mybatis自动生成mapper代理对象
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
	
	//创建包装对象,设置查询条件
	UserQueryVo userQueryVo = new UserQueryVo();
	UserCustom userCustom = new UserCustom();
	userCustom.setSex("1");
	userCustom.setUsername("郑游");
	userQueryVo.setUserCustom(userCustom);
	
	//调用userMapper的方法
	List<UserCustom> list = userMapper.findUserList(userQueryVo);
	
	System.out.println(list);
}



@Test
public void testFindUserCount() throws Exception {
	
	SqlSession sqlSession = sqlSessionFactory.openSession();
	
	//创建UserMapper对象,mybatis自动生成mapper代理对象
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
	
	//创建包装对象,设置查询条件
	UserQueryVo userQueryVo = new UserQueryVo();
	UserCustom userCustom = new UserCustom();
	userCustom.setSex("1");
	userCustom.setUsername("郑游");
	userQueryVo.setUserCustom(userCustom);
	//调用userMapper的方法
	int count = userMapper.findUserCount(userQueryVo);
	
	System.out.println(count);
}



@Test
public void testFindUserById() throws Exception {
	
	SqlSession sqlSession = sqlSessionFactory.openSession();
	
	//创建UserMapper对象,mybatis自动生成mapper代理对象
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
	
	//调用userMapper的方法
	
	User user = userMapper.findUserById(1);
	
	System.out.println(user);
	
	
}


@Test
public void testFindUserByName() throws Exception {
	
	SqlSession sqlSession = sqlSessionFactory.openSession();
	
	//创建UserMapper对象,mybatis自动生成mapper代理对象
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
	
	//调用userMapper的方法
	
	List<User> list = userMapper.findUserByName("小明");
	
	sqlSession.close();
	
	System.out.println(list);
	
	
}

@Test
public void testFindUserByIdResultMap() throws Exception {
	
	SqlSession sqlSession = sqlSessionFactory.openSession();
	
	//创建UserMapper对象,mybatis自动生成mapper代理对象
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
	
	//调用userMapper的方法
	
	User user = userMapper.findUserByIdResultMap(1);
	
	System.out.println(user);
	
}

}


推荐教程

     Maven官方中文教程

     Mybatis的mapper.xml文件详解

     SSM框架教程






阅读全文

你可能感兴趣的:(数据处理,mybatis)