Mybatis(一)之概述

Mybatis的介绍

mybatis就是一个封装来jdbc的持久层框架,它和hibernate都属于ORM框架,但是具体的说,hibernate是一个完全的orm框架,而mybatis是一个不完全的orm框架。

Mybatis让程序员只关注sql本身,而不需要去关注如连接的创建、statement的创建等操作。

Mybatis会将输入参数、输出结果进行映射。


Mybatis与Hibernate的区别及各自应用场景

Mybatis技术特点:
1、  通过直接编写SQL语句,可以直接对SQL进行性能的优化;
2、  学习门槛低,学习成本低。只要有SQL基础,就可以学习mybatis,而且很容易上手;
3、  由于直接编写SQL语句,所以灵活多变,代码维护性更好。
4、  不能支持数据库无关性,即数据库发生变更,要写多套代码进行支持,移植性不好。
5、  需要编写结果映射。
Hibernate技术特点:
1、  标准的orm框架,程序员不需要编写SQL语句。
2、  具有良好的数据库无关性,即数据库发生变化的话,代码无需再次编写。
3、  学习门槛高,需要对数据关系模型有良好的基础,而且在设置OR映射的时候,需要考虑好性能和对象模型的权衡。
4、  程序员不能自主的去进行SQL性能优化。
Mybatis应用场景:
需求多变的互联网项目,例如电商项目。

Hibernate应用场景:
需求明确、业务固定的项目,例如OA项目、ERP项目等。

分析JDBC的问题

1、 在创建连接时,存在硬编码
解决:配置文件(全局配置文件)
2、 在执行statement时存在硬编码
解决:配置文件(映射文件)
3、 频繁的开启和关闭数据库连接,会造成数据库性能下降。
解决:数据库连接池(全局配置文件)


Mybatis的框架原理

Mybatis(一)之概述_第1张图片


入门案例一

数据库
Mybatis(一)之概述_第2张图片
Mybatis(一)之概述_第3张图片
1.创建普通的Java项目,导入Mybatis的jar包、mysql驱动包以及Junit包
目录结构如下
Mybatis(一)之概述_第4张图片
2.关键的是Mybatis的全局配置文件(MybatisConfig.xml)以及映射文件(User.xml),文件命名无硬性要求




<configuration>
    
    <properties resource="db.properties">
        <property name="db.username" value="root" />
        <property name="db.password" value="root" />
    properties>
    
    <environments default="development">
        <environment id="development">
            
            <transactionManager type="JDBC">transactionManager>
            
            <dataSource type="POOLED">
                <property name="driver" value="${db.driver}" />
                <property name="url" value="${db.url}" />
                <property name="username" value="${db.username}" />
                <property name="password" value="${db.password}" />
            dataSource>
        environment>
    environments>
    
    <mappers>
        <mapper resource="User.xml" />
    mappers>
configuration>





<mapper namespace="User">
    
    
    
    
    
    
    
    <select id="findUserById" parameterType="int" resultType="com.zyj.mybatis.domain.User">
        select * from user where id = #{id}
    select>

    
    
    
    
    <select id="findUsersByName" parameterType="java.lang.String" resultType="com.zyj.mybatis.domain.User">
        select * from user where username like '%${value}%'
    select>

    
    
    
    
    <insert id="addUser" parameterType="com.zyj.mybatis.domain.User">
        <selectKey keyProperty="id" resultType="int" order="AFTER">
            select last_insert_id()
        selectKey>
        insert into user(username) values(#{username})
    insert>

    
    <insert id="addUser2" parameterType="com.zyj.mybatis.domain.User2">
        
        <selectKey keyProperty="id" resultType="string" order="BEFORE">
            select uuid()
        selectKey>
        insert into user2(id, username) values(#{id}, #{username})
    insert>
mapper>
public class APITest {

    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void setUp() throws IOException {
        // 读取配置文件
        String resource = "MybatisConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 创建sqlSessionFactory
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    @Test
    public void findUserByIdTest() throws IOException {
        // 开启sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 通过sqlSession执行executor获取结果
        // 第一个参数:表示statement的唯一标示
        User user = sqlSession.selectOne("User.findUserById", 1);

        System.out.println(user);
        // 关闭资源
        sqlSession.close();
    }

    @Test
    public void findUserByNameTest() throws IOException {
        // 开启sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 通过sqlSession执行executor获取结果
        // 第一个参数:表示statement的唯一标示
        List selectList = sqlSession.selectList("User.findUserByName", "小明");

        System.out.println(selectList);
        // 关闭资源
        sqlSession.close();
    }

    @Test
    public void addUserTest() throws IOException {
        // 开启sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 通过sqlSession执行executor获取结果
        // 第一个参数:表示statement的唯一标示
        User2 user2 = new User2();
        user2.setUsername("张育嘉");
        sqlSession.insert("User.addUser2", user2);

        System.out.println(user2.getId());
        // 提交事务
        sqlSession.commit();
        // 关闭资源
        sqlSession.close();
    }
} 
  

小结

    #{}和${}
    1.#{}表示占位符?,#{}接收简单类型的参数时,里面的名称可以任意
    2.${}表示拼接符,${}接收简单类型的参数时,里面的名称必须是value
    3.${}里面的值会原样输出,不加解析(如果该参数值是字符串,就不会添加引号)
    4.${}存在sql注入的风险,但是有些场景下必须使用,比如排序后面会动态传入排序的列名

    parameterTyperesultType
    1.parameterType指定输入参数的java类型,parameterType只有一个,也就是说入参只有一个。
    2.resultType指定输出结果的java类型(是单条记录的java类型)

    selectOneselectList
    1.selectOne查询单个对象
    2.selectList查询集合对象

你可能感兴趣的:(【框架】Mybatis)