1、Mybatis优缺点
优点: Mybatis实现了对Dao层的封装,隔离了SQL语句,便于管理,避免了像JDBC那样操作数据集,便于扩展等等。
缺点: Mybatis属于?半自动“ORM”,比Hibernate的工作做得要多很多,对象参数传递比较麻烦,没有Hibernate对象操作的概念。
2、Mybatis的实现方式
Mybatis提供两种应用实现:XML配置和注解。
2.1配置主要依赖实体对象的xml文件,将对象以<resultMap>形式注入,并提供给<insert > <delete > <select> <update> 语句引用。
2.2使用注解来的比配置XML文件要简单得多。只需要在接口上添加相应的注解并附上SQL语句就行了,如:
插入语句:@insert(" insert into table_user ..")
修改语句: @update(" update table_user set ....")
删除语句:@delete(" delete from table_user .....")
查询语句:@select(" select * from table_user .....")
3、下载mybatis的jar包:mybatis-3.1.1-bundle.zip?,网址:http://code.google.com/p/mybatis/
4、构建自己的mybatis项目,如图所示:
5、mybatis-config.xml:配置数据源和隐射文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-config.dtd"> <configuration> <environments default="environment"> <environment id="environment"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding =UTF-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- <mappers> <mapper resource="mybatis/User.xml"/> </mappers> --> </configuration>
注:mappers部分字体是使用实体配置的实现,如果使用注解则不需要添加。
6、使用注解实现CRUD操作-此处以实现用户管理为例
6.1编写接口(interface):实际上就是官方文档所述的Mapper
public interface UserService { @Insert(" insert into users (id,username,password) values (#{id},#{username},#{password})") void add(@Param("id")String id,@Param("username") String username,@Param("password")String password); @Delete(" delete from users where id=#{id}") void delete(String id); @Update(" update users set username=#{username},password=#{password} where id=#{id}") int update(@Param("username") String username,@Param("password")String password,@Param("id")String id); @Select(" select * from users where id=#{id}") User getUser(String id); @Select(" select * from users order by id asc ") List<User> getUsers(); @Select(" select * from users order by id asc limit #{pageSize} offset #{offset} ") List<User> getUsersByPage(@Param("offset")int offset,@Param("pageSize") int pageSize);//offset=pageSize*(page-1)}?
注:使用注解时接口的方法不能重载,否者会产生Mapped Statements collection does not contain value for 异常,另外还应尽量避免配置和注解混合使用的情况。
6.2获取数据源
public class GetSqlSessionFactory { private static SqlSessionFactory sqlSessionFactory = null; private static GetSqlSessionFactory getSqlSessionFactory = null; private GetSqlSessionFactory(){ String rs = "mybatis-config.xml"; Reader reader = null; try { reader = Resources.getResourceAsReader(rs); } catch (IOException e) { e.printStackTrace(); } sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); //注解方式查询时需要注册mapper sqlSessionFactory.getConfiguration().addMapper(UserService.class); } public static GetSqlSessionFactory getInstance(){ if(getSqlSessionFactory == null) getSqlSessionFactory = new GetSqlSessionFactory(); return getSqlSessionFactory; } public static SqlSessionFactory getSqlSessionFactory(){ return sqlSessionFactory; } }
6.3DAO层:数据访问
public class UserDao { @SuppressWarnings("static-access") public void add(String id,String username,String password) { SqlSession session =GetSqlSessionFactory.getInstance().getSqlSessionFactory().openSession(); try { session.getMapper(UserService.class).add(id,username,password); session.commit();//提交事务 } catch (Exception e) { e.printStackTrace(); }finally{ session.close(); } } @SuppressWarnings("static-access") public void delete(String id) { SqlSession session=GetSqlSessionFactory.getInstance().getSqlSessionFactory().openSession(); try { session.getMapper(UserService.class).delete(id); session.commit();//提交事务 } catch (Exception e) { e.printStackTrace(); }finally{ session.close(); } } @SuppressWarnings("static-access") public int update(String username,String password,String id) { int count=0; SqlSession session=GetSqlSessionFactory.getInstance().getSqlSessionFactory().openSession(); try { // Map<String, Object> map=new HashMap<String, Object>(); // map.put("username", user.getUsername()); // map.put("password", user.getPassword()); // session.update("updateUser", map); count=session.getMapper(UserService.class).update(username,password,id); session.commit();//提交事务 } catch (Exception e) { count=0; e.printStackTrace(); }finally{ session.close(); } return count; } @SuppressWarnings("static-access") public List<User> getUsers(int offset, int pageSize) { List<User> users=new ArrayList<User>(); SqlSession session =GetSqlSessionFactory.getInstance().getSqlSessionFactory().openSession(); try { //users=session.selectList("user_list_page", new User(),new RowBounds(offset,pageSize));//未测试过 //注解方式查询 users=session.getMapper(UserService.class).getUsersByPage(offset, pageSize); } catch (Exception e) { e.printStackTrace(); }finally{ session.close(); } return users; } }
6.4servlet实现数据跳转访问
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); UserService userService=new UserServiceImpl(); PrintWriter out = response.getWriter(); String method=request.getParameter("method"); String returnString=""; //方法入口 if(method.equals("users")){ returnString=new JsonUtil<User>().getJsonByListObj(userService.getUsers()); }else if(method.equals("user")){ String id=request.getParameter("id"); returnString=new JsonUtil<User>().getJsonByEntity(userService.getUser(id)); }else if(method.equals("delete")){ String id=request.getParameter("id"); Map<String,Object> map=new HashMap<String, Object>(); map.put("event", method); map.put("param", id); returnString=new JsonUtil<User>().getJsonByObject(map); }else if(method.equals("update")){ String id=request.getParameter("id"); String username=request.getParameter("username"); String password=request.getParameter("password"); Map<String,Object> map=new HashMap<String, Object>(); int count=userService.update(username, password,id); map.put("status",count==0?false:true); map.put("event", method); map.put("param", id); returnString=new JsonUtil<User>().getJsonByObject(map); }else if(method.equals("paginate")){ int limit=Integer.valueOf(request.getParameter("pageSize")); int offset=Integer.valueOf(request.getParameter("offset")); returnString=new JsonUtil<User>().getJsonByListObj(userService.getUsersByPage(offset, limit)); } //输出JSON数据 out.print(returnString); out.flush(); out.close(); }
至此,注解方式的实现就全部完成了。
7、XML实体对象配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.boonya.mybatis.entity.User"> <resultMap id="UserResultMap" type="com.boonya.mybatis.entity.User"> <result property="id" column="id" jdbcType="VARCHAR" javaType="string"/> <result property="name" column="name" javaType = "string" jdbcType="VARCHAR"/> <result property="createtime" column="createtime" javaType = "string" jdbcType="VARCHAR"/> <result property="tilepath" column="tilepath" javaType = "string" jdbcType="VARCHAR"/> <result property="lastlogintime" column="lastlogintime" javaType = "string" jdbcType="VARCHAR"/> <result property="nickname" column="nickname" javaType = "string" jdbcType="VARCHAR"/> <result property="password" column="password" javaType = "string" jdbcType="VARCHAR"/> <result property="picture" column="picture" javaType = "string" jdbcType="VARCHAR"/> <result property="sex" column="sex" javaType = "string" jdbcType="VARCHAR"/> <result property="username" column="username" javaType = "string" jdbcType="VARCHAR"/> </resultMap> <!-- 一般的SQL查询或操作语句配置--> <select id="user" parameterType="int" resultType="com.boonya.mybatis.entity.User" resultMap="UserResultMap">select * from users where id=#{id} </select> <select id="users" resultMap="UserResultMap">select * from users order by id asc </select> <insert id="addUser" parameterType="com.boonya.mybatis.entity.User" parameterMap="UserResultMap">insert into users (id,name,createtime,email,tilepath,lastloginip,lastlogintime,nickname,password,picture,sessionid,sex,tel,username) values (#{id},#{name},#{createtime},#{email},#{tilepath},#{lastloginip},#{lastlogintime},#{nickname},#{password},#{picture},#{sessionid},#{sex},#{tel},#{username})</insert> <!-- Dynamic SQL 这里的方法未经测试 --> <!-- IF --> <select id="dynamic_user" resultMap="UserResultMap">select * from users where username=#{username} <if test="name!=null">and name=#{name}</if> </select> <!-- FOREACH --> <select id="dynamic_users" resultMap="UserResultMap">select * from users name=#{name} and createtime in <foreach collection="list" item="classTimeList" open="(" separator="," close=")"> #{classTimeList} </foreach> </select> <!-- choose when otherwise--> <select id="dynamic_findNameLike" resultMap="UserResultMap"> SELECT * FROM USERS WHERE NAME IS NOT NULL <choose> <when test="nickname!=null">AND nickname like #{nickname}</when> <when test="picture!=null ">AND picture like #{picture}</when> <otherwise>AND lastlogintime > #{lastlogintime}</otherwise> </choose> </select> <!-- WHERE --> <select id="dynamic_findUSERSLike" resultMap="UserResultMap">select * from users <where> <if test="name!=null">WHERE name LIKE #{name}</if> </where> </select> </mapper>
注:如果使用配置需将mybatis-config.xml文件的mapper去掉注释:
<!-- <mappers>
<mapper resource="mybatis/User.xml"/>
</mappers> -->
并且注释掉使用注解的mapper隐射:
//注解方式查询时需要注册mapper
sqlSessionFactory.getConfiguration().addMapper(UserService.class);
配置方式是根据SQL语句的隐射去访问的 如UserDao 中的getUsers方法:
//xml方式查询
//users=session.selectList("users");
注:刚开始学习mybatis的使用很多地方或细节不是很在意,如某些地方存在问题希望指点一二!