最近研究了一下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)