Mybatis(一)

零、目录

  • Mybatis介绍
  • Mybatis入门案例
  • 增删改查练习
  • 映射文件中取值问题
  • Mybatis中单值传递和多值传递问题
  • sql语句的复用
  • 别名标签
  • 动态更新
  • 动态查询
  • 动态插入
  • 批量删除

一、Mybatis介绍

  1. Mybatis是一款优秀的数据持久层框架
  2. Mybatis内部也是JDBC原理
  3. 回顾JDBC缺点:
    1. 需要频繁的开关数据库连接
    2. 查询的结果需要手动进行封装
    3. JDBC中内有缓存机制
    4. SQL语句写在java代码中
  4. mybatis优点:
    1. 内置数据库连接池
    2. 会自动进行结果集封装
    3. 自带缓存机制
    4. SQL语句写在配置文件中
  5. mybatis工作流程 :

二、 Mybatis入门案例

  1. 导入约束文件

    1. 如果你的电脑有网就不用导入了 , 在使用时会自动下载
    2. 如果你的机器没网 , 需要手动导入mybatis-3-mapper.dtd文件和mybatis-3-config.dtd文件
    3. 注意导入时 , 需要约束文件在不含中文的路径下 , keyType选择URI , key填写如:http://mybatis.org/dtd/mybatis-3-mapper.dtd 。
  2. 导入响应的jar包
  3. 添加配置文件

    1. 日志文件log4j.properties , 不需要改动直接复制即可

      log4j.rootLogger=DEBUG, Console
      #Console
      log4j.appender.Console=org.apache.log4j.ConsoleAppender
      log4j.appender.Console.layout=org.apache.log4j.PatternLayout
      log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
      log4j.logger.java.sql.ResultSet=INFO
      log4j.logger.org.apache=INFO
      log4j.logger.java.sql.Connection=DEBUG
      log4j.logger.java.sql.Statement=DEBUG
      log4j.logger.java.sql.PreparedStatement=DEBUG
      
    2. mybatis核心配置文件

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE configuration
      PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-config.dtd">
      <configuration>
      <!-- 为实体类配置别名 -->
      <typeAliases><typeAlias type="com.tj.pojo.User" alias="User"/>
      </typeAliases>
      <!-- 配置数据源 --><environments default="mysql"><!-- 设置默认使用的数据库配置 , 可以根据具体情境随意切换  --><environment id="mysql"><!-- 配置事务管理 --><transactionManager type="JDBC" /><!-- 表示支持数据库连接池  --><dataSource type="POOLED"><!-- 配置数据源 --><property name="driver" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" /><property name="username" value="root" /><property name="password" value="root" /></dataSource></environment><environment id="oracle"><transactionManager type="JDBC" /><dataSource type="POOLED"><property name="driver" value="oracle.jdbc.driver.OracleDriver" /><property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE" /><property name="username" value="ht1602" /><property name="password" value="htdb" /></dataSource></environment></environments><!-- 映射文件 --><mappers><!-- 注意配置的映射文件的路径 , 而不是全类名 --><mapper resource="com/tj/pojo/UserMapper.xml" /></mappers></configuration>
      
    3. 实体类对应的映射文件(该文件一般由逆向工程通过数据库配置自动生成实体类和对应的映射文件 , 不需要手动写)

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="UserMapper"><sql id="basefind"> select * from  user</sql><select id="findAll" resultType="com.tj.pojo.User" >select * from user;</select><insert id="insert" parameterType="com.tj.pojo.User">insert into user(name , age) values( #{name} , #{age});</insert>   <delete id="delete">delete from user where id=#{id};</delete><update id="updaet">update user set name=#{name} , age = #{age} where id=#{id}; </update><!-- 根据名字查询 用户 --><select id="findByName" resultType="User"><include refid="basefind"/>where name = #{name};</select>
      </mapper>
      
  4. 测试代码:

    private SqlSession session ;
    @Before
    public void init() throws IOException{//获取一个数据流InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");//创建一个工厂SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);//创建一个会话session = factory.openSession(true);//true表示自动提交 , 默认为false , 需要手动提交
    }@Test
    public void testFindAll() throws IOException{//执行sql语句List<User> users = session.selectList("UserMapper.findAll");System.out.println(users.get(0));
    }
    

三、增删改查练习

  1. 以下案例测试之前先创建会话

        private SqlSession session ;@Beforepublic void init() throws IOException{//获取一个数据流InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");//创建一个工厂SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);//创建一个会话session = factory.openSession(true);//true表示自动提交 , 默认为false , 需要手动提交}
    
    1. 映射文件中添加:

      <insert id="insert" >insert into user(name , age) values( #{name} , #{age});</insert>
      
    2. 测试:

      @Testpublic void insertUser() {User user = new User();user.setName("李四");user.setAge(20);//執行sql語句session.insert("UserMapper.insert", user);//提交增删改时都需要commit , 可以在opensession时添加参数为true设置文 自动提交session.commit();}
      
    1. 映射文件中添加:

      <delete id="delete">delete from user where id=#{id};</delete>
      
    2. 测试:

      @Testpublic void delete() throws IOException{//执行sessionsession.delete("UserMapper.delete",3);}
      
    1. 映射文件中添加:

      <update id="update">update user set name=#{name} , age = #{age} where id=#{id}; </update>
      
    2. 测试:

      @Testpublic void updateUser(){//修改之前先获取到原数据User user = new User();user.setId(1);user.setName("张三");user.setAge(19);//对数据进行修改user.setName("王五");//执行数据库更新操作session.update("UserMapper.update", user);}
      
    1. 映射文件中添加:

      <select id="findAll" resultType="com.tj.pojo.User" >select * from user;</select>
      
    2. 测试:

      @Testpublic void testFindAll() throws IOException{//执行sql语句List<User> users = session.selectList("UserMapper.findAll");System.out.println(users.get(0));}
      

四、映射文件中的取值符号

  1. #{变量名称} : 会在与sql语句拼接时自动加上引号, 并且有预编译的效果 , 可以防止sql注入攻击
  2. ${变量名称} : 在于sql语句拼接时不会添加引号 , 直接拼接在sql语句中
  3. 使用两种取值方式的选择:
    1. 绝大多数情况下使用#{} , 在传入的值为表的字段(如: order by 编号时必须使用{编号} 时必须使用{} , 否则会失效)或者是sql语句的一部分时(如: order by id 升序|降序),必须使用{升序|降序}) , 必须使用{} , 否则会生效
    2. 能使用#{}绝不使用{} , 不能使用#{}时才使用{} , 不能使用#{}时才使用{} .

五、Mybatis映射文件的多值传递和单值传递

  1. Mybatis中提供的增删改查方法只支持传递一个参数代表传入的值

    1. 当需要传递多个 值时, 可以将值放入map中 ;

      1. Mapper文件中:

        <select id="finfAllByOrderDesc" resultType="User">select * from user order by ${type} ${paixu};</select>
        
      2. 测试:

        //多值传递      查询所有用户并按照年龄 降序排列@Test public void findAllOrderByAgeDesc(){Map<String ,  String > map = new HashMap<String ,String >();map.put("type", "age");map.put("paixu", "desc");List<User> users = session.selectList("UserMapper.finfAllByOrderDesc" , map);for(User user : users){System.out.println(user);}}
        
    2. 当传递一个值的时候 ,映射文件中取值时可以以任意变量名取值 。

      1. Mapper文件中:

        <select id="findByName" resultType="User"><include refid="basefind"/>where name = #{xxxxxx};</select>
        
      2. 测试:

        //单值传递
        @Test
        public void findByName(){User user = session.selectOne("UserMapper.findByName", "王五");System.out.println(user);
        }
        

六、 sql语句的复用

  1. 声明一个基本的sql语句 , 以便在后续的使用时直接调用
  2. 声明:

    <sql id="basefind"> select * from  user</sql>
    
  3. 调用:

    <select id="finfAllByOrderDesc" resultType="User"><include refid="basefind"/>order by ${type} ${paixu};</select>
    

七、别名标签

  1. 在映射文件中写resultType或者是paramType时需要写的是全类名 , 一般xxx.xxx.xxx.xxx.xxx.类名 都会很长 , 很容易写错 , 可以指定类别名以简化书写
  2. 在核心配置文件中配置别名

        <!-- 配置别名 --><typeAliases><typeAlias type="com.tj.pojo.User" alias="User"/></typeAliases>
    
  3. 使用

        <select id="finfAllByOrderDesc" resultType="User"><include refid="basefind"/>order by ${type} ${paixu};</select>
    

八、 动态更新

  1. 当进行数据库修改的时候 ,有时只需要修改表中的某几个字段 , 其他字段保持不变 , 这是就需要用到动态更新 , 不然会出现其他值为null的问题 。
  2. 映射文件中sql语句的修改

    <!-- 动态 更新 --><select id="dynamicUpdate">update user<set><if test="name != null">name = #{name} , </if><if test="age != null">age = #{age} , </if></set>where id=#{id}</select>
    
  3. 注意: 字段后的“,” , 如果age为空 , set标签会自动把name属性后的“,”去掉

九、 动态查询

  1. 查询需要多个条件 , 但是不一定每一个条件都用的上 , 在数据封装时就会出现null值的情况 , 如果被sql指定势必会影响到sql 的查询结果 , 这是就需要用到动态查询 , 不然会出现满足条件为null的判断。
  2. 映射文件中sql语句的修改

        <!-- 动态查询 --><select id="dyniaicselect"><include refid="basefind"/><where><if test="name != null">name = #{name} </if><if test="age != null"> and age = #{age} </if><if test="id != id"> and id = #{id}</if></where> </select>
    
  3. 注意: and加在字段前 , 当name字段为null时 , where标签会自动去掉age前的and 。

十、 动态插入

  1. 映射文件中sql语句的修改:

        <!--  动态插入--><insert id="dyniamicInsert">insert into user <trim prefix="(" suffix=")" suffixOverrides=","><!-- 设置前缀后缀 , 并且设置将拼接后最后的逗号去掉 --><if test="name != null">name </if><if test="age != null"> age </if></trim>values<trim prefix="(" suffix=")" suffixOverrides=","><!-- 设置前缀后缀 , 并且设置将拼接后最后的逗号去掉 --><if test="name != null">name = #{name} ,  </if><if test="age != null"> age = #{age} </if></trim></insert>
    

十一、批量删除

  1. 数组中存放要删除元素的id

        <!-- 动态删除 --><delete id="dynamicdelete">delete form user where id in<foreach collection="array" item="id" open="(" close=")"<!-- 参数类型是数组 设置前后缀为() , 并且元素之间用“,”拼接 --> separator=",">#{id}</foreach> </delete>
    
  2. 列表中存放要删除的元素

    <!-- 动态删除 --><delete id="dynamicdelete">delete form user where id in<foreach collection="list" item="user" open="(" close=")" separator=",">#{user.id}</foreach> </delete>
    

大数据WEB阶段Mybatis(一)相关推荐

  1. 大数据WEB阶段Mybatis(二)

    Mybatis(二) 零.目录 Mybatis接口形式 Mybatis整合Spring Mybatis的缓存机制 手动封装结果集 一对一表操作 一对多表操作 多对多表操作 SpringMVC . Sp ...

  2. 大数据WEB阶段 TransientDateAccessResourceException

    大数据WEB阶段 TransientDateAccessResourceException 一 . 分析 如果数据库保存的字段有时间 , 但是没有给该字段赋值时 ,则该字段默认是0000-00-00 ...

  3. 大数据WEB阶段(九)Servlet+Request

    Servlet与Request 一.概述 Servlet 是sun公司提供的一门用于开发动态web资源的技术 按照这套规范写出来的servlet可以放置在web应用中在servlet容器中运行 . 开 ...

  4. 大数据WEB阶段 (六)MySql详解(一)

    MySql(二) 一.概述 什么是数据库 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,简而言之就是存储数据的仓库. 数据库的分类 层次式数据库.网络式数据库.关系型数据库 数 ...

  5. 大数据WEB阶段 使用mybatis是多值传递问题

    使用mybatis是多值传递问题 一. 分析 在mybatis使用时 , 默认只允许在映射接口的方法中传递一个值 , 这时在映射文件的sql语句中可以用任意的名字取值 实体User中 有name和ag ...

  6. 大数据WEB阶段Maven安装配置与使用

    Maven 零.目录 Maven简介 Maven 的安装与配置 创建Maven工程 创建maven-web工程 搭建私服 使用本地资源库 阿里私服 maven命令 上传本地工程到私服中 maven-w ...

  7. 大数据WEB阶段 Maven与SSM框架整合

    Maven整合SSM框架 零. 目录 Maven整合SSM 常见的问题 以及一些优化 一. Maven整合SSM 创建webapp工程 修改jdk和编译器 配置pom.xml文件 并在pom.xml文 ...

  8. 大数据WEB阶段总结

    一.概述 HTTP协议 web容器 - Tomcat 静态web资源 - 本质上是文件 html css js 图片 音频 视频 flash- 动态web资源 - 本质上是程序 Servelt JSP ...

  9. 大数据WEB阶段(十三)JSP(二)JSP标签、EL表达式、JSTL

    JSP标签.EL表达式.JSTL (一)JSP标签技术 一.JSP标签技术概述 jsp本质上是一种动态web资源开发技术 , 看起来像是html , 但其中可以写java代码 , 非常方便用来开发动态 ...

最新文章

  1. Quartz 框架快速入门(二)
  2. 必须要熬夜的时候的最佳伴侣是什么?亲测有效
  3. [机器学习笔记] Note2--单变量线性回归
  4. NumPy常用属性及方法
  5. windows7系统适合哪个python_Python3.6.4在Windows7系统下安装配置教程
  6. 杭电1259ZJUTACM
  7. dalvik on J2EE: running tomcat on dalvik
  8. shell初学之nginx(域名)
  9. ApacheBench~网站性能测试工具
  10. 找到Linux共享文件夹的实际位置
  11. 一个自动化专业的工控人自学编程之路
  12. Unity利用Input类实现摄像机镜头拉近与拉远
  13. html视频怎么自动播放一次,HTML5视频自动播放/播放一次
  14. Elasticsearch报错received plaintext traffic on an encrypted channel, closing connection Netty4TcpChann
  15. firefly-rk3288开发板Linux驱动——AT24C02 E2PROM驱动
  16. mysql刷新当前数据库_sqlyog刷新数据库
  17. canvas图片画圆角
  18. 逻辑左移、逻辑右移、算术左移、算术右移、循环左移、循环右移
  19. 数据结构(使用尾插法实现单链表)
  20. 防火墙内外网隔离实例

热门文章

  1. iOS开发蓝牙 蓝牙4.0的各种踩过的坑,希望你们少踩点
  2. [WP7开发入门]在Windows 2003,XP上安装Windows Phone 7开发工具
  3. ftl不存在为真_FreeMarker 处理不存在的变量
  4. java如何调用网页_如何使用网页开发自己的app,在网页中的按钮与自己的java代码绑定来实现打电话即javascript代码调用java代码,和java代码来调用javascript代码...
  5. android按钮在容器下方,使用flex布局解决安卓手机上固定在底部的按钮,在键盘弹起后挡住input输入框的问题...
  6. linux tomcat apr安装,Linux下Tomcat安装并开启APR模式-Go语言中文社区
  7. Java黑皮书课后题第7章:7.4(分析成绩)编写一个程序,读入个数不确定的考试分数,并且判断有多少个分数是大于或等于平均分,多少个分数是低于平均分的。输入一个负数表示输入结束。假设最高分是100
  8. Java黑皮书课后题第6章:*6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法体计算字符串中的字母个数。编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数
  9. 计算机入会大会新生发言稿,新生大会发言稿(精选3篇)
  10. C51语言支持哪些数据类型,C51编译器支持的数据类型(1)