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文件

  1. <span style="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=密码</span>

1.1.1SQL语句、数据表

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

插入数据:

  1. /*
  2. SQLyog v10.2
  3. MySQL - 5.1.72-community : Database - mybatis
  4. *********************************************************************
  5. */
  6. /*Data for the table `items` */
  7. 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');
  8. /*Data for the table `orderdetail` */
  9. 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);
  10. /*Data for the table `orders` */
  11. 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);
  12. /*Data for the table `user` */
  13. 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文件

  1. <project xmlns="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. <modelVersion>4.0.0</modelVersion>
  4. <groupId>web-test-com</groupId>
  5. <artifactId>MyBatis</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>war</packaging>
  8. <dependencies>
  9. <dependency>
  10. <groupId>junit</groupId>
  11. <artifactId>junit</artifactId>
  12. <version>4.12</version>
  13. <scope>provided</scope>
  14. </dependency>
  15. <dependency>
  16. <groupId>log4j</groupId>
  17. <artifactId>log4j</artifactId>
  18. <version>1.2.17</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.mybatis</groupId>
  22. <artifactId>mybatis</artifactId>
  23. <version>3.1.1</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>mysql</groupId>
  27. <artifactId>mysql-connector-java</artifactId>
  28. <version>5.1.38</version>
  29. </dependency>
  30. </dependencies>
  31. </project>

1.3、SqlMappingConfig.xml文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!-- 加载属性文件 -->
  7. <properties resource="db.properties">
  8. <!--properties中还可以配置一些属性名和属性值 -->
  9. <!-- <property name="jdbc.driver" value=""/> -->
  10. </properties>
  11. <!-- 全局配置参数,需要时再设置 -->
  12. <!-- <settings> </settings> -->
  13. <typeAliases>
  14. <!-- 别名定义 -->
  15. <!-- 针对单个别名定义 type:类型的路径 alias:别名 -->
  16. <!-- <typeAlias type="cn.czy.mybatis.po.User" alias="user"/> -->
  17. <typeAlias type="cn.com.czy.mybatis.pojo.User" alias="user" />
  18. <!-- 批量别名定义 指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以) -->
  19. <package name="cn.com.mybatis.mapper" />
  20. </typeAliases>
  21. <!-- 和spring整合后 environments配置将废除 -->
  22. <environments default="development">
  23. <environment id="development">
  24. <!-- 使用jdbc事务管理,事务控制由mybatis -->
  25. <transactionManager type="JDBC" />
  26. <!-- 数据库连接池,由mybatis管理 -->
  27. <dataSource type="POOLED">
  28. <property name="driver" value="${jdbc.driver}" />
  29. <property name="url" value="${jdbc.url}" />
  30. <property name="username" value="${jdbc.username}" />
  31. <property name="password" value="${jdbc.password}" />
  32. </dataSource>
  33. </environment>
  34. </environments>
  35. <!-- 加载 映射文件 -->
  36. <mappers>
  37. <!--通过resource方法一次加载一个映射文件 -->
  38. <!--注意这里的路径和xml文件 -->
  39. <mapper resource="sqlMapper/user.xml" />
  40. <mapper resource="sqlMapper/userMapper.xml" />
  41. <mapper resource="sqlMapper/OrdersMapperCustom.xml"/>
  42. <!-- 批量加载mapper 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载 -->
  43. <!-- 遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 -->
  44. <!-- 中 上边规范的前提是:使用的是mapper代理方法
  45. <package name="cn.com.czy.mybatis.two.mapper" />-->
  46. </mappers>
  47. </configuration>

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

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="test">
  6. <!-- 在 映射文件中配置很多sql语句 -->
  7. <!-- 将sql语句封装到mappedStatement对象中,所以将id称为statement的id -->
  8. <!-- parameterType:指定输入 参数的类型,这里指定int型 #{}表示一个占位符号 -->
  9. <!-- #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 -->
  10. <!-- 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称 -->
  11. <!-- resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。 -->
  12. <select id="findUserById" parameterType="int"  resultType="user">
  13. SELECT * FROM USER WHERE id=#{value}
  14. </select>
  15. </mapper>

1.5、测试类

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

1.6、selectOne和selectList的解释

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

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

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

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

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

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

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

2.3、环境搭建

pom.xml文件

  1. <span style="font-size:18px;"><project xmlns="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. <modelVersion>4.0.0</modelVersion>
  4. <groupId>web-test-com</groupId>
  5. <artifactId>MyBatis</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>war</packaging>
  8. <dependencies>
  9. <dependency>
  10. <groupId>junit</groupId>
  11. <artifactId>junit</artifactId>
  12. <version>4.12</version>
  13. <scope>provided</scope>
  14. </dependency>
  15. <dependency>
  16. <groupId>log4j</groupId>
  17. <artifactId>log4j</artifactId>
  18. <version>1.2.17</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.mybatis</groupId>
  22. <artifactId>mybatis</artifactId>
  23. <version>3.1.1</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>mysql</groupId>
  27. <artifactId>mysql-connector-java</artifactId>
  28. <version>5.1.38</version>
  29. </dependency>
  30. </dependencies>
  31. </project>
  32. </span>

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

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!-- 加载属性文件 -->
  7. <properties resource="db.properties">
  8. <!--properties中还可以配置一些属性名和属性值 -->
  9. <!-- <property name="jdbc.driver" value=""/> -->
  10. </properties>
  11. <!-- 全局配置参数,需要时再设置 -->
  12. <!-- <settings> </settings> -->
  13. <typeAliases>
  14. <!-- 别名定义 -->
  15. <!-- 针对单个别名定义 type:类型的路径 alias:别名 -->
  16. <!-- <typeAlias type="cn.czy.mybatis.po.User" alias="user"/> -->
  17. <typeAlias type="cn.com.czy.mybatis.pojo.User" alias="user" />
  18. <!-- 批量别名定义 指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以) -->
  19. <package name="cn.com.mybatis.mapper" />
  20. </typeAliases>
  21. <!-- 和spring整合后 environments配置将废除 -->
  22. <environments default="development">
  23. <environment id="development">
  24. <!-- 使用jdbc事务管理,事务控制由mybatis -->
  25. <transactionManager type="JDBC" />
  26. <!-- 数据库连接池,由mybatis管理 -->
  27. <dataSource type="POOLED">
  28. <property name="driver" value="${jdbc.driver}" />
  29. <property name="url" value="${jdbc.url}" />
  30. <property name="username" value="${jdbc.username}" />
  31. <property name="password" value="${jdbc.password}" />
  32. </dataSource>
  33. </environment>
  34. </environments>
  35. <!-- 加载 映射文件 -->
  36. <mappers>
  37. <!--通过resource方法一次加载一个映射文件 -->
  38. <mapper resource="sqlMapper/user.xml" />
  39. <mapper resource="sqlMapper/userMapper.xml" />
  40. <mapper resource="sqlMapper/OrdersMapperCustom.xml"/>
  41. <!-- 批量加载mapper 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载 -->
  42. <!-- 遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 -->
  43. <!-- 中 上边规范的前提是:使用的是mapper代理方法
  44. <package name="cn.com.czy.mybatis.two.mapper" />-->
  45. </mappers>
  46. </configuration>

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

  1. <span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离  -->
  6. <!-- 注意:使用mapper代理方法开发,namespace有特殊重要的作用 -->
  7. <mapper namespace="test">
  8. <!-- 在 映射文件中配置很多sql语句 -->
  9. <!-- 将sql语句封装到mappedStatement对象中,所以将id称为statement的id -->
  10. <!-- parameterType:指定输入 参数的类型,这里指定int型 #{}表示一个占位符号 -->
  11. <!-- #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 -->
  12. <!-- 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称 -->
  13. <!-- resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。 -->
  14. <select id="findUserById" parameterType="int"
  15. resultType="user">
  16. <!-- 需求:通过select执行id查询用户表的记录 -->
  17. SELECT * FROM USER WHERE id=#{value}
  18. </select>
  19. <!-- resultType:指定就是单条记录所映射的java对象类型  -->
  20. <!-- ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。 使用${}拼接sql,引起 sql注入  -->
  21. <!-- ${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value -->
  22. <!-- 这个mapper文件user对象已经用别名代替 -->
  23. <select id="findUserByName" parameterType="java.lang.String"
  24. resultType="user">
  25. <!-- 根据用户名称模糊查询用户信息,可能返回多条  -->
  26. SELECT * FROM USER WHERE username LIKE '%${value}%'
  27. </select>
  28. <!-- parameterType:指定输入 参数类型是pojo(包括 用户信息)-->
  29. <!-- #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值 -->
  30. <insert id="insertUser" parameterType="user">
  31. <!-- SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用与自增主键 -->
  32. <!-- keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性 -->
  33. <!-- order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序 -->
  34. <!-- resultType:指定SELECT LAST_INSERT_ID()的结果类型 -->
  35. <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
  36. <!-- 将插入数据的主键返回,返回到user对象中 -->
  37. SELECT LAST_INSERT_ID()
  38. </selectKey>
  39. insert into user(username,birthday,sex,address)
  40. value(#{username},#{birthday},#{sex},#{address})
  41. <!-- 使用mysql的uuid()生成主键 执行过程: -->
  42. <!-- 首先通过uuid()得到主键,将主键设置到user对象的id属性中 其次在insert执行时,从user对象中取出id属性值 -->
  43. <!-- <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> -->
  44. <!-- SELECT uuid() </selectKey> insert into user(id,username,birthday,sex,address) -->
  45. <!-- value(#{id},#{username},#{birthday},#{sex},#{address}) -->
  46. </insert>
  47. <delete id="deleteUser" parameterType="java.lang.Integer">
  48. <!-- 删除 用户 根据id删除用户,需要输入 id值 -->
  49. delete from user where
  50. id=#{id}
  51. </delete>
  52. <!-- 需要传入用户的更新信息 parameterType指定user对象,包括 id和更新信息, -->
  53. <!-- 注意:id必须存在 -->
  54. <!-- #{id}:从输入 user对象中获取id属性值 -->
  55. <update id="updateUser" parameterType="user">
  56. <!-- 根据id更新用户 分析: 需要传入用户的id -->
  57. update user set
  58. username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
  59. where id=#{id}
  60. </update>
  61. </mapper>
  62. </span>

2.6、pojo类

  1. <span style="font-size:18px;">package cn.com.czy.mybatis.pojo;
  2. import java.util.Date;
  3. /**
  4. *
  5. * <p>Title: User</p>
  6. * <p>Description:用户pojo </p>
  7. */
  8. public class User {
  9. //属性名和数据库表的字段对应
  10. private int id;
  11. private String username;    // 用户姓名
  12. private String sex;     // 性别
  13. private Date birthday;      // 生日
  14. private String address;     // 地址
  15. public int getId() {
  16. return id;
  17. }
  18. public void setId(int id) {
  19. this.id = id;
  20. }
  21. public String getUsername() {
  22. return username;
  23. }
  24. public void setUsername(String username) {
  25. this.username = username;
  26. }
  27. public String getSex() {
  28. return sex;
  29. }
  30. public void setSex(String sex) {
  31. this.sex = sex;
  32. }
  33. public Date getBirthday() {
  34. return birthday;
  35. }
  36. public void setBirthday(Date birthday) {
  37. this.birthday = birthday;
  38. }
  39. public String getAddress() {
  40. return address;
  41. }
  42. public void setAddress(String address) {
  43. this.address = address;
  44. }
  45. @Override
  46. public String toString() {
  47. return "User [id=" + id + ", username=" + username + ", sex=" + sex
  48. + ", birthday=" + birthday + ", address=" + address + "]";
  49. }
  50. }
  51. </span>

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

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

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

1、pom.xml文件一样

2、SqlMappingConfig.xml一样

3、开发规范:编写

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

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

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <!-- mapper代理开发规范 -->
  6. <!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 -->
  7. <!-- 注意:使用mapper代理方法开发,namespace有特殊重要的作用,namespace等于mapper接口地址 -->
  8. <mapper namespace="cn.com.mybatis.mapper.UserMapper">
  9. <!-- 定义sql片段 -->
  10. <!-- id:sql片段的唯 一标识 -->
  11. <!-- 经验:是基于单表来定义sql片段,这样话这个sql片段可重用性才高 在sql片段中不要包括 where -->
  12. <sql id="query_user_where">
  13. <if test="userCustom!=null">
  14. <if test="userCustom.sex!=null and userCustom.sex!=''">
  15. and user.sex = #{userCustom.sex}
  16. </if>
  17. <if test="userCustom.username!=null and userCustom.username!=''">
  18. and user.username LIKE '%${userCustom.username}%'
  19. </if>
  20. </if>
  21. </sql>
  22. <!-- 已经指定好别名! -->
  23. <!-- 运用sql片段   -->
  24. <!-- 用户信息综合查询 #{userCustom.sex}:取出pojo包装对象中性别值  -->
  25. <!-- ${userCustom.username}:取出pojo包装对象中用户名称 -->
  26. <select id="findUserList" parameterType="UserQueryVo"
  27. resultType="UserCustom">
  28. SELECT * FROM USER
  29. <!-- where可以自动去掉条件中的第一个and -->
  30. <where>
  31. <!-- 引用sql片段 的id,如果refid指定的id不在本mapper文件中,需要前边加namespace -->
  32. <include refid="query_user_where"></include>
  33. <!-- 在这里还要引用其它的sql片段 -->
  34. </where>
  35. </select>
  36. <!-- 用户信息综合查询总数 parameterType:指定输入类型和findUserList一样 resultType:输出结果类型 -->
  37. <select id="findUserCount" parameterType="UserQueryVo"
  38. resultType="int">
  39. SELECT count(*) FROM USER
  40. <!-- where可以自动去掉条件中的第一个and -->
  41. <where>
  42. <!-- 引用sql片段 的id,如果refid指定的id不在本mapper文件中,需要前边加namespace -->
  43. <include refid="query_user_where"></include>
  44. <!-- 在这里还要引用其它的sql片段 -->
  45. </where>
  46. </select>
  47. <!-- 在 映射文件中配置很多sql语句 -->
  48. <!-- 需求:通过id查询用户表的记录 -->
  49. <!-- 通过 select执行数据库查询 -->
  50. <!-- id:标识 映射文件中的 sql -->
  51. <!-- 将sql语句封装到mappedStatement对象中,所以将id称为statement的id -->
  52. <!-- parameterType:指定输入 参数的类型,这里指定int型 -->
  53. <!-- #{}表示一个占位符号 -->
  54. <!-- #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称 -->
  55. <!-- resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。 -->
  56. <!-- mapper开发代理规范2:UserMapper 接口中的接口方法名跟id名一样 -->
  57. <!-- mapper开发代理规范3:UserMapper 接口中的返回类型名跟resultType类型一样 -->
  58. <!-- mapper开发代理规范 4:UserMapper 接口中的参数类型名跟parameterType类型一样 -->
  59. <select id="findUserById" parameterType="int" resultType="user">
  60. SELECT * FROM USER WHERE id=#{value}
  61. </select>
  62. <!-- 根据用户名称模糊查询用户信息,可能返回多条 resultType:指定就是单条记录所映射的java对象 类型 ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。
  63. 使用${}拼接sql,引起 sql注入 ${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value -->
  64. <select id="findUserByName" parameterType="java.lang.String"
  65. resultType="user">
  66. SELECT * FROM USER WHERE username LIKE '%${value}%'
  67. </select>
  68. <!-- 定义resultMap -->
  69. <!-- 将SELECT id id_,username username_ FROM USER 和User类中的属性作一个映射关系 -->
  70. <!-- type:resultMap最终映射的java对象类型,可以使用别名 -->
  71. <!-- id:对resultMap的唯一标识 -->
  72. <resultMap type="user" id="userResultMap">
  73. <!--id表示查询结果集中唯一标识 -->
  74. <!--column:查询出来的列名 -->
  75. <!--property:type指定的pojo类型中的属性名 最终resultMap对column和property作一个映射关系 (对应关系) -->
  76. <id column="id_" property="id" />
  77. <!--result:对普通名映射定义 -->
  78. <!--column:查询出来的列名 -->
  79. <!--property:type指定的pojo类型中的属性名 最终resultMap对column和property作一个映射关系 (对应关系) -->
  80. <result column="username_" property="username" />
  81. </resultMap>
  82. <!-- 使用resultMap进行输出映射 -->
  83. <!--resultMap:指定定义的resultMap的id,如果这个resultMap在其它的mapper文件,前边需要加namespace -->
  84. <select id="findUserByIdResultMap" parameterType="int"
  85. resultMap="userResultMap">
  86. SELECT id id_,username username_ FROM USER WHERE id=#{value}
  87. </select>
  88. </mapper>

3.3、UserMapping.java类

  1. package cn.com.mybatis.mapper;
  2. import java.util.List;
  3. import cn.com.czy.mybatis.pojo.User;
  4. /**
  5. * 总结:
  6. * 1、mapper代理方式、理解mapper开发规范
  7. * 2、mapper文件是usermapper.xml
  8. * 3、了解动态sql、别名、sql代码片、
  9. * 4、了解  resultMap
  10. *
  11. * <p>
  12. * Title: UserMapper
  13. * </p>
  14. * <p>
  15. * Description: mapper接口,相当 于dao接口,用户管理
  16. * </p>
  17. */
  18. public interface UserMapper {
  19. // 根据id查询用户信息
  20. public User findUserById(int id) throws Exception;
  21. // 根据用户名列查询用户列表
  22. public List<User> findUserByName(String name) throws Exception;
  23. // 根据id查询用户信息,使用resultMap输出
  24. public User findUserByIdResultMap(int id) throws Exception;
  25. // 用户信息综合查询
  26. public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
  27. // 用户信息综合查询总数
  28. public int findUserCount(UserQueryVo userQueryVo) throws Exception;
  29. // 插入用户
  30. public void insertUser(User user) throws Exception;
  31. // 删除用户
  32. public void deleteUser(int id) throws Exception;
  33. }

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

UserMapping的子类

  1. package cn.com.mybatis.mapper;
  2. import cn.com.czy.mybatis.pojo.User;
  3. /**
  4. * 总结:
  5. * 1、mapper代理方式、理解mapper开发规范
  6. * 2、mapper文件是usermapper.xml
  7. * 3、了解动态sql、别名、sql代码片、
  8. * 4、了解  resultMap
  9. *
  10. * <p>Title: UserCustom</p>
  11. * <p>Description: 用户的扩展类</p>
  12. */
  13. public class UserCustom extends User{
  14. //可以扩展用户的信息
  15. }

UserMapping的包装类

  1. package cn.com.mybatis.mapper;
  2. /**
  3. * 总结:
  4. * 1、mapper代理方式、理解mapper开发规范
  5. * 2、mapper文件是usermapper.xml
  6. * 3、了解动态sql、别名、sql代码片、
  7. * 4、了解  resultMap
  8. *
  9. * <p>Title: UserQueryVo</p>
  10. * <p>Description:包装类型 </p>
  11. */
  12. public class UserQueryVo {
  13. //在这里包装所需要的查询条件
  14. //用户查询条件
  15. private UserCustom userCustom;
  16. public UserCustom getUserCustom() {
  17. return userCustom;
  18. }
  19. public void setUserCustom(UserCustom userCustom) {
  20. this.userCustom = userCustom;
  21. }
  22. //可以包装其它的查询条件,订单、商品
  23. //....
  24. }

3.5测试类

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

推荐教程

Maven官方中文教程

Mybatis的mapper.xml文件详解

SSM框架教程

Mybatis 入门到理解篇的更多相关文章

  1. Mybatis入门看这一篇就够了

    什么是MyBatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...

  2. Mybatis入门篇之结果映射,你射准了吗?

    目录 前言 什么是结果映射? 如何映射? 别名映射 驼峰映射 配置文件开启驼峰映射 配置类中开启驼峰映射 resultMap映射 总结 高级结果映射 关联(association) 例子 关联的嵌套 ...

  3. mybatis入门基础(二)----原始dao的开发和mapper代理开发

    承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重复代码,看起来不是很清楚,但第一次那样写,是为了解mybatis的执行步骤,先 ...

  4. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十五)阶段总结

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 一 每个阶段在结尾时都会有一个阶段总结,在<SSM整合基础篇& ...

  5. 写给新手看的 MyBatis 入门

    目录 MyBatis 使用前的准备 什么是 MyBatis 使用Maven 进行 MyBatis 开发环境搭建 MyBatis 入门 项目整体结构一览 MyBatis 的简单生命周期 1.获取 Sql ...

  6. Mybatis入门案例中设计模式的简单分析

    Talk is cheap, show me the code! public class TestMybatis { public static void main(String[] args) t ...

  7. Python 正则表达式入门(中级篇)

    Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...

  8. Python 正则表达式入门(初级篇)

    Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...

  9. MyBatis入门基础(一)

    一:对原生态JDBC问题的总结 新项目要使用mybatis作为持久层框架,由于本人之前一直使用的Hibernate,对mybatis的用法实在欠缺,最近几天计划把mybatis学习一哈,特将学习笔记记 ...

随机推荐

  1. [AngularFire 2] Push, remove, update

    import { Injectable } from '@angular/core'; import {RealtimeService} from "../shared"; imp ...

  2. Windows跨进程设置文本和发送消息

    进程内设置文本,可以调用SetWindowText,跨进程这个会无效,应当如下:::SendMessage(hWnd, WM_SETTEXT, NULL, (LPARAM)文本内容); 注意这里不能使 ...

  3. 【rlz03】十六进制转十进制

    Time Limit: 3 second Memory Limit: 2 MB 问题描述 输入一个十六进制数,编程转换为十进制数. 整数部分不会超过65535,十六进制的小数部分不会超过2位. Sam ...

  4. 如何在 Linux 中统计一个进程的线程数

    编译自:http://ask.xmodulo.com/number-of-threads-process-linux.html作者: Dan Nanni原创:LCTT https://linux.cn ...

  5. POJ 1751 Highways (ZOJ 2048 ) MST

    http://poj.org/problem?id=1751 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2048 题目大 ...

  6. 使用Apache FtpServer搭建FTP服务器 [FlashFXP]

    <server xmlns="http://mina.apache.org/ftpserver/spring/v1" xmlns:xsi="http://www.w ...

  7. [React] Update Component State in React With Ramda Lenses

    In this lesson, we'll refactor a React component to use Ramda lenses to update our component state. ...

  8. php实现栈的压入、弹出序列(**)(算法步骤)(画图)

    php实现栈的压入.弹出序列(**)(算法步骤)(画图) 一.总结 1.算法步骤:一定要把算法步骤写下来,要不然太浪费时间了,尤其是思维不清晰的时候,尤其是题目有难度的时候,不然的话也非常容易出现低级 ...

  9. JavaScript 正則表達式

    一.简单介绍 1.什么是正則表達式 正則表達式本身就是一种语言,这在其他语言是通用的. 正則表達式(regular expression)描写叙述了一种字符串匹配的模式,能够用来检查一个串是否含有某种 ...

  10. Android的NDK开发(5)————Android JNI层实现文件的read、write与seek操作

    1. 在Android的Java层实现文件的读写操作是非常简单的,可以参看之前写的博文:http://blog.csdn.net/conowen/article/details/7296121 在JN ...