一、原生态jdbc程序存在的问题:

mybatis框架原理、执行过程:

二、入门程序

完成入门程序的以下需求:

1.根据用户id(主键)查询用户信息:
2.根据用户名称模糊查询用户信息:
3.添加用户
4.根据id删除用户:
5.根据id更新用户:

1)环境搭建:

mybatis下载地址:https://github.com/mybatis/

导入jar包,工程结构:

关于配置文件的配置:

/mybatis/config/log4j.properties:开发环境设置成debug:

  1. # Global logging configuration
  2. log4j.rootLogger=DEBUG, stdout
  3. # Console output...
  4. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  5. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  6. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

/mybatis/config/db.properties:

  1. jdbc.driver=com.mysql.jdbc.Driver
  2. jdbc.url=jdbc:mysql://localhost:3306/mybatis
  3. jdbc.username=root
  4. jdbc.password=root

数据库配置

/mybatis/config/SqlMapConfig.xml:mybatis配置文件

这里的是mybatis独立运行的配置,并没有整合:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6.  
  7. <!-- 加载属性文件 -->
  8. <properties resource="db.properties">
  9. <!--properties中还可以配置一些属性名和属性值 -->
  10. <!-- <property name="jdbc.driver" value=""/> -->
  11. </properties>
  12.  
  13. <!-- 和spring整合后 environments配置将废除-->
  14. <environments default="development">
  15. <environment id="development">
  16. <!-- 使用jdbc事务管理,事务控制由mybatis-->
  17. <transactionManager type="JDBC" />
  18. <!-- 数据库连接池,由mybatis管理-->
  19. <dataSource type="POOLED">
  20. <property name="driver" value="${jdbc.driver}" />
  21. <property name="url" value="${jdbc.url}" />
  22. <property name="username" value="${jdbc.username}" />
  23. <property name="password" value="${jdbc.password}" />
  24. </dataSource>
  25. </environment>
  26. </environments>
  27.  
  28. <!-- 加载 映射文件 -->
  29. <mappers>
  30. <mapper resource="sqlmap/User.xml"/>
  31. </mappers>
  32. </configuration>

POJO类:/mybatis/src/com/cy/po/User.java:

  1. package com.cy.po;
  2.  
  3. import java.util.Date;
  4.  
  5. public class User {
  6. //属性名和数据库表的字段对应
  7. private int id;
  8. private String username;// 用户姓名
  9. private String sex;// 性别
  10. private Date birthday;// 生日
  11. private String address;// 地址
  12. public int getId() {
  13. return id;
  14. }
  15. public void setId(int id) {
  16. this.id = id;
  17. }
  18. public String getUsername() {
  19. return username;
  20. }
  21. public void setUsername(String username) {
  22. this.username = username;
  23. }
  24. public String getSex() {
  25. return sex;
  26. }
  27. public void setSex(String sex) {
  28. this.sex = sex;
  29. }
  30. public Date getBirthday() {
  31. return birthday;
  32. }
  33. public void setBirthday(Date birthday) {
  34. this.birthday = birthday;
  35. }
  36. public String getAddress() {
  37. return address;
  38. }
  39. public void setAddress(String address) {
  40. this.address = address;
  41. }
  42. @Override
  43. public String toString() {
  44. return "------->> User [id=" + id + ", username=" + username + ", sex=" + sex
  45. + ", birthday=" + birthday + ", address=" + address + "]";
  46. }
  47. }

User实体类

User.xmlp配置statement:增、删、改、查

/mybatis/config/sqlmap/User.xml:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5.  
  6. <!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
  7. 注意:使用mapper代理方法开发,namespace有特殊重要的作用
  8. -->
  9. <mapper namespace="test">
  10. <!-- =============================================================================== -->
  11. <!-- 在 映射文件中配置很多sql语句 -->
  12. <!-- 需求:通过id查询用户表的记录 -->
  13. <!-- 通过 select执行数据库查询
  14. id:标识 映射文件中的 sql
  15. 将sql语句封装到mappedStatement对象中,所以将id称为statement的id
  16. parameterType:指定输入 参数的类型,这里指定int型
  17. #{}表示一个占位符号
  18. #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称
  19.  
  20. resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。
  21. -->
  22. <select id="findUserById" parameterType="int" resultType="com.cy.po.User">
  23. SELECT * FROM USER WHERE id=#{value}
  24. </select>
  25.  
  26. <!-- =============================================================================== -->
  27. <!-- 根据用户名称模糊查询用户信息,可能返回多条
  28. resultType:指定就是单条记录所映射的java对象 类型
  29. ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。
  30. 使用${}拼接sql,引起 sql注入
  31. ${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value
  32. -->
  33. <select id="findUserByName" parameterType="java.lang.String" resultType="com.cy.po.User">
  34. SELECT * FROM USER WHERE username LIKE '%${value}%'
  35. </select>
  36.  
  37. <!-- =============================================================================== -->
  38. <!-- 添加用户
  39. parameterType:指定输入 参数类型是pojo(包括 用户信息)
  40. #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值
  41. -->
  42. <insert id="insertUser" parameterType="com.cy.po.User">
  43. <!--
  44. 自增主键的返回:
  45. 将插入数据的主键返回,返回到user对象中
  46. SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用与自增主键
  47. keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性
  48. order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
  49. resultType:指定SELECT LAST_INSERT_ID()的结果类型
  50. -->
  51. <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
  52. SELECT LAST_INSERT_ID()
  53. </selectKey>
  54.  
  55. <!--
  56. 非自增主键返回(使用UUID())
  57. 使用mysql的uuid()生成主键 (需要修改表中id字段类型为String,长度设置成35位)
  58. 执行思路:
  59. 首先通过uuid()得到主键,将主键输入到sql语句中。
  60. 执行uuid()语句顺序相对于insert语句之前执行。
  61. -->
  62. <!-- <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
  63. SELECT uuid()
  64. </selectKey>
  65. insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) -->
  66.  
  67. <!--通过oracle的序列,生成主键:-->
  68. <!-- <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
  69. SELECT 序列名.nextval()
  70. </selectKey>
  71. insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) -->
  72.  
  73. insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
  74. </insert>
  75.  
  76. <!-- =============================================================================== -->
  77. <!-- 根据id删除 用户,需要输入 id值-->
  78. <delete id="deleteUser" parameterType="java.lang.Integer">
  79. delete from user where id=#{id}
  80. </delete>
  81.  
  82. <!-- =============================================================================== -->
  83. <!-- 根据id更新用户
  84. 分析:
  85. 需要传入用户的id
  86. 需要传入用户的更新信息
  87. parameterType指定user对象,包括 id和更新信息,注意:id必须存在
  88. #{id}:从输入 user对象中获取id属性值
  89. -->
  90. <update id="updateUser" parameterType="com.cy.po.User">
  91. update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
  92. where id=#{id}
  93. </update>
  94. </mapper>

测试增删改查的Test代码:

  1. package com.cy.first;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.util.Date;
  6. import java.util.List;
  7.  
  8. import org.apache.ibatis.io.Resources;
  9. import org.apache.ibatis.session.SqlSession;
  10. import org.apache.ibatis.session.SqlSessionFactory;
  11. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  12. import org.junit.Test;
  13.  
  14. import com.cy.po.User;
  15.  
  16. public class MybatisFirst {
  17.  
  18. /* ---------------------------------------------------------------------------------*/
  19. // 根据id查询用户信息,得到一条记录结果
  20. @Test
  21. public void findUserByIdTest() throws IOException {
  22. // mybatis配置文件
  23. String resource = "SqlMapConfig.xml";
  24. // 得到配置文件流
  25. InputStream inputStream = Resources.getResourceAsStream(resource);
  26.  
  27. // 创建会话工厂,传入mybatis的配置文件信息
  28. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  29.  
  30. // 通过工厂得到SqlSession
  31. SqlSession sqlSession = sqlSessionFactory.openSession();
  32.  
  33. // 通过SqlSession操作数据库
  34. // 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id
  35. // 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
  36. // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象
  37. // selectOne查询出一条记录
  38. User user = sqlSession.selectOne("test.findUserById", 1);
  39.  
  40. System.out.println(user);
  41.  
  42. // 释放资源
  43. sqlSession.close();
  44.  
  45. }
  46.  
  47. /* ---------------------------------------------------------------------------------*/
  48. // 根据用户名称模糊查询用户列表
  49. @Test
  50. public void findUserByNameTest() throws IOException {
  51. // mybatis配置文件
  52. String resource = "SqlMapConfig.xml";
  53. // 得到配置文件流
  54. InputStream inputStream = Resources.getResourceAsStream(resource);
  55.  
  56. // 创建会话工厂,传入mybatis的配置文件信息
  57. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  58.  
  59. // 通过工厂得到SqlSession
  60. SqlSession sqlSession = sqlSessionFactory.openSession();
  61. // list中的user和映射文件中resultType所指定的类型一致
  62. List<User> list = sqlSession.selectList("test.findUserByName", "小明");
  63. System.out.println(list);
  64. sqlSession.close();
  65. }
  66.  
  67. /* ---------------------------------------------------------------------------------*/
  68. // 添加用户信息
  69. @Test
  70. public void insertUserTest() throws IOException {
  71. String resource = "SqlMapConfig.xml";
  72. InputStream inputStream = Resources.getResourceAsStream(resource);
  73. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  74. SqlSession sqlSession = sqlSessionFactory.openSession();
  75. // 插入用户对象
  76. User user = new User();
  77. user.setUsername("王小军");
  78. user.setBirthday(new Date());
  79. user.setSex("1");
  80. user.setAddress("河南郑州");
  81.  
  82. sqlSession.insert("test.insertUser", user);
  83.  
  84. // 提交事务
  85. sqlSession.commit();
  86.  
  87. // 获取用户信息主键
  88. System.out.println("user id: " + user.getId());
  89.  
  90. // 关闭会话
  91. sqlSession.close();
  92. }
  93.  
  94. /* ---------------------------------------------------------------------------------*/
  95. // 根据id删除 用户信息
  96. @Test
  97. public void deleteUserTest() throws IOException {
  98. String resource = "SqlMapConfig.xml";
  99. InputStream inputStream = Resources.getResourceAsStream(resource);
  100. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  101. SqlSession sqlSession = sqlSessionFactory.openSession();
  102.  
  103. // 传入id删除 用户
  104. sqlSession.delete("test.deleteUser", 29);
  105.  
  106. sqlSession.commit();
  107. sqlSession.close();
  108. }
  109.  
  110. /* ---------------------------------------------------------------------------------*/
  111. // 根据id删除 用户信息
  112. @Test
  113. public void updateUserTest() throws IOException {
  114. String resource = "SqlMapConfig.xml";
  115. InputStream inputStream = Resources.getResourceAsStream(resource);
  116. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  117. SqlSession sqlSession = sqlSessionFactory.openSession();
  118.  
  119. // 更新用户信息
  120. User user = new User();
  121. //必须设置id
  122. user.setId(28);
  123. user.setUsername("王大军");
  124. user.setBirthday(new Date());
  125. user.setSex("2");
  126. user.setAddress("河南郑州");
  127. sqlSession.delete("test.updateUser", user);
  128.  
  129. sqlSession.commit();
  130. sqlSession.close();
  131. }
  132. }

Juit测试代码

入门程序总结:

1.parameterType和resultType:

parameterType:在映射文件中通过parameterType指定输入 参数的类型。

resultType:在映射文件中通过resultType指定输出结果的类型。

2.#{}和${}:

#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,#{}中可以写成value或其它名称。
#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
 
${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。
${}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,${}中只能写成value。
${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
 
3.selectOne和selectList:

selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。

selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。

如果使用selectOne报错:

org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4

注意点:

1.写xml映射文件,statement的sql   insert。select之间的sql语句不要有分号结尾;

Mybatis学习(1)的更多相关文章

  1. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作(转载)

    本文转载自:http://www.cnblogs.com/jpf-java/p/6013540.html 上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybati ...

  2. MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(八)--Mybatis3.x与Spring4.x整合 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: m ...

  3. MyBatis学习总结(七)——Mybatis缓存(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...

  4. (原创)mybatis学习二,spring和mybatis的融合

    mybatis学习一夯实基础 上文介绍了mybatis的相关知识,这一节主要来介绍mybaits和spring的融合 一,环境搭建 1,jar包下载,下载路径为jar包 2,将包导入到java工程中 ...

  5. (原创)mybatis学习一,夯实基础

    一,what?(是什么) MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可 ...

  6. MyBatis学习--简单的增删改查

    jdbc程序 在学习MyBatis的时候先简单了解下JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: Public static void main(String[] args) ...

  7. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作

    上一篇博文MyBatis学习总结(一)——MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对u ...

  8. 【Todo】Mybatis学习-偏理论

    之前写过好几篇Mybatis相关的文章: http://www.cnblogs.com/charlesblc/p/5906431.html  <SSM(SpringMVC+Spring+Myba ...

  9. MyBatis学习系列三——结合Spring

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...

  10. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

随机推荐

  1. Android Touch事件之一:Touch事件在父ViewGroup和子View之间的传递篇

    2015-11-26 17:00:22 前言:Android的Touch事件传递和View的实现紧密相连,因此理解Touch事件的传递,有助于我们更好的理解View的工作原理. 1. 几个重要的方法: ...

  2. 2.2 C++类的成员变量和成员函数

    参考:http://www.weixueyuan.net/view/6334.html 总结: 类成员的声明和定义: 类成员函数的定义分类内定义(内联)和类外定义(可用 inline 关键字 强制转换 ...

  3. DevExpress v18.1新版亮点——ASP.NET篇(二)

    用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress ASP.NET v18.1 的新功能,快来下载试用新版本!点 ...

  4. Beta 冲刺(6/7)

    前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/10129063.html 作业博客:https://edu.cnblogs.com/campus ...

  5. iOS开发UI之Quartz2D使用(绘制基本图形)

    iOS开发UI篇—Quartz2D使用(绘制基本图形) 一.简单说明 图形上下文(Graphics Context):是一个CGContextRef类型的数据 图形上下文的作用:保存绘图信息.绘图状态 ...

  6. WEB接口测试之Jmeter接口测试自动化 (一)

    软件测试自动化从不同的测试阶段分类,可从下层到上层依次分为单元测试-->接口测试-->界面自动化测试. 单元测试一般有开发人员自行完成,而界面自动化测试合适的测试条件又很难达到,测试人员在 ...

  7. 动态更新 HTML 内容 —— AJAX

    通过 JavaScript 加载数据,在不刷新网页的情况下,更新网页内容的技术,称为 AJAX(Asynchronous JavaScript and XML,异步 JavaScript 和 XML) ...

  8. uva1482:Playing With Stones (SG函数)

    题意:有N堆石子,每次可以取一堆的不超过半数的石子,没有可取的为输. 思路:假设只有一堆,手推出来,数量x可以表示为2^p-1形式的必输. 但是没什么用,因为最后要的不是0和1,而是SG函数:所以必输 ...

  9. 20155224 2016-2017-2 《Java程序设计》第5周学习总结

    20155224 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 Java中的错误都会被打包为对象,可以尝试(try)捕捉(catch)代表错误的对象 ...

  10. AngularJS的简单订阅发布模式例子

    控制器之间的交互方式广播 broadcast, 发射 emit 事件 类似于 js中的事件 , 可以自己定义事件 向上传递直到 document 在AngularJs中 向上传递直到 rootScop ...