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依赖配置如下:

  1. <dependency>
  2. <groupId>org.mybatis</groupId>
  3. <artifactId>mybatis</artifactId>
  4. <version>3.1.1</version>
  5. </dependency>

依赖仓库配置:

  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:配置数据源和隐射文件

  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

  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. @Delete(" delete from users where id=#{id}")
  5. void delete(String id);
  6. @Update(" update users set username=#{username},password=#{password} where id=#{id}")
  7. int update(@Param("username") String username,@Param("password")String password,@Param("id")String id);
  8. @Select(" select * from users where id=#{id}")
  9. User getUser(String id);
  10. @Select(" select * from users order by id asc ")
  11. List<User> getUsers();
  12. @Select(" select * from users order by id asc limit #{pageSize} offset #{offset} ")
  13. List<User> getUsersByPage(@Param("offset")int offset,@Param("pageSize") int pageSize);//offset=pageSize*(page-1)}?
  14. }

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

6.2获取数据源

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

6.3DAO层:数据访问

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

6.4servlet实现数据跳转访问

  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实体对象配置

  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表并添加数据

  1. /*
  2. Navicat MySQL Data Transfer
  3. Source Server         : localhost
  4. Source Server Version : 50513
  5. Source Host           : localhost:3306
  6. Source Database       : mybatis
  7. Target Server Type    : MYSQL
  8. Target Server Version : 50513
  9. File Encoding         : 65001
  10. Date: 2012-12-17 18:25:15
  11. */
  12. SET FOREIGN_KEY_CHECKS=0;
  13. -- ----------------------------
  14. -- Table structure for `users`
  15. -- ----------------------------
  16. DROP TABLE IF EXISTS `users`;
  17. CREATE TABLE `users` (
  18. `id` varchar(50) NOT NULL,
  19. `username` varchar(30) DEFAULT NULL,
  20. `password` varchar(20) DEFAULT NULL,
  21. `name` varchar(30) DEFAULT NULL,
  22. `nickname` varchar(30) DEFAULT NULL,
  23. `sex` varchar(10) DEFAULT NULL,
  24. `picture` varchar(255) DEFAULT NULL,
  25. `createtime` varchar(20) DEFAULT NULL,
  26. `lastlogintime` varchar(50) DEFAULT NULL,
  27. `tilepath` varchar(255) DEFAULT NULL,
  28. PRIMARY KEY (`id`)
  29. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  30. -- ----------------------------
  31. -- Records of users
  32. -- ----------------------------
  33. 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');
  34. 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');
  35. 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');
  36. 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');
  37. 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');
  38. 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');
  39. 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');
  40. 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');
  41. 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');
  42. 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的配置

  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. <web-app>
  5. <display-name>Archetype Created Web Application</display-name>
  6. <servlet>
  7. <servlet-name>DefaultUserListHandler</servlet-name>
  8. <display-name>DefaultUserListHandler</display-name>
  9. <description></description>
  10. <servlet-class>com.boonya.mybatis.servlet.DefaultUserListHandler</servlet-class>
  11. </servlet>
  12. <servlet-mapping>
  13. <servlet-name>DefaultUserListHandler</servlet-name>
  14. <url-pattern>/userservice</url-pattern>
  15. </servlet-mapping>
  16. <welcome-file-list>
  17. <welcome-file>index.html</welcome-file>
  18. </welcome-file-list>
  19. </web-app>

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

maven中使用mybatis的更多相关文章

  1. 使用IDEA在Maven中创建MyBatis逆向工程以及需要注意的问题(入门)

    逆向工程简介: mybatis官方提供逆向工程,可以针对单表自动生成mybatis执行所需要的代码(mapper.java.mapper.xml.pojo…),可以让程序员将更多的精力放在繁杂的业务逻 ...

  2. 如何在Eclipse中搭建MyBatis基本开发环境?(使用Eclipse创建Maven项目)

    实现要求: 在Eclipse中搭建MyBatis基本开发环境. 实现步骤: 1.使用Eclipse创建Maven项目.File >> New >> Maven Project ...

  3. 基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建

    基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建 前言 最近做回后台开发,重新抓起以前学过的SSM(Spring+Sp ...

  4. IDEA Maven项目的Mybatis逆向工程

    IDEA Maven项目的Mybatis逆向工程 1.配置.pom 如果是在多模块开发下,该文件逆向工程要生成的那个模块下的pom文件. <build> <plugins> & ...

  5. 记录-项目java项目框架搭建的一些问题(maven+spring+springmvc+mybatis)

    伴随着项目框架的落成后,本以为启动就能成功的,but.... 项目启动开始报错误1:java.lang.ClassNotFoundException: org.springframework.web. ...

  6. java实现微信支付宝等多个支付平台合一的二维码支付(maven+spring springmvc mybatis框架)

    首先申明,本人实现微信支付宝等支付平台合多为一的二维码支付,并且实现有效时间内支付有效,本人采用的框架是spring springmvc mybatis 框架,maven管理.其实如果支付,不需要my ...

  7. Maven 项目使用mybatis的环境搭建-基于xml形式实现查询所有的功能

    首先了解一下什么是 MyBatis? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. ...

  8. Maven项目使用mybatis报错 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

    maven项目使用mybatis时,找不到mapper文件(.xml) 错误信息提示: 项目可以正常运行,但是在有请求到达服务器时(有访问数据库的请求),会出现报错!! 错误原因: mybatis没有 ...

  9. 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+SpringMVC项目详解

    http://blog.csdn.net/noaman_wgs/article/details/53893948 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+Spri ...

随机推荐

  1. Ueditor富编辑器

    坑多的Ueditor富编辑器 第一步:修改serverUrl: window.BASEPATH + "notice/word" 第二部:添加依赖包 <dependency&g ...

  2. (转载)比较web ui 框架

    以下是几个精致的web UI框架 1.Aliceui Aliceui是支付宝的样式解决方案,是一套精选的基于 spm 生态圈的样式模块集合,是 Arale 的子集,也是一套模块化的样式命名和组织规范, ...

  3. mysql和mongodb的区别

    1.mongodb的概括 MongoDB(文档型数据库):提供可扩展的高性能数据存储 2.mongodb的功能概括 (1)基于分布式文件存储 (2)高负载情况下添加更多节点,可以保证服务器性能 (3) ...

  4. WPF内嵌WCF服务对外提供接口

    要测试本帖子代码请记得管理员权限运行vs. 我写这个帖子的初衷是在我做surface小车的时候有类似的需求,感觉这个功能还挺有意思的,所以就分享给大家,网上有很多关于wcf的文章 我就不一一列举了.公 ...

  5. PostGIS解析Geometry几何对象

    一.Geometry转WKT select st_astext(geom) where tableName; 二.PostGIS常用函数 wkt转geometry st_geomfromtext(wk ...

  6. php7 memcache和memcached.so扩展

    php7安装memcache和memcached扩展 https://github.com/websupport-sk/pecl-memcache https://github.com/php-mem ...

  7. Oracle学习总结(7)—— 常用的数据库索引优化语句总结

    不管是用C/C++/Java等代码编写的程序,还是SQL编写的数据库脚本,都存在一个持续优化的过程.也就是说,代码优化对于程序员来说,是一个永恒的话题. 近期,我们对之前编写的数据库脚本进行了全面的自 ...

  8. wipefs进程是啥,占用了百分之90多的cpu

    http://www.cnblogs.com/liuchuyu/p/7490338.html

  9. C语言之文件操作04——输入矩阵a,b,求乘积c,并打印a,b,c到文件

    //文件与数组结合 /* ================================================================= 题目:输入矩阵a,b,求乘积c,并打印a, ...

  10. 【Hibernate学习】 ——ORM(二)

    上篇博客主要介绍了一对一的关系,主要理解单向与双向的差别,主键关联与唯一外键关联的差别.以下继续介绍一对多与多对多关联. 一对多关联映射 一个班级相应多个学生 watermark/2/text/aHR ...