通过上一小节,mybatis 和 jdbc 的区别:http://www.cnblogs.com/ysocean/p/7271600.html,我们对 mybatis有了一个大致的了解,下面我们通过一个入门实例来对mybatis有更近一步的了解。

  我们用 mybatis 来对 user 表进行增删改查操作。

  ps:本篇博客源代码链接:http://pan.baidu.com/s/1eSEfc8i密码:j480

1、创建MySQL数据库:mybatisDemo和表:user

  这里我们就不写脚本创建了,创建完成后,再向其中插入几条数据即可。

  user 表字段如下:

  

  

2、建立一个Java工程,并导入相应的jar包,具体目录如下

  注意:log4j和Junit不是必须的,但是我们为了查看日志以及便于测试,加入了这两个jar包

  

3、在 MyBatisTest 工程中添加数据库配置文件 mybatis-configuration.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  3. <configuration>
  4.  
  5. <!-- 注意:environments标签,当mybatis和spring整合之后,这个标签是不用配置的 -->
  6.  
  7. <!-- 可以配置多个运行环境,但是每个 SqlSessionFactory 实例只能选择一个运行环境
  8. 一、development:开发模式
  9. 二、work:工作模式-->
  10. <environments default="development">
  11. <!--id属性必须和上面的default一样 -->
  12. <environment id="development">
  13. <!--事务管理器
  14. 一、JDBC:这个配置直接简单使用了 JDBC 的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围
  15. 二、MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期
  16. 比如 spring 或 JEE 应用服务器的上下文,默认情况下,它会关闭连接。然而一些容器并不希望这样,
  17. 因此如果你需要从连接中停止它,就可以将 closeConnection 属性设置为 false,比如:
  18. <transactionManager type="MANAGED">
  19. <property name="closeConnection" value="false"/>
  20. </transactionManager>
  21. -->
  22. <transactionManager type="JDBC"/>
  23. <!--dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象源 -->
  24. <dataSource type="POOLED">
  25. <property name="driver" value="com.mysql.jdbc.Driver"/>
  26. <property name="url" value="jdbc:mysql://localhost:3306/mybatisdemo"/>
  27. <property name="username" value="root"/>
  28. <property name="password" value="root"/>
  29. </dataSource>
  30. </environment>
  31. </environments>
  32.  
  33. </configuration>

  

4、定义表所对应的实体类

  

  1. package com.ys.po;
  2.  
  3. import java.util.Date;
  4.  
  5. public class User {
  6. private int id;
  7. private String username;
  8. private String sex;
  9. private Date birthday;
  10. private String address;
  11. public int getId() {
  12. return id;
  13. }
  14. public void setId(int id) {
  15. this.id = id;
  16. }
  17. public String getUsername() {
  18. return username;
  19. }
  20. public void setUsername(String username) {
  21. this.username = username;
  22. }
  23. public String getSex() {
  24. return sex;
  25. }
  26. public void setSex(String sex) {
  27. this.sex = sex;
  28. }
  29. public Date getBirthday() {
  30. return birthday;
  31. }
  32. public void setBirthday(Date birthday) {
  33. this.birthday = birthday;
  34. }
  35. public String getAddress() {
  36. return address;
  37. }
  38. public void setAddress(String address) {
  39. this.address = address;
  40. }
  41. @Override
  42. public String toString() {
  43. return "User [id=" + id + ", username=" + username + ", sex=" + sex
  44. + ", birthday=" + birthday + ", address=" + address + "]";
  45. }
  46. }

5、定义操作 user 表的sql映射文件userMapper.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. <mapper namespace="com.ys.po.userMapper">
  6.  
  7. <!-- 根据 id 查询 user 表中的数据
  8. id:唯一标识符,此文件中的id值不能重复
  9. resultType:返回值类型,一条数据库记录也就对应实体类的一个对象
  10. parameterType:参数类型,也就是查询条件的类型
  11. -->
  12. <select id="selectUserById"
  13. resultType="com.ys.po.User" parameterType="int">
  14. <!-- 这里和普通的sql 查询语句差不多,对于只有一个参数,后面的 #{id}表示占位符,里面不一定要写id,写啥都可以,但是不要空着,如果有多个参数则必须写pojo类里面的属性 -->
  15. select * from user where id = #{id}
  16. </select>
  17.  
  18. <!-- 查询 user 表的所有数据
  19. 注意:因为是查询所有数据,所以返回的应该是一个集合,这个集合里面每个元素都是User类型
  20. -->
  21. <select id="selectUserAll" resultType="com.ys.po.User">
  22. select * from user
  23. </select>
  24.  
  25. <!-- 模糊查询:根据 user 表的username字段
  26. 下面两种写法都可以,但是要注意
  27. 1、${value}里面必须要写value,不然会报错
  28. 2、${}表示拼接 sql 字符串,将接收到的参数不加任何修饰拼接在sql语句中
  29. 3、使用${}会造成 sql 注入
  30. -->
  31. <select id="selectLikeUserName" resultType="com.ys.po.User" parameterType="String">
  32. select * from user where username like '%${value}%'
  33. <!-- select * from user where username like #{username} -->
  34. </select>
  35.  
  36. <!-- 向 user 表插入一条数据 -->
  37. <insert id="insertUser" parameterType="com.ys.po.User">
  38. insert into user(id,username,sex,birthday,address)
  39. value(#{id},#{username},#{sex},#{birthday},#{address})
  40. </insert>
  41.  
  42. <!-- 根据 id 更新 user 表的数据 -->
  43. <update id="updateUserById" parameterType="com.ys.po.User">
  44. update user set username=#{username} where id=#{id}
  45. </update>
  46.  
  47. <!-- 根据 id 删除 user 表的数据 -->
  48. <delete id="deleteUserById" parameterType="int">
  49. delete from user where id=#{id}
  50. </delete>
  51. </mapper>

  

6、向 mybatis-configuration.xml 配置文件中注册 userMapper.xml 文件

  

  1. <mappers>
  2. <!-- 注册userMapper.xml文件,
  3. userMapper.xml位于com.ys.mapper这个包下,所以resource写成com/ys/mapper/userMapper.xml-->
  4. <mapper resource="com/ys/mapper/userMapper.xml"/>
  5. </mappers>

  

7、创建测试类

  1. package com.ys.test;
  2.  
  3. import java.io.InputStream;
  4. import java.util.List;
  5.  
  6. import org.apache.ibatis.session.SqlSession;
  7. import org.apache.ibatis.session.SqlSessionFactory;
  8. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  9. import org.junit.Before;
  10. import org.junit.Test;
  11.  
  12. import com.ys.po.User;
  13.  
  14. public class CRUDTest {
  15. //定义 SqlSession
  16. SqlSession session =null;
  17.  
  18. @Before
  19. public void init(){
  20. //定义mybatis全局配置文件
  21. String resource = "mybatis-configuration.xml";
  22. //加载 mybatis 全局配置文件
  23. InputStream inputStream = CRUDTest.class.getClassLoader()
  24. .getResourceAsStream(resource);
  25. //构建sqlSession的工厂
  26. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  27. //根据 sqlSessionFactory 产生 session
  28. session = sessionFactory.openSession();
  29. }
  30.  
  31. //根据id查询user表数据
  32. @Test
  33. public void testSelectUserById(){
  34. /*这个字符串由 userMapper.xml 文件中 两个部分构成
  35. <mapper namespace="com.ys.po.userMapper"> 的 namespace 的值
  36. <select id="selectUserById" > id 值*/
  37. String statement = "com.ys.po.userMapper.selectUserById";
  38. User user = session.selectOne(statement, 1);
  39. System.out.println(user);
  40. session.close();
  41. }
  42.  
  43. //查询所有user表所有数据
  44. @Test
  45. public void testSelectUserAll(){
  46. String statement = "com.ys.po.userMapper.selectUserAll";
  47. List<User> listUser = session.selectList(statement);
  48. for(User user : listUser){
  49. System.out.println(user);
  50. }
  51. session.close();
  52. }
  53.  
  54. //模糊查询:根据 user 表的username字段
  55. @Test
  56. public void testSelectLikeUserName(){
  57. String statement = "com.ys.po.userMapper.selectLikeUserName";
  58. List<User> listUser = session.selectList(statement, "%t%");
  59. for(User user : listUser){
  60. System.out.println(user);
  61. }
  62. session.close();
  63.  
  64. }
  65. //向 user 表中插入一条数据
  66. @Test
  67. public void testInsertUser(){
  68. String statement = "com.ys.po.userMapper.insertUser";
  69. User user = new User();
  70. user.setUsername("Bob");
  71. user.setSex("女");
  72. session.insert(statement, user);
  73. //提交插入的数据
  74. session.commit();
  75. session.close();
  76. }
  77.  
  78. //根据 id 更新 user 表的数据
  79. @Test
  80. public void testUpdateUserById(){
  81. String statement = "com.ys.po.userMapper.updateUserById";
  82. //如果设置的 id不存在,那么数据库没有数据更改
  83. User user = new User();
  84. user.setId(4);
  85. user.setUsername("jim");
  86. session.update(statement, user);
  87. session.commit();
  88. session.close();
  89. }
  90.  
  91. //根据 id 删除 user 表的数据
  92. @Test
  93. public void testDeleteUserById(){
  94. String statement = "com.ys.po.userMapper.deleteUserById";
  95. session.delete(statement,4);
  96. session.commit();
  97. session.close();
  98. }
  99. }

  

补充:如何得到插入数据之后的主键值?

第一种:数据库设置主键自增机制

    userMapper.xml 文件中定义:

  1. <!-- 向 user 表插入一条数据 -->
  2. <insert id="insertUser" parameterType="com.ys.po.User">
  3. <!-- 将插入的数据主键返回到 user 对象中
  4. keyProperty:将查询到的主键设置到parameterType 指定到对象的那个属性
  5. select LAST_INSERT_ID():查询上一次执行insert 操作返回的主键id值,只适用于自增主键
  6. resultType:指定 select LAST_INSERT_ID() 的结果类型
  7. order:AFTER,相对于 select LAST_INSERT_ID()操作的顺序
  8. -->
  9. <selectKey keyProperty="id" resultType="int" order="AFTER">
  10. select LAST_INSERT_ID()
  11. </selectKey>
  12. insert into user(username,sex,birthday,address)
  13. value(#{username},#{sex},#{birthday},#{address})
  14. </insert>

    测试:

  1. //向 user 表中插入一条数据并获取主键值
  2. @Test
  3. public void testInsertUser(){
  4. String statement = "com.ys.po.userMapper.insertUser";
  5. User user = new User();
  6. user.setUsername("Bob");
  7. user.setSex("女");
  8. session.insert(statement, user);
  9. //提交插入的数据
  10. session.commit();
  11. //打印主键值
  12. System.out.println(user.getId());
  13. session.close();
  14. }

  

第二种:非自增主键机制

  1. <!-- 向 user 表插入一条数据 -->
  2. <insert id="insertUser" parameterType="com.ys.po.User">
  3. <!-- 将插入的数据主键返回到 user 对象中
  4. 流程是:首先通过 select UUID()得到主键值,然后设置到 user 对象的id中,在进行 insert 操作
  5. keyProperty:将查询到的主键设置到parameterType 指定到对象的那个属性
  6. select UUID():得到主键的id值,注意这里是字符串
  7. resultType:指定 select UUID() 的结果类型
  8. order:BEFORE,相对于 select UUID()操作的顺序
  9. -->
  10. <selectKey keyProperty="id" resultType="String" order="BEFORE">
  11. select UUID()
  12. </selectKey>
  13. insert into user(id,username,sex,birthday,address)
  14. value(#{id},#{username},#{sex},#{birthday},#{address})
  15. </insert>

  

    

总结:

  ①、parameterType:指定输入参数的类型

  ②、resultType:指定输出结果的类型,在select中如果查询结果是集合,那么也表示集合中每个元素的类型

  ③、#{}:表示占位符,用来接收输入参数,类型可以是简单类型,pojo,HashMap等等

    如果接收简单类型,#{}可以写成 value 或者其他名称

    如果接收 pojo 对象值,通过 OGNL 读取对象中的属性值,即属性.属性.属性...的方式获取属性值

  ④、${}:表示一个拼接符,会引起 sql 注入,不建议使用  

    用来接收输入参数,类型可以是简单类型,pojo,HashMap等等

    如果接收简单类型,${}里面只能是 value

    如果接收 pojo 对象值,通过 OGNL 读取对象中的属性值,即属性.属性.属性...的方式获取属性值

mybatis 详解(二)------入门实例(基于XML)的更多相关文章

  1. Mybatis详解(二) sqlsession的创建过程

    我们处于的位置 我们要清楚现在的情况. 现在我们已经调用了SqlSessionFactoryBuilder的build方法生成了SqlSessionFactory 对象. 但是如标题所说,要想生成sq ...

  2. MyBatis 详解(一对一,一对多,多对多)

    1.什么是MyBatis? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且 ...

  3. mybatis 详解(三)------入门实例(基于注解)

    1.创建MySQL数据库:mybatisDemo和表:user 详情参考:mybatis 详解(二)------入门实例(基于XML) 一致 2.建立一个Java工程,并导入相应的jar包,具体目录如 ...

  4. 爬虫入门之urllib库详解(二)

    爬虫入门之urllib库详解(二) 1 urllib模块 urllib模块是一个运用于URL的包 urllib.request用于访问和读取URLS urllib.error包括了所有urllib.r ...

  5. Shiro 安全框架详解二(概念+权限案例实现)

    Shiro 安全框架详解二 总结内容 一.登录认证 二.Shiro 授权 1. 概念 2. 授权流程图 三.基于 ini 的授权认证案例实现 1. 实现原理图 2. 实现代码 2.1 添加 maven ...

  6. mybatis 详解------动态SQL

    mybatis 详解------动态SQL   目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,o ...

  7. logback -- 配置详解 -- 二 -- <appender>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

  8. SpringMVC入门(基于XML方式实现)

    ----------------------siwuxie095 SpringMVC 入门(基于 XML 方式实现) (一)搭建 SpringMVC 环境 1.先下载相关库文件,下载链接: (1)ht ...

  9. Python基础知识详解 从入门到精通(七)类与对象

    本篇主要是介绍python,内容可先看目录其他基础知识详解,欢迎查看本人的其他文章Python基础知识详解 从入门到精通(一)介绍Python基础知识详解 从入门到精通(二)基础Python基础知识详 ...

  10. [原创]mybatis详解说明

    mybatis详解 2017-01-05MyBatis之代理开发模式1 mybatis-Dao的代理开发模式 Dao:数据访问对象 原来:定义dao接口,在定义dao的实现类 dao的代理开发模式 只 ...

随机推荐

  1. 关于jQuery表单下拉selected设置无效的解决方案

    表单下拉选项使用selected设置,发现第一次默认选中成功,在页面不刷新的情况下,再次下拉,selected属性设置了,默认选中不生效 研究发现是浏览器兼容的问题 一,解决浏览器缓存问题,在HTML ...

  2. H.264格式,iOS硬编解码 以及 iOS 11对HEVC硬编解码的支持

    H.264格式,iOS硬编解码 以及 iOS 11对HEVC硬编解码的支持 1,H.264格式 网络表示层NAL,如图H.264流由一帧一帧的NALU组成: SPS:序列参数集,作用于一系列连续的编码 ...

  3. thinkphp5.0学习笔记(四)数据库的操作

    ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理.采用PDO ...

  4. R语言重要数据集分析研究——R语言数据集的字段含义

    R语言数据集的字段含义 作者:马文敏 选择一种数据结构来储存数据 将数据输入或导入到这个数据结构中 数据集的概念 数据集通常是有数据结构的一个矩形数组,行表示规则,列表示变量. 不同的行业对数据集的行 ...

  5. codeM美团编程大赛初赛B轮D题

    [编程题] 模 时间限制:1秒空间限制:32768K 给定四个正整数a,b,c,k,回答是否存在一个正整数n,使得a*n在k进制表示下的各位的数值之和模b为c.输入描述:第一行一个整数T(T < ...

  6. tcpdf导出pdf数据支持中文的解决方案

    步骤如下:1.确保你测试tcpdf能正常输出英文内容的pdf2.测试输入中文内容后显示是?的乱码或者空白分析原因,是因为我们输入的中文,tcpdf字体库并不支持,因此乱码或者空白显示 添加一个合适的字 ...

  7. Linux下配置tomcat+apr+native应对高并发

    摘要:在慢速网络上Tomcat线程数开到300以上的水平,不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待.但是配上APR之后,Tomcat将以JNI的形式调用Apache HTTP服 ...

  8. 信息安全的核心:CIA三元组 | 安全千字文系列1

    我们总是在说信息安全管理,那么信息安全管理到底是在管什么?我们要如何定义信息安全? 这里就要引出信息安全最基本的概念:CIA三元组. 这里的 C,指的是Confidentiality机密性 这里的 I ...

  9. Mac应用推荐

    知识管理 Outline Curio Together 开发 Clion Vim + spf13 Transmit 辅助应用 Moom PopClip Timing AppClean Markdown ...

  10. Azure SQL Database (23) Azure SQL Database Dynamic Data Masking动态数据掩码

    <Windows Azure Platform 系列文章目录> 我们在使用关系型数据的时候,有时候希望: - 管理员admin,可以查看到所有的数据 - 普通用户,某些敏感字段,比如信用卡 ...