• MyBatis 映射文件


    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) 建议大部分情况下使用 #{},在特殊情况下:①批量删除;②模糊查询,需要使用 ${}

  • 相关阅读:
    单元测试之Stub和Mock
    【爆牙齿】说说我期待中的苹果那块板子。
    【爆牙游记】黄山归来不看岳-翻山。
    【爆牙齿】微软的坟墓:Windows 7。(四)
    【爆牙齿】微软的坟墓:Windows 7。(二)
    【爆牙齿】微软的坟墓:Windows 7。(三)
    【爆牙齿】微软的坟墓:Windows 7。(一)
    【爆牙齿】微软的坟墓:Windows 7。(五)
    【爆牙游记】黄山归来不看岳-日出。
    过年照片集。
  • 原文地址:https://www.cnblogs.com/lemonzhang/p/12945006.html
Copyright © 2020-2023  润新知