Mybatis

最近研究了一下MyBatis,也就是itatis。之所以研究这个,是发现大多数公司都放弃了hibernate,而使用ibatis的原因。比如阿里。

mybatis其实入门还是很简单的,一天半天的就知道怎么用了。而且官网有使用说明,照着用就会了。不过要用到很高级别还是要花点时间的。下面正题:

一》资料下载,http://www.mybatis.org/这个是最新的主页,但是它现在的源码由google code托管了,下载源码去http://code.google.com/p/mybatis/wiki/Downloads?tm=2。这里有源码跟使用向导,还有中文版的。下下来看一下很快就明白了。

二》sqlmapsession.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>
<typeAlias alias="User" type="com.example.user.entity.User"></typeAlias>
<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="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/user/mappers/User.xml"/>
</mappers>
</configuration>
它的机构如下所示:configuration是跟标签名。其余为子标签名。具体的内容看下载的使用向导就知道了。

 configuration配置
 properties属性
 settings设置
 typeAliases类型命名
 typeHandlers类型处理器
 objectFactory对象工厂
 plugins插件
 environments环境
 environment环境变量
 transactionManager事务管理器
 dataSource数据源
 映射器

有了配置文件,自然要跟着说映射文件,也就是上面配置文件中的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="com.example.user.UserMapper">
    <cache ></cache>
    <resultMap type="User" id="userMap">  
        <id property="id" column="id" />  
        <result property="userName" column="username" />  
        <result property="userPasswd" column="userpasswd" />  
        <result property="description" column="description" />  
        <result property="userPermiss" column="userpermiss" />  
        <result property="logintime" column="times" />
    </resultMap>
    <select id="getOneUser" parameterType="User" resultType="User">
        select * from user where username = #{userName} and userpasswd = #{userPasswd}
    </select>
    <select id="ifUserNameHave" parameterType="string" resultType="boolean">
        select * from user where username = #{userName}
    </select>
    <select id="showUsers" resultMap="userMap">
        select * from user
    </select>
    <insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
        insert into user(username,userpasswd,description,userpermiss) 
        values(#{userName},#{userPasswd},#{description},#{userPermiss})
    </insert>
    <update id="updateUser" parameterType="User">
        update user set
        username = #{userName},
        userpasswd = #{userPasswd},
        description = #{description},
        userpermiss = #{userPermiss},
        times = #{logintime}
        where id = #{id}
    </update>
    <delete id="deleteUser" parameterType="int">
        delete from user where id = #{id}
    </delete>
</mapper>
先看namespace这个属性,这个属性是必须的,因为你后台的daoimpl要调用这个,而且在整个项目中是要唯一的。然后看resultMap这个属性,他是一个结果集,它与数据库有个简单的对应关系,再看type这个属性,其实就是对应的实体类的User,这个地方就要注意了,User其实不是真正的实体User,它只是一个别名。再往上看最开始的配置文件,
<typeAlias alias="User" type="com.example.user.entity.User"></typeAlias>
这一行就是定义别名的,因为我们的类型名实在是太长,所以我们取个别名。简化一下,只要先配置了别名,所有的mybatis配置文件内都可以用简化的别名,但是要注意唯一性。所以这个地方的User其实是com.example.user.entity.User。三》有了上面的配置文件了,我们就需要实现dao,先需要一个IUserdao接口。
public interface IUserDao {

    public boolean addUser(User user);

    public boolean updateUser(User user);

    public boolean deleteUser(int id);

    public List<User> showUsers();

    public User getOneUser(User user);

    public boolean ifUserNameHave(String username);
}

然后我们来实现这个接口
public class UserDaoImpl extends SqlSessionDaoSupport implements IUserDao {

    @Override
    public boolean addUser(User user) {
        int serializableid = getSqlSession().insert("com.example.user.UserMapper.addUser", user);
        if (serializableid == 0) {
            return false;
        }
        return true;
    }

    @Override
    public boolean updateUser(User user) {
        int serializableid = getSqlSession().update("com.example.user.UserMapper.updateUser", user);
        if (serializableid == 0) {
            return false;
        }
        return true;
    }

    @Override
    public boolean deleteUser(int id) {
        int serializableid = getSqlSession().delete("com.example.user.UserMapper.deleteUser", id);
        if (serializableid == 0) {
            return false;
        }
        return true;
    }

    @Override
    public List<User> showUsers() {
        return getSqlSession().selectList("com.example.user.UserMapper.showUsers");
    }

    @Override
    public User getOneUser(User user) {
        Object obj = getSqlSession().selectOne("com.example.user.UserMapper.getOneUser", user);
        if (obj == null) {
            return null;
        }
        return (User) obj;
    }

    @Override
    public boolean ifUserNameHave(String username) {
        Object obj = getSqlSession().selectOne("com.example.user.UserMapper.ifUserNameHave", username);
        if (obj == null) {
            return false;
        }
        return true;
    }
}

注意我这里是继承了spring的SqlSessionDaoSupport。这里面有个getSqlSession()方法,其实它跟hibernate里面的getHibernateTemplate()是差不多一个意思。使用这个方法后需要填入一个参数,第一个参数就是对应映射文件的对应方法。怎么对应映射文件,好了,现在上面的映射文件配置的namespace就用到了,也就是com.example.user.UserMapper这个值。然后再加上映射文件里面对应的id。而第二个参数与映射文件里面的parameterType是对应的。比如在配置文件中,id为ifUserNameHave的sql中,parameterType是string类型,对应daoimpl的方法参数就是String。在id为getOneUser的sql中,parameterType是User,对应参数也是User。如果没有继承这个类,我们需要实现TypeHandler(org.mybatis.type.TypeHandler)。这里以后再说。这里收藏一个讲解ibatis的文章(http://8366.iteye.com/category/68653)


   

你可能感兴趣的:(Mybatis)