maven中使用mybatis

Posted on 2016-11-08 10:35  痴人说梦SKILL  阅读(5306)  评论(0编辑  收藏  举报

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/

Maven的pom.xml依赖配置如下:

 

[html] view plain copy
 
  1. <dependency>  
  2.    <groupId>org.mybatis</groupId>  
  3.    <artifactId>mybatis</artifactId>  
  4.    <version>3.1.1</version>  
  5.  </dependency>  

 

依赖仓库配置:

 

[html] view plain copy
 
  1. <repository>  
  2.     <id>mybatis-snapshot</id>  
  3.     <name>MyBatis Snapshot Repository</name>  
  4.     <url>https://oss.sonatype.org/content/repositories/snapshots</url>  
  5. </repository>  

 

4、构建自己的mybatis项目,如图所示:

展开文件展示:



5、mybatis-config.xml:配置数据源和隐射文件

 

[html] view plain copy
 
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">  
  3. <configuration>  
  4.     <environments default="environment">  
  5.         <environment id="environment">  
  6.             <transactionManager type="JDBC" />  
  7.             <dataSource type="POOLED">  
  8.                 <property name="driver" value="com.mysql.jdbc.Driver" />  
  9.                 <property name="url"  
  10.                     value="jdbc:mysql://localhost:3306/mybatis?characterEncoding =UTF-8" />  
  11.                 <property name="username" value="root" />  
  12.                 <property name="password" value="root" />  
  13.             </dataSource>  
  14.         </environment>  
  15.     </environments>  
  16.        <!-- <mappers> <mapper resource="mybatis/User.xml"/> </mappers> -->  
  17. </configuration>  

 

注:<!-- <mappers> <mapper resource="mybatis/User.xml"/> </mappers> -->是使用实体配置的实现,如果使用注解则不需要添加。

6、使用注解实现CRUD操作-此处以实现用户管理为例

6.1编写接口(interface):实际上就是官方文档所述的Mapper

 

[java] view plain copy
 
  1. public interface UserService {  
  2.      @Insert(" insert into users (id,username,password) values (#{id},#{username},#{password})")  
  3.      void add(@Param("id")String id,@Param("username") String username,@Param("password")String password);  
  4.   
  5.      @Delete(" delete from users where id=#{id}")   
  6.      void delete(String id);  
  7.   
  8.      @Update(" update users set username=#{username},password=#{password} where id=#{id}")  
  9.      int update(@Param("username") String username,@Param("password")String password,@Param("id")String id);  
  10.   
  11.      @Select(" select * from users where id=#{id}")  
  12.      User getUser(String id);  
  13.   
  14.      @Select(" select * from users order by id asc ")  
  15.      List<User> getUsers();   
  16.   
  17.      @Select(" select * from users order by id asc limit #{pageSize} offset #{offset} ")  
  18.      List<User> getUsersByPage(@Param("offset")int offset,@Param("pageSize") int pageSize);//offset=pageSize*(page-1)}?  
  19. }  

 

注:使用注解时接口的方法不能重载,否者会产生Mapped Statements collection does not contain value for 异常,另外还应尽量避免配置和注解混合使用的情况。

6.2获取数据源

 

[java] view plain copy
 
  1. public class GetSqlSessionFactory  
  2. {  
  3.     private static SqlSessionFactory sqlSessionFactory = null;  
  4.       
  5.     private static GetSqlSessionFactory getSqlSessionFactory = null;  
  6.   
  7.     private GetSqlSessionFactory()  
  8.     {  
  9.         String rs = "mybatis-config.xml";  
  10.         Reader reader = null;  
  11.         try  
  12.         {  
  13.             reader = Resources.getResourceAsReader(rs);  
  14.         } catch (IOException e)  
  15.         {  
  16.             e.printStackTrace();  
  17.         }  
  18.         sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);  
  19.         // 注解方式查询时需要注册mapper  
  20.         sqlSessionFactory.getConfiguration().addMapper(UserService.class);  
  21.     }  
  22.   
  23.     public static GetSqlSessionFactory getInstance()  
  24.     {  
  25.         if (getSqlSessionFactory == null)  
  26.             getSqlSessionFactory = new GetSqlSessionFactory();  
  27.         return getSqlSessionFactory;  
  28.     }  
  29.   
  30.     public static SqlSessionFactory getSqlSessionFactory()  
  31.     {  
  32.         return sqlSessionFactory;  
  33.     }  
  34.   
  35. }  

 

6.3DAO层:数据访问

 

[java] view plain copy
 
  1. public class UserDao  
  2. {  
  3.     @SuppressWarnings("static-access")  
  4.     public void add(String id, String username, String password)  
  5.     {  
  6.         SqlSession session = GetSqlSessionFactory.getInstance().getSqlSessionFactory().openSession();  
  7.         try  
  8.         {  
  9.             session.getMapper(UserService.class).add(id, username, password);  
  10.             session.commit();// 提交事务  
  11.         } catch (Exception e)  
  12.         {  
  13.             e.printStackTrace();  
  14.         } finally  
  15.         {  
  16.             session.close();  
  17.         }  
  18.     }  
  19.   
  20.     @SuppressWarnings("static-access")  
  21.     public void delete(String id)  
  22.     {  
  23.         SqlSession session = GetSqlSessionFactory.getInstance().getSqlSessionFactory().openSession();  
  24.         try  
  25.         {  
  26.             session.getMapper(UserService.class).delete(id);  
  27.             session.commit();// 提交事务  
  28.         } catch (Exception e)  
  29.         {  
  30.             e.printStackTrace();  
  31.         } finally  
  32.         {  
  33.             session.close();  
  34.         }  
  35.     }  
  36.   
  37.     @SuppressWarnings("static-access")  
  38.     public int update(String username, String password, String id)  
  39.     {  
  40.         int count = 0;  
  41.         SqlSession session = GetSqlSessionFactory.getInstance().getSqlSessionFactory().openSession();  
  42.         try  
  43.         {  
  44.             // Map<String, Object> map=new HashMap<String, Object>();  
  45.             // map.put("username", user.getUsername());  
  46.             // map.put("password", user.getPassword());  
  47.             // session.update("updateUser", map);  
  48.             count = session.getMapper(UserService.class).update(username, password, id);  
  49.             session.commit();// 提交事务  
  50.         } catch (Exception e)  
  51.         {  
  52.             count = 0;  
  53.             e.printStackTrace();  
  54.         } finally  
  55.         {  
  56.             session.close();  
  57.         }  
  58.         return count;  
  59.     }  
  60.   
  61.     @SuppressWarnings("static-access")  
  62.     public List<User> getUsers(int offset, int pageSize)  
  63.     {  
  64.         List<User> users = new ArrayList<User>();  
  65.         SqlSession session = GetSqlSessionFactory.getInstance().getSqlSessionFactory().openSession();  
  66.         try  
  67.         {  
  68.             // users=session.selectList("user_list_page", new User(),new  
  69.             // RowBounds(offset,pageSize));//未测试过  
  70.             // 注解方式查询  
  71.             users = session.getMapper(UserService.class).getUsersByPage(offset, pageSize);  
  72.         } catch (Exception e)  
  73.         {  
  74.             e.printStackTrace();  
  75.         } finally  
  76.         {  
  77.             session.close();  
  78.         }  
  79.         return users;  
  80.     }  
  81. }  

 

6.4servlet实现数据跳转访问

 

[java] view plain copy
 
  1. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException  
  2.     {  
  3.         response.setContentType("text/html;charset=utf-8");  
  4.         UserService userService = new UserServiceImpl();  
  5.         PrintWriter out = response.getWriter();  
  6.         String method = request.getParameter("method");  
  7.         String returnString = "";  
  8.         // 方法入口  
  9.         if (method.equals("users"))  
  10.         {  
  11.             returnString = new JsonUtil<User>().getJsonByListObj(userService.getUsers());  
  12.         } else if (method.equals("user"))  
  13.         {  
  14.             String id = request.getParameter("id");  
  15.             returnString = new JsonUtil<User>().getJsonByEntity(userService.getUser(id));  
  16.         } else if (method.equals("delete"))  
  17.         {  
  18.             String id = request.getParameter("id");  
  19.             Map<String, Object> map = new HashMap<String, Object>();  
  20.             map.put("event", method);  
  21.             map.put("param", id);  
  22.             returnString = new JsonUtil<User>().getJsonByObject(map);  
  23.         } else if (method.equals("update"))  
  24.         {  
  25.             String id = request.getParameter("id");  
  26.             String username = request.getParameter("username");  
  27.             String password = request.getParameter("password");  
  28.             Map<String, Object> map = new HashMap<String, Object>();  
  29.             int count = userService.update(username, password, id);  
  30.             map.put("status", count == 0 ? false : true);  
  31.             map.put("event", method);  
  32.             map.put("param", id);  
  33.             returnString = new JsonUtil<User>().getJsonByObject(map);  
  34.         } else if (method.equals("paginate"))  
  35.         {  
  36.             int limit = Integer.valueOf(request.getParameter("pageSize"));  
  37.             int offset = Integer.valueOf(request.getParameter("offset"));  
  38.             returnString = new JsonUtil<User>().getJsonByListObj(userService.getUsersByPage(offset, limit));  
  39.         }  
  40.         // 输出JSON数据  
  41.         out.print(returnString);  
  42.         out.flush();  
  43.         out.close();  
  44.     }  

 

至此,注解方式的实现就全部完成了。

7、User.xml实体对象配置

 

[html] view plain copy
 
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">  
  3. <mapper namespace="com.boonya.mybatis.entity.User">  
  4.     <resultMap id="UserResultMap" type="com.boonya.mybatis.entity.User">  
  5.         <result property="id" column="id" jdbcType="VARCHAR" javaType="string" />  
  6.         <result property="name" column="name" javaType="string"  
  7.             jdbcType="VARCHAR" />  
  8.         <result property="createtime" column="createtime" javaType="string"  
  9.             jdbcType="VARCHAR" />  
  10.         <result property="tilepath" column="tilepath" javaType="string"  
  11.             jdbcType="VARCHAR" />  
  12.         <result property="lastlogintime" column="lastlogintime"  
  13.             javaType="string" jdbcType="VARCHAR" />  
  14.         <result property="nickname" column="nickname" javaType="string"  
  15.             jdbcType="VARCHAR" />  
  16.         <result property="password" column="password" javaType="string"  
  17.             jdbcType="VARCHAR" />  
  18.         <result property="picture" column="picture" javaType="string"  
  19.             jdbcType="VARCHAR" />  
  20.         <result property="sex" column="sex" javaType="string" jdbcType="VARCHAR" />  
  21.         <result property="username" column="username" javaType="string"  
  22.             jdbcType="VARCHAR" />  
  23.     </resultMap>  
  24.     <span style="color:#ff0000"><!-- 一般的SQL查询或操作语句配置 --></span>  
  25.     <select id="user" parameterType="int" resultType="com.boonya.mybatis.entity.User"  
  26.         resultMap="UserResultMap">select * from users where id=#{id} </select>  
  27.     <select id="users" resultMap="UserResultMap">select * from users order by id asc  
  28.     </select>  
  29.     <insert id="addUser" parameterType="com.boonya.mybatis.entity.User"  
  30.         parameterMap="UserResultMap">insert into users  
  31.         (id,name,createtime,email,tilepath,lastloginip,lastlogintime,nickname,password,picture,sessionid,sex,tel,username)  
  32.         values  
  33.         (#{id},#{name},#{createtime},#{email},#{tilepath},#{lastloginip},#{lastlogintime},#{nickname},#{password},#{picture},#{sessionid},#{sex},#{tel},#{username})  
  34.     </insert>  
  35.     <span style="color:#ff0000"><!-- Dynamic SQL 这里的方法未经测试 -->  
  36.     <!-- IF --></span>  
  37.     <select id="dynamic_user" resultMap="UserResultMap">  
  38.         select * from users where username=#{username}  
  39.         <if test="name!=null">and name=#{name}</if>  
  40.     </select>  
  41.     <span style="color:#ff0000"><!-- FOREACH --></span>  
  42.     <select id="dynamic_users" resultMap="UserResultMap">  
  43.         select * from users name=#{name} and createtime in  
  44.         <foreach collection="list" item="classTimeList" open="("  
  45.             separator="," close=")"> #{classTimeList} </foreach>  
  46.     </select>  
  47.     <span style="color:#ff0000"><!-- choose when otherwise --></span>  
  48.     <select id="dynamic_findNameLike" resultMap="UserResultMap">  
  49.         SELECT * FROM USERS WHERE NAME IS NOT NULL  
  50.         <choose>  
  51.             <when test="nickname!=null">AND nickname like #{nickname}</when>  
  52.             <when test="picture!=null ">AND picture like #{picture}</when>  
  53.             <otherwise>AND lastlogintime > #{lastlogintime}</otherwise>  
  54.         </choose>  
  55.     </select>  
  56.     <span style="color:#ff0000"><!-- WHERE --></span>  
  57.     <select id="dynamic_findUSERSLike" resultMap="UserResultMap">  
  58.         select * from users  
  59.         <where>  
  60.             <if test="name!=null">WHERE name LIKE #{name}</if>  
  61.         </where>  
  62.     </select>  
  63. </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");

8、测试数据是否能够正常访问

8-1、数据库mybatis创建users表并添加数据

 

[sql] view plain copy
 
  1. /*  
  2. Navicat MySQL Data Transfer  
  3.   
  4. Source Server         : localhost  
  5. Source Server Version : 50513  
  6. Source Host           : localhost:3306  
  7. Source Database       : mybatis  
  8.   
  9. Target Server Type    : MYSQL  
  10. Target Server Version : 50513  
  11. File Encoding         : 65001  
  12.   
  13. Date: 2012-12-17 18:25:15  
  14. */  
  15.   
  16. SET FOREIGN_KEY_CHECKS=0;  
  17.   
  18. -- ----------------------------  
  19. -- Table structure for `users`  
  20. -- ----------------------------  
  21. DROP TABLE IF EXISTS `users`;  
  22. CREATE TABLE `users` (  
  23.   `id` varchar(50) NOT NULL,  
  24.   `username` varchar(30) DEFAULT NULL,  
  25.   `password` varchar(20) DEFAULT NULL,  
  26.   `name` varchar(30) DEFAULT NULL,  
  27.   `nickname` varchar(30) DEFAULT NULL,  
  28.   `sex` varchar(10) DEFAULT NULL,  
  29.   `picture` varchar(255) DEFAULT NULL,  
  30.   `createtime` varchar(20) DEFAULT NULL,  
  31.   `lastlogintime` varchar(50) DEFAULT NULL,  
  32.   `tilepath` varchar(255) DEFAULT NULL,  
  33.   PRIMARY KEY (`id`)  
  34. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  
  35.   
  36. -- ----------------------------  
  37. -- Records of users  
  38. -- ----------------------------  
  39. INSERT INTO `users` VALUES ('HUSDHSHFSD_00001', 'BOONYA', '123456', 'BOONYA_U', 'BOONYA_*', '男', 'images/inde.png', '2012-12-17 15:30:23', '1832928398932', 'this/home/index.tile');  
  40. INSERT INTO `users` VALUES ('HUSDHSHFSD_000010', 'BOONYA', '123456', 'BOONYA_U', 'BOONYA_*', '男', 'images/inde.png', '2012-12-17 15:30:23', '1832928398932', 'this/home/index.tile');  
  41. INSERT INTO `users` VALUES ('HUSDHSHFSD_00002', 'BOONYA', '123456', 'BOONYA_U', 'BOONYA_*', '女', 'images/inde.png', '2012-12-17 15:30:23', '1832928398932', 'this/home/index.tile');  
  42. INSERT INTO `users` VALUES ('HUSDHSHFSD_00003', 'BOONYA', '123456', 'BOONYA_U', 'BOONYA_*', '男', 'images/inde.png', '2012-12-17 15:30:23', '1832928398932', 'this/home/index.tile');  
  43. INSERT INTO `users` VALUES ('HUSDHSHFSD_00004', 'BOONYA', '123456', 'BOONYA_U', 'BOONYA_*', '男', 'images/inde.png', '2012-12-17 15:30:23', '1832928398932', 'this/home/index.tile');  
  44. INSERT INTO `users` VALUES ('HUSDHSHFSD_00005', 'BOONYA', '123456', 'BOONYA_U', 'BOONYA_*', '女', 'images/inde.png', '2012-12-17 15:30:23', '1832928398932', 'this/home/index.tile');  
  45. INSERT INTO `users` VALUES ('HUSDHSHFSD_00006', 'BOONYA', '123456', 'BOONYA_U', 'BOONYA_*', '男', 'images/inde.png', '2012-12-17 15:30:23', '1832928398932', 'this/home/index.tile');  
  46. INSERT INTO `users` VALUES ('HUSDHSHFSD_00007', 'BOONYA', '123456', 'BOONYA_U', 'BOONYA_*', '男', 'images/inde.png', '2012-12-17 15:30:23', '1832928398932', 'this/home/index.tile');  
  47. INSERT INTO `users` VALUES ('HUSDHSHFSD_00008', 'BOONYA', '123456', 'BOONYA_U', 'BOONYA_*', '男', 'images/inde.png', '2012-12-17 15:30:23', '1832928398932', 'this/home/index.tile');  
  48. INSERT INTO `users` VALUES ('HUSDHSHFSD_00009', 'BOONYA', '123456', 'BOONYA_U', 'BOONYA_*', '女', 'images/inde.png', '2012-12-17 15:30:23', '1832928398932', 'this/home/index.tile');  

 

8-2、修改web.xml的servlet的配置

 

[html] view plain copy
 
  1. <!DOCTYPE web-app PUBLIC  
  2.  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  
  3.  "http://java.sun.com/dtd/web-app_2_3.dtd" >  
  4.   
  5. <web-app>  
  6.   <display-name>Archetype Created Web Application</display-name>  
  7.   <servlet>  
  8.     <servlet-name>DefaultUserListHandler</servlet-name>  
  9.     <display-name>DefaultUserListHandler</display-name>  
  10.     <description></description>  
  11.     <servlet-class>com.boonya.mybatis.servlet.DefaultUserListHandler</servlet-class>  
  12.   </servlet>  
  13.   <servlet-mapping>  
  14.     <servlet-name>DefaultUserListHandler</servlet-name>  
  15.     <url-pattern>/userservice</url-pattern>  
  16.   </servlet-mapping>  
  17.     
  18.   <welcome-file-list>  
  19.          <welcome-file>index.html</welcome-file>  
  20.  </welcome-file-list>  
  21.    
  22. </web-app>  

将mybatis项目部署到Tomcat服务器中,启动服务器,在浏览器输入:http://localhost:8080/mybatis/userservice?method=users会看到如下图所示的结果: