MyBatis一些基本的概念

前言

这篇文章参考了《MyBatis3开发文档》记录了初学时碰到的一些问题

正文

MyBatis两个配置文件

configuration.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>

    <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://127.0.0.1:3306/blog" />
            <property name="username" value="root"/>
            <property name="password" value="xx"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="withoutspring/User.xml"/>
    </mappers>
</configuration>

User.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="withoutspring.UserDAO" >

    <resultMap id="userMap" type="withoutspring.User">
        <id property="id" column="userid" />
        <result property="display" column="displayname"/>
        <result property="logon" column="logon"/>
    </resultMap>
    <resultMap id="logons" type="withoutspring.Logon">
        <id property="id" column="logon_id" />
        <result property="logonname" column="logonname"/>
        <result property="password" column="password"/>
        <collection  property="user" javaType="list" ofType="withoutspring.User">
            <id property="id" column="user_id" />
        <result property="display" column="displayname"/>
        <result property="logon" column="logon"/>
        </collection>
    </resultMap>
    <select id="getLogon" parameterType="int" resultMap="logons">
        select t.id as logon_id,
               t.logonname,
               t.password,
               t.userid,
               t1.id as user_id,
               t1.displayname,
               t1.logon
        from logon t,user1 t1
        where t.userid = t1.id
        and t.userid = #{userid}
    </select>
    <update id="updateLogonWithCondition" parameterType="Map">
        update logon 
        <trim prefix="set" prefixOverrides="," suffixOverrides=",">
            <if test="logonid != null and logonid != ''">
                id = #{logonid},
            </if>
            <if test="displayname != null and displayname != ''">
                logonname = #{displayname},
            </if>
        </trim>
        <trim prefix="where" prefixOverrides="AND|OR">
            <if test="myblog1 != null">logonname = #{myblog1}</if>
            <if test="logonid1 != null"> or id = #{logonid2}</if>
            <if test="logonid1 != null"> and id = #{logonid1};</if>
        </trim>
    </update>
</mapper>

问题列表

一、user.xml中的mapper里面的namespace如何设置

<mapper namespace="withoutspring.UserDAO" >
</mapper>

在我们三层模型中,我们一般会定义个UserDAO接口,然后有一个实现类UserDAOImpl,在这个实现类中调用操作数据库的开源框架(如hibernateTemplate),但是在MyBatis中,只需要定义个接口UserDAO,然后这个UserDAO的类完全限定名withoutspring.UserDAO填写到namespace属性中。先看看这个UserDAO接口

package withoutspring;

import java.util.Map;

public interface UserDAO {

    public Logon getLogon(int userid);

    public User getList(int myid);

    public void getCount();

    public void getLogonByCondition(TestDTO dto);

    public void updateLogonWithCondition(Map map);
}

这个接口里面每一个方法名就是user.xml配置文件中select、update、insert中的id名

二、MyBatis的resultMap、resultType、parameterType

parameterType与resultType

例子:存在一种用户表user1里面有字段id、displayname。使用mybatis查找一个user1数据信息
准备:
1、一个user的javaBean作为存储user1查询出来的信息;
2、一个UserDAO接口,里面有一个叫做getUser的公共方法
在配置文件中配置

<mapper namespace="withoutspring.UserDAO" >
    <select id="getUser" parameterType="map" resultType="withoutspring.User">
            select id,
                   displayname as display
            from user1
            where id = #{userid}
            and displayname = #{displayn}
    </select>
</mapper>   

调用代码

public static void main(String[] args) {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            session.selectOne("withoutspring.UserDAO.getCount");
            UserDAO mapper = session.getMapper(UserDAO.class);
            Map map = new HashMap();
            map.put("userid", 52);
            map.put("displayn", "goodman");
            User user = mapper.getUser(map);
            System.out.println(user);
        } finally {
        session.close();
        }
    }

1、id=”getUser”这里id对应的是UserDAO中的方法名
2、parameterType=“map”MyBatis里面有很多常用的引用类型,基本类型的别名,这里map是java.util.Map的别名。
3、在select中的sql中#{userid},#{displayn} 里面的命名什么要求? 它对应map中的key,同理如果parameterType指定的是自定义的对象,如DTO,那么对应的时候dto的属性名
4、resultType=”withoutspring.User”,sql在select的字段值存放到User中返回,因为resultType指定的是返回的对象。需要注意的是,select后面的column名必须与User属性名一致,如果不一致请加上as,上面user1表中displayname与User对象的属性display,不一致,所以加了一个as display

resultMap

1、从上面我们讲到select后面的column需要和返回对象的属性名一致,不一致使用as别名来指定成属性名,我们还可以使用resultMap代替resultType,在resultMap配置,column与propertyName的对应关系,因此就不需要使用别名了

<mapper namespace="withoutspring.UserDAO" >
    <resultMap id="userMap" type="withoutspring.User">
        <id property="id" column="id" />
        <result property="display" column="displayname"/>
    </resultMap>
    <select id="getUser" parameterType="map" resultMap="userMap">
        select id,
               displayname
        from user1
        where id = #{userid}
        and displayname = #{displayn}
    </select>
</mapper>

在resultMap我把配置了对象与数据表的映射关系,resultMap type=”withoutspring.User” type表示这个resultMap返回的是一个User对象
2、既然resultMap是说明表与javaBean之间的映射,那么我们在做关联查询的时候就离不开这个resultMap了
在关联查询时,我们有几种resultMap的配置方法,请看《MyBatis几种关联查询配置》这篇文章

三、MyBatis的动态查询

在写sql,页面传过来的字段,有可能非空,我们总不能把空值给查询语句查询,同理在更新的时候,需要更新的字段也可能是空,我们使用动态查询来解决这些问题,动态查询中使用trim、where、set等标签配置,具体请看《MyBatis的动态查询配置》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值