zoukankan      html  css  js  c++  java
  • maven中使用mybatis

    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会看到如下图所示的结果:

  • 相关阅读:
    页面引入js问题
    python之循环语句与注释
    python之字符串格式化方法
    python之对象的方法
    python之函数
    python之条件判断
    python之布尔表达式
    python之列表与元组
    python之字符串
    搞不明白的recycling process 和 finalization process
  • 原文地址:https://www.cnblogs.com/SKILL0825/p/6041976.html
Copyright © 2011-2022 走看看