码迷,mamicode.com
首页 > 其他好文 > 详细

Mybatis学习笔记

时间:2017-07-16 11:28:53      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:manager   pool   成员变量   操作   iat   produce   重复   update   rac   

平时我们都用JDBC访问数据库,除了需要自己写SQL之外,还必须操作Connection, Statment, ResultSet 这些其实只是手段的辅助类。 不仅如此,访问不同的表,还会写很多雷同的代码,显得繁琐和枯燥。 

那么用了Mybatis之后,只需要自己提供SQL语句,其他的工作,诸如建立连接,Statement, JDBC相关异常处理等等都交给Mybatis去做了,那些重复性的工作Mybatis也给做掉了,我们只需要关注在增删改查等操作层面上,而把技术细节都封装在了我们看不见的地方。 

Mybatis的配置文件有两个,第一个为主配置文件

主配置文件:

<?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>
    <!--别名-->
    <typeAliases>
      <package name="com.how2java.pojo"/>
    </typeAliases>

    <environments default="development">
        
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--连接数据库是用到的信息,驱动,用户名,密码等-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/how2java?characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>

    </environments>
    <mappers>
        <mapper resource="com/how2java/pojo/Category.xml"/>
    </mappers>
</configuration>

详细的每个标签的含义:

http://www.mybatis.org/mybatis-3/zh/configuration.html  

第二个配置文件:

下面是简单的CRUD查询这样配置,也就是从一个表格中直接查询需要的数据,只关系到一个表格,比较简单

<?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.how2java.pojo">
        <!-- id表示这条SQL语句的标识,想执行这条语句,直接在Java中将他做作为参数即可,parameterType表示执行这条语句的时候需要传入一个Category类的对象 -->
        <insert id="addCategory" parameterType="Category" >
            insert into category_ ( name ) values (#{name})    
        </insert>
        <!-- 同上 --> 
        <delete id="deleteCategory" parameterType="Category" >
            delete from category_ where id= #{id}   
        </delete>
        <!-- id 和 parameterType 同上,其中 _int 对应的就是java中的int类型, int对应的是 java中的 Integer了类型 , resultType表示 执行这条语句的输出结果是一个 Category 类型的就是返回值类型--> 
        <select id="getCategory" parameterType="_int" resultType="Category">
            select * from   category_  where id= #{id}    
        </select>
 
        <update id="updateCategory" parameterType="Category" >
            update category_ set name=#{name} where id=#{id}    
        </update>
        <select id="listCategory" resultType="Category">
            select * from   category_      
        </select>     
    </mapper>

下面这些是从多个表格中查询,即一个主表中的数据,然后在关联一些表格中的数据,可以分为一对一查询,就是主表中的一条记录,和关联的表格中的记录对应,一对多查询,主表中的一条记录和关联的表格中的多条记录对应,多对多,多对一等

一对一配置

可以放在resultType中,也可以放在resultMap中(具体见收藏的文章)

 

一对多配置

一对多用resultMap来存放

存放查询结果的容器有两层组成,第一层是查询的主表的元素,第二层是关联的表格的元素,主表的元素直接在第一层的javabean中存放,第二层的元素放在后加进来的对象中,也就是association标签中配置的bean。

<?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.mybatis.entity">
        <resultMap type="User" id="userBean">
            <!-- 配置第一层 表格和javabean中的属性的对应 其中uid是user表中id的别称,这个在下面的SQL语句中配置了,因为user表和order表都有id,用别名来区分
            colum是表中的列名,property是javabean中的成员变量的名字-->
            <id column="uid" property="id" />
            <result column="username" property="username" />
            <result column="sex" property="sex" />
            <result column="address" property="address" />
            <!-- 一对多的关系   用来配置第二层的 表格列名和第二层javabean的成员变量的对应关系-->
            <!-- property: 指的是装 第二层数据的成员变量的名字, ofType:指的是集合中元素的类型 -->
            <collection property="ordersList" ofType="Orders">
                <id column="pid" property="id" />
                <result column="user_id" property="userid" />
                <result column="number" property="number" />
                <result column="createtime" property="createTime" />
            </collection>
        </resultMap>
        <!-- 关联查询分类和产品表 -->
        <select id="userAndOrder" resultMap="userBean">
            select 
                u.*, o.* ,
                 u.id ‘uid‘ , o.id ‘oid‘
            from 
                 t_user u left join orders o 
            on 
                u.id = o.user_id
        </select>    
    </mapper>

 多对一的配置过程,理解了一对多之后非常好理解,无论是第一层还是第二层,结果都是放在List中的,一对多的话,第一层List中的每个元素对应的List中有多个元素,多对一就是,第一层List中的每个元素对应的List中只有一个元素,而且第一层List中的多个元素对应的List中的值是一样的。好抽象。。。

 技术分享

 

 多对多配置

<?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.mybatis.entity">
        <resultMap type="User" id="userBean">
            <!-- 配置第一层,即第一张表 表格和javabean中的属性的对应 其中uid是user表中id的别称,这个在下面的SQL语句中配置了,因为user表和order表都有id,用别名来区分
            colum是表中的列名,property是javabean中的成员变量的名字
            现在开始配置User类的前几个成员变量-->
            <id column="uid" property="id" />
            <result column="username" property="username" />
            <result column="sex" property="sex" />
            <result column="address" property="address" />
            <result column="birthday" property="birthday" />
            <!-- 上面配置的是User类的前几个成员变量,下一个成员变量ordersList是一个List,类型是Order,要用collection标签,collection标签中配置的就是Order这个bean与order表中的字段的的对应关系-->
            <collection property="ordersList" ofType="Orders">
                <id column="oid" property="id" />
                <result column="user_id" property="userid" />
                <result column="number" property="number" />
                <result column="createtime" property="createTime" />
                <!--上面配置的是Order类中的前几个成员变量,orderdetails这个成员变量是List(是一对多的关系,即一个Order有多个OrderDetail),类型是OrderDetail,所以用collection标签,collection标签中配置的就是OrderDetail这个bean与表格的对应关系-->
                <collection property="orderdetails" ofType="OrderDetail">
                    <id column="odid" property="id" />
                    <result column="items_num" property="itemsNum" />
                    <result column="express" property="express" />
                    <!--上面配置的是OrderDetail类的前几个成员变量,下一个成员变量是Items类的对象items,由于items只是一个对象,所以用association标签,其中配置的就是Items类和最后一层表的字段的对应关系-->
                    <association property="items" javaType="Items">
                        <id column="iid" property="id" />
                        <result column="itemsname" property="itemsName" />
                        <result column="price" property="price" />
                        <result column="producetime" property="produceTime" />
                        <result column="detail" property="detail" />
                    </association>
                </collection>
            </collection>
        </resultMap>
        <!-- 关联查询分类和产品表 -->
        <select id="userAndOrderAndOrderDetailAndItems" resultMap="userBean">
            select 
                u.*, o.* , od.*, i.*,
                 u.id ‘uid‘ , o.id ‘oid‘ , od.id ‘odid‘
            from 
                 t_user u 
                left join orders o          on u.id = o.user_id
                left join orderdetail od    on od.orders_id = o.id
                left join items i           on i.id = od.items_id

        </select>    
    </mapper>

 

 关于关系的建立

任意两个表,可以通过外键来产生关系,如果是一对多的关系,还可以用一个中间表来连接两个表格,中间表中的记录就是关系存在的依据,如果想建立两个表的关系,就需要在中间表中添加一条记录,记录添加之前,这两个表就是存在的,只是没有关系,分别获取两个表中的某一个字段,放在中间表中,就建立了一个关系。

 关系的删除也是类似的,删除的只是关系,并不影响原来的两个表格。

 

拿到一个表,先找主键,主键唯一,再找外键,外键就是对应到要关联的表上,

配置过程就建立Javabean与表格的对应关系,建立好对应关系,执行SQL语句之后,结果存放在结果集中,具体的查询逻辑,还是SQL完成

 

查询的结果集有两个存放的结构,resultType和resultMap,resultType只有一个层次,所查询出来的结果放在一个类中,resultMap可以有两个层次,即类中的成员变量可以用来存放结果,同时,还可以用一个类的对象作为成员变量,来存放下一个层次的查询结果,比较适合用在一对多查询。

一对一查询,两种方法都可以用

 

Mybatis学习笔记

标签:manager   pool   成员变量   操作   iat   produce   重复   update   rac   

原文地址:http://www.cnblogs.com/mxck/p/7157745.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!