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

例如:EmpMapper.java接口

package com.atguigu.mapper;

import java.util.List;

import com.atguigu.bean.Emp;

public interface EmpMapper {

    //根据eid查询一个员工信息
Emp getEmpByEid(String eid);
//获取所有的员工信息
List<Emp> getAllEmp();
//添加员工信息
void addEmp(Emp emp);
//修改员工信息
void updateEmp(Emp emp);
//删除员工信息
Boolean deleteEmp(String eid); }

EmpMapper

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

package com.atguigu.bean;

public class Emp {

    private Integer eid;

    private String ename;

    private Integer age;

    private String sex;

    private Dept dept;

    public Dept getDept() {
return dept;
} public void setDept(Dept dept) {
this.dept = dept;
} public Integer getEid() {
return eid;
} public void setEid(Integer eid) {
this.eid = eid;
} public String getEname() {
return ename;
} public void setEname(String ename) {
this.ename = ename;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} @Override
public String toString() {
return "Emp [eid=" + eid + ", ename=" + ename + ", age=" + age + ", sex=" + sex + ", dept=" + dept + "]";
} public Emp(Integer eid, String ename, Integer age, String sex) {
super();
this.eid = eid;
this.ename = ename;
this.age = age;
this.sex = sex;
} public Emp() {
super();
// TODO Auto-generated constructor stub
} }

Emp

映射文件EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.atguigu.mapper.EmpMapper"> <!-- Emp getEmpByEid(String eid); -->
<select id="getEmpByEid" resultType="Emp">
select eid,ename,age,sex from emp where eid = #{eid}
</select> <!-- List<Emp> getAllEmp(); -->
<select id="getAllEmp" resultType="Emp">
select eid,ename,age,sex from emp
</select> <!-- void addEmp(Emp emp); -->
<insert id="addEmp">
insert into emp values(null,#{ename},#{age},#{sex})
</insert> <!-- void updateEmp(Emp emp); -->
<update id="updateEmp">
update emp set ename = #{ename}, age = #{age}, sex = #{sex} where eid = #{eid}
</update> <!-- void deleteEmp(String eid); -->
<delete id="deleteEmp">
delete from emp where eid = #{eid}
</delete> </mapper>

同时需要记得在mybatis-config.xml文件中进行配置映射文件位置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--
<properties>:设置或引入资源文件
resource:在类路径下访问资源文件
url:在网络路径或磁盘路径下访问资源文件
-->
<properties resource="jdbc.properties"></properties> <settings>
<!-- 将下划线映射成驼峰,user_name映射为userName -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 开启延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 是否查询所有数据 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings> <typeAliases>
<!--
为类型设置类型别名
type:Java 类型,若只设置type,默认的别名就是类型,且不区分大小写
-->
<!-- <typeAlias type="com.atguigu.bean.User" alias="u"/> -->
<package name="com.atguigu.bean"/>
</typeAliases> <!--
<environments>:设置连接数据库的环境
default:设置默认使用的数据库环境
-->
<environments default="mysql">
<!--
<environment>:设置某个具体的数据库的环境
id:数据库环境的唯一标示
-->
<environment id="mysql">
<!-- type="JDBC|MANAGED",JDBC:使用JDBC原生的事务管理方式,即提交和回滚都需要手动处理 -->
<transactionManager type="JDBC" />
<!-- type="POOLED|UNPOOLED|JNDI" -->
<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> <environment id="oracle">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/ssm" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 引入映射文件 -->
<mappers>
<!-- <mapper resource="EmpMapper.xml" />
<mapper resource="DeptMapper.xml" /> -->
<!-- 此种写法要求mapper接口和mapper映射文件必须在同一个包下,可以设置相同的包名 -->
<package name="com.atguigu.mapper"/>
</mappers>

</configuration>

创建测试类TestCRUD:

package com.atguigu.test;

import java.io.IOException;
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.Test; import com.atguigu.bean.Emp;
import com.atguigu.mapper.EmpMapper; public class TestCRUD { @Test
public void testCRUD() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//SqlSession sqlSession = sqlSessionFactory.openSession();//需要手动处理事务
SqlSession sqlSession = sqlSessionFactory.openSession(true);//自动处理事务
EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
//测试:根据eid获取员工信息
/*Emp emp = empMapper.getEmpByEid("3");
System.out.println(emp);*/
//测试:获取所有的员工信息
/*List<Emp> list = empMapper.getAllEmp();
System.out.println(list);*/
//测试:添加员工信息
/*empMapper.addEmp(new Emp(null, "admin", 23, "女"));
sqlSession.commit();//提交事务*/

//测试:修改员工信息
empMapper.updateEmp(new Emp(6, "张二", 33, "女"));
//测试:删除员工信息
/*Boolean i = empMapper.deleteEmp("2");
System.out.println("result:"+i);*/
//select 字段名 from 表名 where 条件 group by 字段名 having 条件 order by 字段名 desc/asc limit index,pageSize
} }

需要注意的问题:

  ①关于事务管理

  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映射文件必须在同一个包下,可以设置相同的包名。

<mappers>
<!-- <mapper resource="EmpMapper.xml" />
<mapper resource="DeptMapper.xml" /> -->
<!-- 此种写法要求mapper接口和mapper映射文件必须在同一个包下,可以设置相同的包名 -->
<package name="com.atguigu.mapper"/>
</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. 关于5G技术,这是我见过最通俗易懂的讲解了

    公众号关注 「开源Linux」 回复「学习」,有我为您特别筛选的学习资料~ 1 一个简单且神奇的公式 今天的故事,从一个公式开始讲起. 这是一个既简单又神奇的公式.说它简单,是因为它一共只有 3 个字 ...

  2. vue3 vite 系统标题 系统名称统一配置

    想要统一配置系统名称 或者其他的,需要在vue3中使用 vite 的环境变量 vite 的环境变量 需要创建两个文件(和 vite.config.js 文件同一目录) .env.development ...

  3. Nginx报错收集

    在安装完成ngixn之后,访问页面显示空白,报错信息里面有这一条报错信息: tailf /usr/local/nginx/logs/error.log 2018/10/26 10:58:00 [err ...

  4. 110. Balanced Binary Tree - LeetCode

    Question 110. Balanced Binary Tree Solution 题目大意:判断一个二叉树是不是平衡二叉树 思路:定义个boolean来记录每个子节点是否平衡 Java实现: p ...

  5. 134_Power BI Report Server之某消费品运营数据监控

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一背景 最近很久都没有更新文章了,研究了下Power BI Report Server(下文简称pbirs). 今天把pb ...

  6. 设计并实现加法器类 Adder

    学习内容:设计并实现加法器类 Adder 代码示例: package 实验三; import java.util.Scanner; public class Adder { private int n ...

  7. Go到底能不能实现安全的双检锁?

    不安全的双检锁 从其他语言转入Go语言的同学经常会陷入一个思考:如何创建一个单例? 有些同学可能会把其它语言中的双检锁模式移植过来,双检锁模式也称为懒汉模式,首次用到的时候才创建实例.大部分人首次用G ...

  8. Vben Admin 源码学习:项目初始化

    0x00 前言 Vue-Vben-Admin 是一个免费开源的中后台模版.使用了最新的vue3,vite2,TypeScript等主流技术开发,开箱即用的中后台前端解决方案考. 本系列本着学习参考的目 ...

  9. Python 微博搜索爬虫

    微博搜索爬虫 网页分析 由于网页端反爬虫机制比较完善所以才去移动端进行爬虫. url地址:https://m.weibo.cn/ 搜索框,输入关键词进行搜索 对网页进行抓包,找到相关数据 查看数据是否 ...

  10. Java_Scanner的使用

    目录 Scanner对象 scanner.next()和scanner.nextln()的区别 scanner.hasNext()和scanner.hasNextln() Scanner拓展 视频课程 ...