zoukankan      html  css  js  c++  java
  • MyBatis入门一

      本人只是刚刚学习MyBatis,作为学习路程的记录,写的不好,不完善的地方请多多包涵;

      首先,先比较一下Hibernate和MyBatis两种框架之间的区别:

        两种都是ORM框架,但是Hibernate属于全自动化,而MaBatis则属于半自动化,也就是说Hibernate的SQL语句是会自动生产的,而MyBatis的话,需要在xml文件配置一个SQL的模板,这是全自动化和半自动化的含义;那么问题来了,为什么不用更方便的Hibernate呢?

        这是因为在一些特殊的情况下,Hibernate反而不好用了:

        有些数据来自现有的数据库,出于安全的考虑,只给出几条SQL语句或存储过程,具体表结构不予公开;

        开发规范要求,所有牵涉到业务逻辑部分的数据库操作,必须在数据库层由存储过程来实现;

        如果系统的数据处理量巨大,性能要求极为苛刻,而Hibernate自动生成的sql语句显然没有经过人工优化,不能高度优化;

        总结以上就是:出于安全和性能的考虑,单纯的全自动不能满足行业的开发,因此MyBatis应运而生;

        下面是MyBatis实现基本增删改查的基本步骤:  

        1,导入jar包:

        

        2,编写POJO:

          因为MyBatis的优化就是体现在以面对对象的编程机制去操纵数据库,所以,先要有一个POJO来映射相应数据库中的属性;     

    package org.fkit.domain;
    
    public class User {
    
    	private Integer id;
    	private String name;
    	private String sex;
    	private Integer age;
    	public User(){
    		super();
    	}
    	public User(String name,String sex,Integer age){
    		super();
    		this.name = name;
    		this.sex = sex;
    		this.age = age;
    	}
    	public Integer getId() {
    		return id;
    	}
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getSex() {
    		return sex;
    	}
    	public void setSex(String sex) {
    		this.sex = sex;
    	}
    	public Integer getAge() {
    		return age;
    	}
    	public void setAge(Integer age) {
    		this.age = age;
    	}
    	
    
    }
    

        3,配置MyBatis连接的数据库的相关参数属性;

        这个地方就有个坑了,我调了一天的BUG,我们前面说过,MyBatis的优化就是体现在以面对对象的编程机制去操纵数据库,那么如何将这个POJO映射到MyBatis对应的数据库属性上呢?你需要这样一段代码:

         <typeAliases>
              <typeAlias alias="user" type="org.fkit.domain.User"/>
          </typeAliases>    
        同时,要按照"(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".
        也就是说必须要先写settings标签之后,再写typeAliases标签;这是一个顺序的问题;
    <?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>
    	<settings>
    			<setting name= "logImpl" value = "LOG4J"/>
    		</settings>
    	<typeAliases>
              <typeAlias alias="user" type="org.fkit.domain.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://127.0.0.1:3306/mybatis"/>
    					<property name = "username" value = "root"/>
    					<property name = "password" value = "986532"/>
    				</dataSource>
    			</environment>
    		</environments>
    		<mappers>
    			<mapper resource = "org/fkit/mapper/UserMapper.xml"/>
    		</mappers>
    	</configuration>
    

        4,建立SQL语句模板;

          前面提到,MyBatis的半自动化机制,就是要编写相应的SQL语句模板,所以我们需要这样一个文件;我想叫它做映射文件;

          

    <?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 = "org.fkit.mapper.UserMapper">
        <insert id = "save" parameterType ="user" useGeneratedKeys = "true">
            INSERT INTO TB_USER(name,sex,age) VALUES(#{name},#{sex},#{age})
        </insert>
        <select id = "selectUser" parameterType = "Integer" resultType = "user">
            SELECT * FROM TB_USER WHERE id = #{id}
        </select>
         <update id = "modifyUser" parameterType = "user">
            UPDATE TB_USER
            SET name = #{name},sex = #{sex},age = #{age}
            WHERE id = #{id}
        </update>
        <delete id = "removeUser" parameterType = "int">                                                                                                            
            delete from TB_USER WHERE id = #{id}
        </delete>
    </mapper>

          5,编写测试类

            做完上述配置之后,我们就可以开始做测试类来进行测试了。先上一段原始的;

    package org.fkit.tst;
    
    import java.io.InputStream;
    
    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.fkit.domain.User;
    import org.fkit.factory.FKSqlSessionFactory;
    
    public class MyBatisTest {
    
        public static void main(String[] args) throws Exception{
            InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession session = sqlSessionFactory.openSession();
            User user = new User("admin","男",22);
            session.insert("org.fkit.mapper.UserMapper.save",user);
            session.commit();
            session.close();
        }
    }

          其中,SqlSession是MyBatis中作为操纵数据库的重要对象,相当于JDBC中的connection;而以上代码我们可以进行再封装;代码如下:

    package org.fkit.factory;
    
    import java.io.InputStream;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    public class FKSqlSessionFactory {
    
        private static SqlSessionFactory sqlSessionFactory = null;
        static{
            try{
                InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        public static SqlSession getSqlSession(){
            return sqlSessionFactory.openSession();
        }
        public static SqlSessionFactory getSqlSessionFactory(){
            return sqlSessionFactory;
        }
    }
    package org.fkit.tst;
    
    import java.io.InputStream;
    
    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.fkit.domain.User;
    import org.fkit.factory.FKSqlSessionFactory;
    
    public class MyBatisTest {
    
        public static void main(String[] args) throws Exception{
            SqlSession session = FKSqlSessionFactory.getSqlSession();
            User user = new User("admin","男",22);
            session.insert("org.fkit.mapper.UserMapper.save",user);
            session.commit();
            session.close();
        }
    }

          将读取配置文件的操作封装在一个Factory类中,这样就可以更加简便。

          6,顺便附上数据库表结构:

            

              

  • 相关阅读:
    thinkphp5 tp5 命名空间 报错 Namespace declaration statement has to be the very first statement in the script
    开启 php 错误 提示 php-fpm 重启 nginx 500错误 解决办法 wdlinux lnmp 一键包 php脚本无法解析执行
    js 设置 cookie 定时 弹出层 提示层 下次访问 不再显示 弹窗 getCookie setCookie setTimeout
    php 二维数组 转字符串 implode 方便 mysql in 查询
    nginx 重启 ps -ef|grep nginx kill -HUP 主进程号
    jquery bootstrap help-block input 表单 提示 帮助 信息
    jquery 倒计时 60秒 短信 验证码 js ajax 获取
    jQuery如何获取同一个类标签的所有的值 遍历
    linux下C语言文件操作相关函数
    gcc,gdb用法
  • 原文地址:https://www.cnblogs.com/zxx123/p/8377361.html
Copyright © 2011-2022 走看看