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框架教程

最新文章

  1. ASP.NET MVC Model验证(一)
  2. spring源码分析之cache demo
  3. Linux下redis的安装
  4. VoLTE 注册流程
  5. Javascript写俄罗斯方块游戏
  6. Jena Fuseki 102
  7. SCU 4424(求子集排列数)
  8. Redis适用于高并发的递增、递减功能
  9. IIS浏览提示无法显示网页的解决方法
  10. java版AC自动机
  11. java日期时间处理小结
  12. linux android ndk
  13. session校验是否登录
  14. BZOJ_1060_时态同步_树形DP
  15. 【原创】运维基础之Redis(1)简介、安装、使用
  16. john and hydra using de-ice1.100
  17. SQL易错总结1
  18. [转]C++中const、volatile、mutable的用法
  19. 【指导】SonarQube 部署说明
  20. Tomcat的配置文件Server.xml解析

热门文章

  1. DBeaver笔记-快捷键篇
  2. Snail—Hibernate各种异常
  3. hdu 1506 Largest Rectangle in a Histogram ((dp求最大子矩阵))
  4. 20、RTC驱动程序
  5. Mybatis全面详解——上(学习总结)
  6. 《编程导论(Java)&amp;#183;4.1数据抽象的含义》
  7. android 应用内部获取本应用或者相应包名的应用的SHA1签名的办法
  8. php 下载服务器上存在的文件 到本地
  9. 魔兽争霸war3心得体会(三):UD内战
  10. JS实现页面table鼠标移动改变tr行颜色,单击tr选中复选框功能