mybatis 学习一 总体概述

mybatis使用起来不复杂,大体上来说,就是将db连接信息,所有的sql语句信息,都放到配置文件里面,然后去读配置信息,根据db信息,创建好session工厂,然后拿到sqlsession回话之后,再去读取sql语句信息,然后根据你指定的sql,去执行,传参数,并返回结果。返回的结果可以根据你在sql语句配置文件里的配置,自动转换成对象,方便使用。
 
1,conf.xml 文件
     这里面配置了db的链接信息,属性信息,所有sql语句xml的mapperxml列表信息等。类似下面这种
  
<?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="db.properties"/>
    <typeAliases>
        <!-- 为实体类me.gacl.domain.User配置一个别名_User -->
        <!-- <typeAlias type="me.gacl.domain.User" alias="_User"/> -->
        <!-- 为me.gacl.domain包下的所有实体类配置别名,MyBatis默认的设置别名的方式就是去除类所在的包后的简单的类名
        比如me.gacl.domain.User这个实体类的别名就会被设置成User
         -->
        <package name="com.cn.liubb"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <!-- 配置数据库连接信息 -->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}" />
                <property name="username" value="${name}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
        <!-- 注册userMapper.xml文件, 
        userMapper.xml位于me.gacl.mapping这个包下,所以resource写成me/gacl/mapping/userMapper.xml-->
        <mapper resource="mapperxml/userMapper.xml"/>
        <mapper resource="mapperxml/classMapper.xml"/>
        <!-- 注册UserMapper映射接口-->
        <mapper class="com.cn.liubb.UserMapperI"/>
    </mappers>
    <!-- 配置实体类的别名,配置实体类别名的目的是为了在引用实体类时可以使用实体类的别名来代替实体类,达到简写的目的 -->

</configuration>
2,mapper xml 文件
     这里面主要配置了要执行的sql语句信息,返回值的对象映射信息,curd语句都可以,是否开启二级缓存配置等等。类似下面这种。
   
<?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,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
例如namespace="me.gacl.mapping.classMapper"就是me.gacl.mapping(包名)+classMapper(classMapper.xml文件去除后缀)
 -->
<mapper namespace="com.cn.liubb.classMapper">


<!-- 
        根据classId查询对应的班级信息,包括学生,老师
     -->
    <!-- 
    方式一: 嵌套结果: 使用嵌套结果映射来处理重复的联合结果的子集
    SELECT * FROM class c, teacher t,student s WHERE c.teacher_id=t.t_id AND c.C_id=s.class_id AND  c.c_id=1
     -->
    <select id="getClass3" parameterType="int" resultMap="ClassResultMap3">
        select * from class c, teacher t,student s where c.teacher_id=t.t_id and c.C_id=s.class_id and  c.c_id=#{id}
    </select>
    <resultMap type="com.cn.liubb.Classes" id="ClassResultMap3">
        <id property="id" column="c_id"/>
        <result property="name" column="c_name"/>
        <association property="teacher" column="teacher_id" javaType="com.cn.liubb.Teacher">
            <id property="id" column="t_id"/>
            <result property="name" column="t_name"/>
        </association>
        <!-- ofType指定students集合中的对象类型 -->
        <collection property="students" ofType="com.cn.liubb.Student">
            <id property="id" column="s_id"/>
            <result property="name" column="s_name"/>
            <result property="classid" column="c_id"/>
        </collection>
    </resultMap>
    
    <!-- 
        方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型
            SELECT * FROM class WHERE c_id=1;
            SELECT * FROM teacher WHERE t_id=1   //1 是上一个查询得到的teacher_id的值
            SELECT * FROM student WHERE class_id=1  //1是第一个查询得到的c_id字段的值
     -->
     <select id="getClass4" parameterType="int" resultMap="ClassResultMap4">
        select * from class where c_id=#{id}
     </select>
     <resultMap type="com.cn.liubb.Classes" id="ClassResultMap4">
        <id property="id" column="c_id"/>
        <result property="name" column="c_name"/>
        <association property="teacher" column="teacher_id" javaType="com.cn.liubb.Teacher" select="getTeacher2"></association>
        <collection property="students" ofType="com.cn.liubb.Student" column="c_id" select="getStudent"></collection>
     </resultMap>
     
     <select id="getTeacher2" parameterType="int" resultType="com.cn.liubb.Teacher">
        SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
     </select>
     
     <select id="getStudent" parameterType="int" resultType="com.cn.liubb.Student">
        SELECT s_id id, s_name name, class_id classid FROM student WHERE class_id=#{id}
     </select>
     
    <select id="getUserCount" parameterMap="getUserCountMap" statementType="CALLABLE">
        CALL PRO4(?,?)
    </select>
    
    <parameterMap type="java.util.Map" id="getUserCountMap">
        <parameter property="ptno" mode="IN" jdbcType="INTEGER"/>
        <parameter property="cou" mode="OUT" jdbcType="INTEGER"/>
    </parameterMap>
     
     </mapper>
3,mybatis的使用
     配置好了上面两种信息之后,就可以使用起来了,
     比如说,获取session
        String resource = "conf.xml";
        InputStream is = TestMybatis.class.getClassLoader().getResourceAsStream(resource);
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = sessionFactory.openSession();
     通过session执行sql,指定sql语句id即可。          
        String statement = "com.cn.liubb.userMapper.getUser";
        User user = session1.selectOne(statement, 1);
 
注:有些代码是网络上的,自己拿下来运行了下,后来找不到出处了,望原谅。
原文地址:https://www.cnblogs.com/liouwei4083/p/6019138.html