Mybatis映射文件简介
  1) MyBatis 的真正强大在于它的映射语句。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。
  2) SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):
    cache – 给定命名空间的缓存配置。
    cache-ref – 其他命名空间缓存配置的引用。
    resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
    sql – 可被其他语句引用的可重用语句块。
    insert – 映射插入语句
    update – 映射更新语句
    delete – 映射删除语句
    select – 映射查询语

例如:EmpMapper.java接口

  1. package com.atguigu.mapper;
  2.  
  3. import java.util.List;
  4.  
  5. import com.atguigu.bean.Emp;
  6.  
  7. public interface EmpMapper {
  8.  
  9. //根据eid查询一个员工信息
  10. Emp getEmpByEid(String eid);
  11. //获取所有的员工信息
  12. List<Emp> getAllEmp();
  13. //添加员工信息
  14. void addEmp(Emp emp);
  15. //修改员工信息
  16. void updateEmp(Emp emp);
  17. //删除员工信息
  18. Boolean deleteEmp(String eid);
  19.  
  20. }

EmpMapper

数据bean,注意在mybatis-config.xml中,typeAliases配置起别名,默认为类名称

  1. package com.atguigu.bean;
  2.  
  3. public class Emp {
  4.  
  5. private Integer eid;
  6.  
  7. private String ename;
  8.  
  9. private Integer age;
  10.  
  11. private String sex;
  12.  
  13. private Dept dept;
  14.  
  15. public Dept getDept() {
  16. return dept;
  17. }
  18.  
  19. public void setDept(Dept dept) {
  20. this.dept = dept;
  21. }
  22.  
  23. public Integer getEid() {
  24. return eid;
  25. }
  26.  
  27. public void setEid(Integer eid) {
  28. this.eid = eid;
  29. }
  30.  
  31. public String getEname() {
  32. return ename;
  33. }
  34.  
  35. public void setEname(String ename) {
  36. this.ename = ename;
  37. }
  38.  
  39. public Integer getAge() {
  40. return age;
  41. }
  42.  
  43. public void setAge(Integer age) {
  44. this.age = age;
  45. }
  46.  
  47. public String getSex() {
  48. return sex;
  49. }
  50.  
  51. public void setSex(String sex) {
  52. this.sex = sex;
  53. }
  54.  
  55. @Override
  56. public String toString() {
  57. return "Emp [eid=" + eid + ", ename=" + ename + ", age=" + age + ", sex=" + sex + ", dept=" + dept + "]";
  58. }
  59.  
  60. public Emp(Integer eid, String ename, Integer age, String sex) {
  61. super();
  62. this.eid = eid;
  63. this.ename = ename;
  64. this.age = age;
  65. this.sex = sex;
  66. }
  67.  
  68. public Emp() {
  69. super();
  70. // TODO Auto-generated constructor stub
  71. }
  72.  
  73. }

Emp

映射文件EmpMapper.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.  
  6. <mapper namespace="com.atguigu.mapper.EmpMapper">
  7.  
  8. <!-- Emp getEmpByEid(String eid); -->
  9. <select id="getEmpByEid" resultType="Emp">
  10. select eid,ename,age,sex from emp where eid = #{eid}
  11. </select>
  12.  
  13. <!-- List<Emp> getAllEmp(); -->
  14. <select id="getAllEmp" resultType="Emp">
  15. select eid,ename,age,sex from emp
  16. </select>
  17.  
  18. <!-- void addEmp(Emp emp); -->
  19. <insert id="addEmp">
  20. insert into emp values(null,#{ename},#{age},#{sex})
  21. </insert>
  22.  
  23. <!-- void updateEmp(Emp emp); -->
  24. <update id="updateEmp">
  25. update emp set ename = #{ename}, age = #{age}, sex = #{sex} where eid = #{eid}
  26. </update>
  27.  
  28. <!-- void deleteEmp(String eid); -->
  29. <delete id="deleteEmp">
  30. delete from emp where eid = #{eid}
  31. </delete>
  32.  
  33. </mapper>

同时需要记得在mybatis-config.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.  
  6. <configuration>
  7.  
  8. <!--
  9. <properties>:设置或引入资源文件
  10. resource:在类路径下访问资源文件
  11. url:在网络路径或磁盘路径下访问资源文件
  12. -->
  13. <properties resource="jdbc.properties"></properties>
  14.  
  15. <settings>
  16. <!-- 将下划线映射成驼峰,user_name映射为userName -->
  17. <setting name="mapUnderscoreToCamelCase" value="true"/>
  18. <!-- 开启延迟加载 -->
  19. <setting name="lazyLoadingEnabled" value="true"/>
  20. <!-- 是否查询所有数据 -->
  21. <setting name="aggressiveLazyLoading" value="false"/>
  22. </settings>
  23.  
  24. <typeAliases>
  25. <!--
  26. 为类型设置类型别名
  27. type:Java 类型,若只设置type,默认的别名就是类型,且不区分大小写
  28. -->
  29. <!-- <typeAlias type="com.atguigu.bean.User" alias="u"/> -->
  30. <package name="com.atguigu.bean"/>
  31. </typeAliases>
  32.  
  33. <!--
  34. <environments>:设置连接数据库的环境
  35. default:设置默认使用的数据库环境
  36. -->
  37. <environments default="mysql">
  38. <!--
  39. <environment>:设置某个具体的数据库的环境
  40. id:数据库环境的唯一标示
  41. -->
  42. <environment id="mysql">
  43. <!-- type="JDBC|MANAGED",JDBC:使用JDBC原生的事务管理方式,即提交和回滚都需要手动处理 -->
  44. <transactionManager type="JDBC" />
  45. <!-- type="POOLED|UNPOOLED|JNDI" -->
  46. <dataSource type="POOLED">
  47. <property name="driver" value="${jdbc.driver}" />
  48. <property name="url" value="${jdbc.url}" />
  49. <property name="username" value="${jdbc.username}" />
  50. <property name="password" value="${jdbc.password}" />
  51. </dataSource>
  52. </environment>
  53.  
  54. <environment id="oracle">
  55. <transactionManager type="JDBC" />
  56. <dataSource type="POOLED">
  57. <property name="driver" value="com.mysql.jdbc.Driver" />
  58. <property name="url" value="jdbc:mysql://localhost:3306/ssm" />
  59. <property name="username" value="root" />
  60. <property name="password" value="123456" />
  61. </dataSource>
  62. </environment>
  63. </environments>
  64. <!-- 引入映射文件 -->
  65. <mappers>
  66. <!-- <mapper resource="EmpMapper.xml" />
  67. <mapper resource="DeptMapper.xml" /> -->
  68. <!-- 此种写法要求mapper接口和mapper映射文件必须在同一个包下,可以设置相同的包名 -->
  69. <package name="com.atguigu.mapper"/>
  70. </mappers>
  71. </configuration>

创建测试类TestCRUD

  1. package com.atguigu.test;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.util.List;
  6.  
  7. import org.apache.ibatis.io.Resources;
  8. import org.apache.ibatis.session.SqlSession;
  9. import org.apache.ibatis.session.SqlSessionFactory;
  10. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  11. import org.junit.Test;
  12.  
  13. import com.atguigu.bean.Emp;
  14. import com.atguigu.mapper.EmpMapper;
  15.  
  16. public class TestCRUD {
  17.  
  18. @Test
  19. public void testCRUD() throws IOException {
  20. InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
  21. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
  22. //SqlSession sqlSession = sqlSessionFactory.openSession();//需要手动处理事务
  23. SqlSession sqlSession = sqlSessionFactory.openSession(true);//自动处理事务
  24. EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
  25. //测试:根据eid获取员工信息
  26. /*Emp emp = empMapper.getEmpByEid("3");
  27. System.out.println(emp);*/
  28. //测试:获取所有的员工信息
  29. /*List<Emp> list = empMapper.getAllEmp();
  30. System.out.println(list);*/
  31. //测试:添加员工信息
  32. /*empMapper.addEmp(new Emp(null, "admin", 23, "女"));
  33. sqlSession.commit();//提交事务*/
  34. //测试:修改员工信息
  35. empMapper.updateEmp(new Emp(6, "张二", 33, "女"));
  36. //测试:删除员工信息
  37. /*Boolean i = empMapper.deleteEmp("2");
  38. System.out.println("result:"+i);*/
  39. //select 字段名 from 表名 where 条件 group by 字段名 having 条件 order by 字段名 desc/asc limit index,pageSize
  40. }
  41.  
  42. }

需要注意的问题:

  ①关于事务管理

  SqlSession sqlSession = sqlSessionFactory.openSession();//这种方法创建下需要手动处理事务

  <!-- type="JDBC|MANAGED",JDBC:使用JDBC原生的事务管理方式,即提交和回滚都需要手动处理 -->
              <transactionManager type="JDBC" />

  而下面这种创建就会自动提交

  SqlSession sqlSession = sqlSessionFactory.openSession(true);//自动处理事务

  对于返回值

  增删改:可以在接口中直接指明返回值类型:Interger(返回修改作用的行数),Boolean(是否发生修改)

  :直接写相应的查询返回类型即可。

    例如:查询单个员工对象:Emp getEmpByEid(String eid);

        查询多个员工对象:List<Emp> getAllEmp();

       但是resultType 都是Emp对象类型,mybatis会很智能的对返回结果进行处理,只需要指明正确的查询返回类型。

  ③关于映射文件的配置

  当通过包的方式引入映射文件时,但要求mapper接口和mapper映射文件必须在同一个包下,可以设置相同的包名

  1. <mappers>
  2. <!-- <mapper resource="EmpMapper.xml" />
  3. <mapper resource="DeptMapper.xml" /> -->
  4. <!-- 此种写法要求mapper接口和mapper映射文件必须在同一个包下,可以设置相同的包名 -->
  5. <package name="com.atguigu.mapper"/>
  6. </mappers>

    ④SQL语句中获取参数的两种方式

    1) #{key}:获取参数的值,预编译到SQL中。安全。相当于PrepareStatement,利用通配符.
    2) ${key}:获取参数的值,拼接到SQL中。有SQL注入问题。相当于Statement,涉及到字符串的拼接,字符串部分一定要注意单引号问题。select eid,ename,age,sex from emp where eid = ${eid} and ename = '${ename}'

      3) 建议:大部分情况下使用 #{},在特殊情况下:①批量删除;②模糊查询,需要使用 ${}

MyBatis 映射文件的更多相关文章

  1. Mybatis映射文件完整模板参照

    Mybatis映射文件完整模板参照 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE map ...

  2. Mybatis映射文件中#取值时指定参数相关规则

    Mybatis映射文件中#取值时指定参数相关规则 在#{}中,除了需要的数值外,还可以规定参数的一些其他规则. 例如:javaType,jdbcType,mode(存储过程),numericScale ...

  3. SSM实战——秒杀系统之DAO层实体定义、接口设计、mybatis映射文件编写、整合Spring与Mybatis

    一:DAO实体编码 1:首先,在src目录下,新建org.myseckill.entity包,用于存放实体类: 2:实体类设计 根据前面创建的数据库表以及映射关系,创建实体类. 表一:秒杀商品表 对应 ...

  4. MyBatis 映射文件详解

    1. MyBatis 映射文件之<select>标签 <select>用来定义查询操作; "id": 唯一标识符,需要和接口中的方法名一致; paramet ...

  5. MyBatis映射文件中用#和$传递参数的特点

    在MyBatis映射文件中用#和$传递参数的特点, #是以占位符的形式来传递对应变量的参数值的,框架会对传入的参数做预编译的动作, 用$时会将传入的变量的参数值原样的传递过去,并且用$传递传递参数的时 ...

  6. MyBatis映射文件 相关操作

    一.MyBatis映射文件 1.简介 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行 ...

  7. Mybatis映射文件标签(关于sql)

    Mybatis映射文件 1.接口的全限定名和映射文件的namespace一致 <mapper namespace="com.offcn.dao.UserDao"> 2. ...

  8. Mybatis映射文件

    Mapper XML 文件 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会 ...

  9. MyBatis映射文件的resultMap如何做表关联

    MyBatis的核心是其映射文件,SqlMap文件,里面配置了项目中用到了什么SQL语句,和数据库相关的逻辑都在这个映射文件里.顾名思义,映射文件就是对Java对象和SQL的映射.这里简单介绍一下映射 ...

随机推荐

  1. Azure DevOps (十一) 通过Azure Devops部署一个.NET Core WebAPI

    前几篇文章中,我们讨论了如何通过流水线实现项目的编译.上传.打包.部署等操作,今天我们来实现一套完整的流程,把之前碎片化的知识点给串起来. 本次我们使用一个ASP.NET Core的WebApi项目来 ...

  2. HashMap和Hashtable以及ConcurrentHashMap的区别

    ​ HashMap和Hashtable的区别 何为HashMap HashMap是在JDK1.2中引入的Map的实现类. HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部 ...

  3. ThreadLocal的原理及产生的问题

    点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. ThreadLocal的原理 特点 ThreadLocal和Sychro ...

  4. Excel文件读写操作1(xls)

    一.Python-Excel常用的库:xlrd(read).xlwt(write).xlutils.openpyxl 1.xlrd  读取Excel文件,支持 .xls 和 .xlsx 格式. 2.x ...

  5. Nacos在企业生产中如何使用集群环境?

    点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 nacos,即可免费获取源码 前言 由于在公司,注册中心和配置中心都是 ...

  6. Linux内存、Swap、Cache、Buffer详细解析

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 1. 通过free命令看Linux内存 total:总内存大小. used:已经使用的内存大小 ...

  7. CIAGAN: Conditional Identity Anonymization Generative Adversarial Networks阅读笔记

    CIAGAN: Conditional Identity Anonymization Generative Adversarial Networks 2020 CVPR 2005.09544.pdf ...

  8. python字符编码与文件操作

    目录 字符编码 字符编码是什么 字符编码的发展史 字符编码实际应用 编码与解码 乱码问题 python解释器层面 文件操作 文件操作简介 文件的内置方法 文件的读写模式 文件的操作模式 作业 答案 第 ...

  9. 基础篇:java GC 总结,建议收藏

    垃圾标记算法 垃圾回收算法 major gc.mini gc.full gc.mixed gc 又是什么,怎么触发的 垃圾回收器的介绍 Safe Point 和 Safe Region 什么是 TLA ...

  10. CF1682D Circular Spanning Tree

    题意: 构造题,节点1~n顺时针排列成圆形,告诉你每个点度数奇偶性,让你构造一棵树,树边不相交. 思路: 因为每条边给总度数贡献2,因此如果度数为1的点有奇数个,直接输出no.显然0个度数为1的,也输 ...