zoukankan      html  css  js  c++  java
  • Mybatis框架(1)---Mybatis入门

    mybatis入门

      MyBatis是什么?

     MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。 目前mybatis在github上托管。  git(分布式版本控制,当前比较流程)
      MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
      Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

     mybatis架构

    搭建开发环境

    (1)导包

    (2)导入配置文件

     

    这里我在工程文件下新建了一个和src平级的文件,把有关mybatis配置文件和src文件分离,看去界面更加清晰,因为在ssh开发中你肯定还要配置其它配置文件

    这里的log4j.properties主要是为了在后台输出是更加看的清楚执行流程,这个可要可不要.

    (3)配需相关文件属性

      User.xml

    <?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">
    <!-- namespace命名空间,为了对sql语句进行隔离,方便管理 ,mapper开发dao方式,使用namespace有特殊作用 -->
    <mapper namespace="test">
    <!-- 在mapper.xml文件中配置很多的sql语句,执行每个sql语句时,封装为MappedStatement对象
    mapper.xml以statement为单位管理sql语句
     -->
        <!-- 根据id查询用户信息 -->
        <!-- 
            id:唯一标识 一个statement
            #{}:表示 一个占位符,如果#{}中传入简单类型的参数,#{}中的名称随意
            parameterType:输入 参数的类型,通过#{}接收parameterType输入 的参数
            resultType:输出结果 类型,不管返回是多条还是单条,指定单条记录映射的pojo类型
         -->
        <select id="findUserById" parameterType="int" resultType="com.study.model.User">
            SELECT * FROM USER WHERE id= #{id}
        </select>
        
        <!-- 根据用户名称查询用户信息,可能返回多条
        ${}:表示sql的拼接,通过${}接收参数,将参数的内容不加任何修饰拼接在sql中。
         -->
        <select id="findUserByName" parameterType="java.lang.String" resultType="com.study.model.User">
            select * from user where username like '%${value}%'
        </select>
        
        <!-- 添加用户
        parameterType:输入 参数的类型,User对象 包括 username,birthday,sex,address
        #{}接收pojo数据,可以使用OGNL解析出pojo的属性值
        #{username}表示从parameterType中获取pojo的属性值
        selectKey:用于进行主键返回,定义了获取主键值的sql
        order:设置selectKey中sql执行的顺序,相对于insert语句来说
        keyProperty:将主键值设置到哪个属性
        resultType:select LAST_INSERT_ID()的结果 类型
         -->
        <insert id="insertUser" parameterType="com.study.model.User">
            <selectKey keyProperty="id" order="AFTER" resultType="int">
                select LAST_INSERT_ID()
            </selectKey>
            INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address})
        </insert>
        
        <!-- 用户删除  -->
        <delete id="deleteUser" parameterType="int">
         delete from user where id=#{id}
        </delete>
        <!-- 用户更新 
        要求:传入的user对象中包括 id属性值
        -->
        <update id="updateUser" parameterType="com.study.model.User">
            update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
        </update>
    </mapper>

    SqlMapConfig.xml

    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <!-- 和spring整合后 environments配置将废除-->
        <environments default="development">
            <environment id="development">
            <!-- 使用jdbc事务管理-->
                <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>
        </environments>
        <!-- 加载mapper.xml -->
        <mappers>
            <mapper resource="sqlmap/User.xml" />
        </mappers>
    </configuration>

    User.java

    public class User {
        private int id;
        private String username;// 用户姓名
        private String sex;// 性别
        private Date birthday;// 生日
        private String address;// 地址
       /*
        *提供set和get方法,和toString方法
        *
        */
    }
    MybatisFirst 测试类,进行增删改查
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Date;
    import java.util.List;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.guigu.model.User;
    
    public class MybatisFirst {
        // 会话工厂
        private SqlSessionFactory sqlSessionFactory;
        // 创建工厂
        @Before  //before在text标签之前执行,所以会创建好sqlSessionFactory对象
        public void init() throws IOException {
            // 配置文件(SqlMapConfig.xml)
            String resource = "SqlMapConfig.xml";
            // 加载配置文件到输入 流
            InputStream inputStream = Resources.getResourceAsStream(resource);
            // 创建会话工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }
       
        
        // 根据id查询用户(得到单条记录)
        @Test
        public void testFindUserById() {
            // 通过sqlSessionFactory创建sqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
            // 通过sqlSession操作数据库
            // 第一个参数:statement的位置,等于namespace+statement的id
            // 第二个参数:传入的参数
            User user = sqlSession.selectOne("test.findUserById", 16);
           
                sqlSession.close();
            
            System.out.println(user);
        }
    
        // 模糊查询(可能是单条也可能是多条)
        @Test
        public void testFindUserByName() {
            // 通过sqlSessionFactory创建sqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
           
            //selectList代表着返回是list集合
            List<User>  list = sqlSession.selectList("test.findUserByName", "小明");
          
                sqlSession.close();
         
            System.out.println(list.get(0).getUsername());
        }
    
        // 添加用户
        @Test
        public void testInsertUser() {
            // 通过sqlSessionFactory创建sqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
         
            User user = new User();
            user.setUsername("小小徐");
            user.setAddress("杭州市余杭区未来科技城");
            user.setBirthday(new Date());
            user.setSex("1");
               //insert代表插入
                sqlSession.insert("test.insertUser", user);
     
                //查看是不需要提交事物的,但是插入和修改是需要提交事物的
                sqlSession.commit();
                sqlSession.close();
               //这里输出的id竟然是0,有哪位大神解释下吗?
            System.out.println("用户的id=" + user.getId());
        }
    // 根据id删除用户 @Test public void testDeleteUser() { // 通过sqlSessionFactory创建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // delete代表删除用户 sqlSession.delete("test.deleteUser", 29); sqlSession.commit(); sqlSession.close(); } // 根据id更新用户 @Test public void testUpdateUser() { // 通过sqlSessionFactory创建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 创建更新数据对象,要求必须包括 id User user = new User(); user.setId(40); user.setUsername("小小钟"); user.setAddress("杭州余杭区东西大道"); //user.setBirthday(new Date()); user.setSex("1"); //update更新数据 sqlSession.update("test.updateUser", user); sqlSession.commit(); sqlSession.close(); System.out.println("用户的id=" + user.getId()); } }

    mybatis与hibernate重要区别 

      企业开发进行技术选型 ,考虑mybatis与hibernate适用场景。
        mybatis:入门简单,程序容易上手开发,节省开发成本 。mybatis需要程序员自己编写sql语句,是一个不完全 的ORM框架,对sql修改和优化非常容易实现 。
          mybatis适合开发需求变更频繁的系统,比如:互联网项目。
        hibernate:入门门槛高,如果用hibernate写出高性能的程序不容易实现。hibernate不用写sql语句,是一个 ORM框架。
          hibernate适合需求固定,对象数据模型稳定,中小型项目,比如:企业OA系统。
      总之,企业在技术选型时根据项目实际情况,以降低成本和提高系统 可维护性为出发点进行技术选型。
    总结
      SqlMapConfig.xml
        是mybatis全局配置文件,只有一个,名称不固定的,主要mapper.xml,mapper.xml中配置 sql语句
      mapper.xml
        mapper.xml是以statement为单位进行配置。(把一个sql称为一个statement),satatement中配置 sql语句、parameterType输入参数类型(完成输入映射)、resultType输出结果类型(完成输出映射)。还提供了parameterMap配置输入参数类型(过期了,不推荐使用了),还提供resultMap配置输出结果类型(完成输出映射)
      #{}
        表示一个占位符,向占位符输入参数,mybatis自动进行java类型和jdbc类型的转换。程序员不需要考虑参数的类型,比如:传入字符串,mybatis最终拼接好的sql就是参数两边加单引号。#{}接收pojo数据,可以使用OGNL解析出pojo的属性值
      ${}
        表示sql的拼接,通过${}接收参数,将参数的内容不加任何修饰拼接在sql中。${}也可以接收pojo数据,可以使用OGNL解析出pojo的属性值
        缺点:不能防止sql注入。
      selectOne
        用于查询单条记录,不能用于查询多条记录,否则异常:
          org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4
      selectList
        用于查询多条记录,可以用于查询单条记录的。

     本文就讲到这里,欢迎大家指点,本文引用了博客名叫:凌晨。。。三点,非常感谢!

  • 相关阅读:
    jupyter notebook代码添加行号(菜单中点击view后没有toggle line numbers选项)
    深度学习:tensorflow中激励函数的实现
    深度学习:padding、卷积、stride的计算
    深度学习:mAP(mean average precision)
    java实现桶排序
    java 数组实现队列和栈
    五步学习法
    技术团队组织架构
    Redis的高可用:哨兵和集群
    Redis限流的实现方式有3种
  • 原文地址:https://www.cnblogs.com/qdhxhz/p/6490088.html
Copyright © 2011-2022 走看看