美文网首页
MyBatis基础 Day11 2018-11-29

MyBatis基础 Day11 2018-11-29

作者: Ernest_Chou | 来源:发表于2018-11-29 22:09 被阅读0次

    二、mybatis基础

    1. typeAliases类型设置别名

    mybatis-config.xml文件中设置:

    <!-- 配置类型别名  User 可以使用在任何使用com.zhougl.web.beans.PhoneUser的地方-->
    <typeAliases>
        <typeAlias alias="User" type="com.zhougl.web.beans.PhoneUser"/>
    </typeAliases>
    <!-- 设置包扫描(别名) 制定一个包名,每一个在该包中的java Bean ,没有注解的情况下会使用Bean的首字母小写的非限定类名作为别名,有注解则为主键值@Alias("User")-->
    <typeAliases>
        <package name="com.zhougl.web.beans" />
    </typeAliases>
    
    @Alias("User")
    public class PhoneUser {
    }
    

    2.mapper映射器

    <!-- 配置持久化类映射文件:用来配置sql语句和结果集类型等 -->
        <!-- 使用类路径查找资源文件 -->
        <mappers>
            <mapper resource="com/zhougl/web/dao/mapper/PhoneUserMapper.xml" />
        </mappers>
        <!-- 使用本地文件 -->
        <mappers>
            <mapper url="file:///D:\OxygenWorkspace\maven-mybatis\src\main\java\com\zhougl\web\dao\mapper\PhoneUserMapper.xml"/>
        </mappers>
        <!-- 使用包名 非注解模式的话xml配置文件必须也处于同一级 package 下,且与Mapper类同名-->
        <mappers>
            <package name="com.zhougl.web.dao.mapper"/>
        </mappers>
    
    • 使用接口类

      • mybatis-config.xml

        <!-- 使用接口类 -->
        <mappers>
            <mapper class="com.zhougl.web.dao.PhoneDepartmentMapper"/>
        </mappers>
        
      • 接口与映射文件位置

        接口与映射文件
      • 映射文件命名空间namespace="com.zhougl.web.dao.PhoneDepartmentMapper"必须与接口类全限定名一直

      • 测试代码

      PhoneDepartment phoneDepartment = session.selectOne("com.zhougl.web.dao.PhoneDepartmentMapper.selectByPrimaryKey", "1");
      //结果  PhoneDepartment [id=1, departmentName=企划部, departmentCode=D01]
      

    3.<selectKey>生成主键

     <insert id="insert" parameterType="com.zhougl.web.beans.PhoneDepartment">
        <selectKey keyProperty="id" resultType="String" order="BEFORE">
            select SQ_PHONE_DEPARTMENT_ID.nextval as id from dual
        </selectKey>
        insert into PHONE_DEPARTMENT (ID, DEPARTMENT_NAME, DEPARTMENT_CODE
          )
        values (#{id,jdbcType=VARCHAR}, #{departmentName,jdbcType=VARCHAR}, #{departmentCode,jdbcType=VARCHAR}
          )
      </insert>
    

    4. sql代码段

    <!--  引用 sql 片段,如果refid 指定的不在本文件中,那么需要在前面加上 namespace -->
    <!-- 属性代码段可以被包含在其他语句里面 -->
    <sql id="sometable">${prefix}Table</sql>
    <sql id="someinclude">from <include refid="${include_target}"/></sql>
    <!-- 属性值可以用于包含的refid属性或包含的代码段里面的属性 -->
    <select id="select" resultType="map">
        select field1,field2,field3 
        <include refid="someinclude">
            <property name="prefix" value="Some" />
            <property name="include_target" value="sometable"/>
        </include>
    </select>
    

    5.SqlSessionFactoryUtil工厂类封装方法

    public class SqlSessionFactoryUtil {
        
        private static SqlSessionFactory sqlSessionFactory = null;
        //创建初始化SqlSessionFactory对象
        static {
            try {
                //读取mybatis-config.xml配置文件
                InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                
                e.printStackTrace();
            }
        }
        //获取SqlSession对象的静态方法
        public static  SqlSession getSession() {
            return sqlSessionFactory.openSession();
        }
        //获取SqlSessionFactory的静态方法
        public static SqlSessionFactory getSqlSessionFactory() {
            return sqlSessionFactory;
        }
    }
    
    

    6. <association>一对一查询

    <association>元素的解释:

    • column 表示当前查询数据库表的列名DEPARTMENT_ID
    • property 表示返回类型PhoneUserIdAndDepartment属性名department
    • javaType 表示该属性对于的类型名称
    • select 表示执行的查询语句,将查询到的数据封装到property所代表的类型对象当中

    6.1 基本应用

    6.1.1 java bean
    • WebClass.java
    public class WebClass {
        private BigDecimal id;
        private String code;
        private String name;
        //班级与学生是一对多的关系
        private List<Student> students;
        
    }
    
    • Student.java
    public class Student {
        private BigDecimal id;
    
        private String name;
    
        private String sex;
    
        private Short age;
        //学生与班级是多对一的关系
        private WebClass webClass;
    } 
    
    6.1.1 映射文件
    <mapper namespace="com.zhougl.web.dao.StudentDao">
      <resultMap id="StudentMap" type="com.zhougl.web.beans.Student">
        <id column="id" jdbcType="DECIMAL" property="id" />
        <result column="studentName" jdbcType="VARCHAR" property="name" />
        <result column="SEX" jdbcType="VARCHAR" property="sex" />
        <result column="AGE" jdbcType="DECIMAL" property="age" />
        <!-- 一对多 -->
        <association property="webClass" column="class_id"
         javaType="com.zhougl.web.beans.WebClass" 
         select="selectClassById"/>
      </resultMap>
     
      <select id="selectClassById" parameterType="int" resultType="com.zhougl.web.beans.WebClass">
        select * from WEB_CLASS  where ID = #{id,jdbcType=DECIMAL}
      </select>
      <select id="selectStudent" parameterType="int" resultMap="StudentMap">
        select * from STUDENT
      </select>
     
    </mapper>
    
    6.1.2 测试代码
    public static void main(String[] args) {
            SqlSession session = SqlSessionFactoryUtil.getSession();
            List<Student> students = session.selectList("com.zhougl.web.dao.StudentDao.selectStudent");
            students.forEach(student -> System.out.println(student));
            session.commit();
            session.close();
        }
    
    • 结果
    ==>  Preparing: select * from STUDENT 
    ==> Parameters: 
    ====>  Preparing: select * from WEB_CLASS where ID = ? 
    ====> Parameters: 1(Integer)
    <====      Total: 1
    ====>  Preparing: select * from WEB_CLASS where ID = ? 
    ====> Parameters: 2(Integer)
    <====      Total: 1
    <==      Total: 4
    Student [id=1, name=null, sex=女, age=22, webClass=WebClass [id=1, code=C001, name=大乱斗指导班]]
    Student [id=2, name=null, sex=女, age=24, webClass=WebClass [id=2, code=C002, name=无限流战斗班]]
    Student [id=3, name=null, sex=男, age=28, webClass=WebClass [id=1, code=C001, name=大乱斗指导班]]
    Student [id=4, name=null, sex=女, age=26, webClass=WebClass [id=2, code=C002, name=无限流战斗班]]
    

    6.2 一对一映射(接口)

    6.2.1 java bean
    • card.java
    public class Card {
        private Integer id;
        private String code;
        //省略构造器和set/get方法
    }
    
    • Person.java
    public class Person {
        private Integer id;
        private String name;
        private String sex;
        private Short age;
        private Card card;
        //省略构造器和set/get方法
    }
    
    6.2.2 映射文件
    • CardMapper.xml
    <mapper namespace="com.zhougl.web.dao.mapper.CardMapper">
      <sql id="Base_Column_List">
        ID, CODE
      </sql>
     
      <select id="selectCardById" parameterType="integer" resultType="com.zhougl.web.beans.Card">
        select 
        <include refid="Base_Column_List" />
        from CARD
        where ID = #{id,jdbcType=DECIMAL}
      </select>
     
    </mapper>
    
    • PersonMapper.xml
    <mapper namespace="com.zhougl.web.dao.mapper.PersonMapper">
        <resultMap id="personMap" type="com.zhougl.web.beans.Person">
            <id column="ID" jdbcType="DECIMAL" property="id" />
            <result column="NAME" jdbcType="VARCHAR" property="name" />
            <result column="SEX" jdbcType="VARCHAR" property="sex" />
            <result column="AGE" jdbcType="DECIMAL" property="age" />
            <!-- 一对一关联映射 -->
            <association property="card" column="CARD_ID"
                javaType="com.zhougl.web.beans.Card"
                select="com.zhougl.web.dao.mapper.CardMapper.selectCardById" />
        </resultMap>
    
        <sql id="Base_Column_List">
            ID, NAME, SEX, AGE, CARD_ID
        </sql>
    
        <select id="selectPersonById" parameterType="integer"
            resultMap="personMap">
            select
            <include refid="Base_Column_List" />
            from PERSON
            where ID = #{id,jdbcType=DECIMAL}
        </select>
    </mapper>
    
    6.2.3 接口
    • PersonMapper.java,与PersonMapper.xml在同一个文件夹,接口的类名必须与映射文件namespace一致
    public interface PersonMapper {
        /**
         * 方法名与参数必须和xml文件中<select...>的id属性和parameterType属性一致
         * @param id
         * @return Person
         */
        Person selectPersonById(Integer id);  
    }
    
    6.2.4 测试类
    public class OneToOneTest {
        public static void main(String[] args) {
            SqlSession session = SqlSessionFactoryUtil.getSession();
            //获得mapper接口代理对象
            PersonMapper mapper = session.getMapper(PersonMapper.class);
            //直接调用接口方法,查询数据
            Person person = mapper.selectPersonById(1);
            System.out.println(person);
            System.out.println(person.getCard());
            session.commit();
            session.close();
        }
    }
    
    

    相关文章

      网友评论

          本文标题:MyBatis基础 Day11 2018-11-29

          本文链接:https://www.haomeiwen.com/subject/ijpqcqtx.html