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. Converting Legacy Chrome IPC To Mojo

    Converting Legacy Chrome IPC To Mojo Looking for Mojo Documentation? Contents Overview Deciding What ...

  2. win10 无法访问XP 共享目录原因

    win10 无法访问XP 共享目录原因     *现象:  在地址栏中输入\\192.168.100.5 (XP文件服务器),出现:.....找不到网络路径, 此连接尚未还原.             ...

  3. VB学习生成JavaBean

    Application.ActiveWorkbook.Path 获取当前excel文件所在的文件地址 Excel VBA中表示当前工作簿,有Activeworkbook和Thisworkbook 两种 ...

  4. (二)React简介

    React简介 2-1: React v16 (React Fiber) React比Vue更灵活 Vue更简单 2-2 开发环境搭建 如何开始:(两种方式) 1.传统方式script标签引入.js文 ...

  5. ajax 不执行

    1.get形式访问: 一个相同的URL 只有一个结果,所以 第二次访问的时候 如果 URL字符串没变化 浏览器是 直接拿出了第一次访问的结果,post则不会 解决办法: 1.url+new Date( ...

  6. [原创]Linux 下 redis 链接一次

    刚接触 Linux ,在 Linux 下安装 redis 链接redis 出现了以下问题  Could not connect to Redis at 127.0.0.1:6379: Connecti ...

  7. Android干货大放送:书籍、教程、工具各种全

    最全干货分享,本文收集整理了Android开发所需的书籍.教程.工具.资讯和周刊各种资源,它们能让你在Android开发之旅的各个阶段都受益. 入门 <Learning Android(中文版) ...

  8. ShopEx文章页添加上一篇下一篇功能

    在全部的文章页中,会常常发现都会有这么一个功能.能引导用户去查看上一篇文章或下一篇文章,而在ShopEx中,我DEZEND了一下文章模型.并没有找到上一篇这种函数功能,因此,这就须要我们手动在相应的文 ...

  9. 【POJ 1845】 Sumdiv (整数唯分+约数和公式+二分等比数列前n项和+同余)

    [POJ 1845] Sumdiv 用的东西挺全 最主要通过这个题学了约数和公式跟二分求等比数列前n项和 另一种小优化的整数拆分  整数的唯一分解定理: 随意正整数都有且仅仅有一种方式写出其素因子的乘 ...

  10. php使用flock堵塞写入文件和非堵塞写入文件

    php使用flock堵塞写入文件和非堵塞写入文件 堵塞写入代码:(全部程序会等待上次程序运行结束才会运行,30秒会超时) <?php $file = fopen("test.txt&q ...