Mybaits 官方入门【mybaits】

44

简介

1.1、什么是Mybaits

  • Mybaits 是一款优秀的持久层框架
  • 它支持定制化SQL、存储过程以及高级映射。
  • Mybaits 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
  • Mybaits 可以使用简单的XML或注解来配置和映射原生类型、接口和Java的POJO(Plain Old Java Objects,普通老式Java对象)为数据库中的记录。
  • Mybaits 本是apache的一个开源项目iBaits,2010年这个项目由apache software foundation 迁移到了google code,并改名为Mybaits。
  • 2013年11月迁移到GitHub。

如何获得Mybaits?

  • maven仓库:
 <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.5</version>
  </dependency>
  • GitHub:https://github.com/mybatis/mybatis-3
  • 中文文档:https://mybatis.org/mybatis-3/zh/index.html

1.2、持久化

数据持久化

  • 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
  • 内存:断电即失
  • 数据库(jdbc),io文件持久化。
  • 生活:冷藏、罐头。

为什么需要持久化?

  • 有一些对象。不能让他丢掉。
  • 内存太贵了

1.3、持久层

Dao层,Service层,Controller层…

  • 完成持久化工作的代码块
  • 层界限十分明显

1.4、为什么需要Mybaits?

  • 帮助程序员将数据存入到数据库中。
  • 方便
  • 传统的JDBC代码太复杂了。简化。框架。自动化。
  • 优点:
    • 简单易学
    • 灵活
    • sql和代码分离,提高了可维护性
    • 提供映射标签,支持对象与数据库的orm字段关系映射
    • 提供对象关系映射标签,支持对象关系组建维护
    • 提供xml标签,支持编写动态sql

最重要的一点:使用的人多!

2、第一个Mybaits程序

思路:搭建环境–>导入Mybaits–>编写代码–>测试!

2.1、环境搭建

新建项目

  • 创建maven工程并导入依赖坐标
<dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.44</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
    </dependencies>

2.2、创建一个模块

  • 编写Mybaits的核心配置文件SqlMapConfig.xml或者mybaits-config名称随意
<?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>
        <package name="com.chif.domain"></package>
    </typeAliases>

    <!-- 配置环境 -->
    <environments default="mysql">
        <!-- 配置mysql的环境 -->
        <environment id="mysql">
            <!-- 配置事务的类型 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据源(连接池) -->
            <dataSource type="POOLED">
                <!-- 配置链接数据库的4个基本信息 -->
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/test" />
                <property name="username" value="root" />
                <property name="password" value="105105" />
            </dataSource>
        </environment>
    </environments>

    <!-- 指定映射配置文件的位置,映射配置文件值指的是每个dao独立的配置文件
         如果使用注解来配置,此处应该使用class属性指定被注解的dao全限定类名
 	 <mappers>
        <package name="com.chif.dao"/>
     </mappers>
     -->
  
</configuration>
  • 编写mybaits工具类
package com.chif.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.*;

import java.io.IOException;
import java.io.InputStream;

public class MybaitsUtils {
    
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            //1.获取sqlSessionFactory对象
            String resource="SqlMapConfig.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    //2.获取sqlSession
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
    }
    
}

2.3、编写代码

  • 实体类 User
  • dao接口
package com.chif.dao;

import com.chif.domain.User;
import java.util.List;

/**
 * 用户的持久层接口
 */
public interface UserDao {
    /**
     * 查询所有
     */
    //@Select("select * from  user;")
    public List<User> findAll();
    
}
  • 编写映射配置文件(代替接口的实现类)
    UserMapper.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">

<mapper namespace="com.chif.dao.UserDao">
    <!-- 配置查询所有 -->
    <select id="findAll" resultType="com.chif.domain.User">
        select * from  user;
    </select>
</mapper>    
  • 在核心配置文件中指定映射配置文件的位置
	<!-- 指定映射配置文件的位置,映射配置文件值指的是每个dao独立的配置文件
	         如果使用注解来配置,此处应该使用class属性指定被注解的dao全限定类名
     -->
    <mappers>
        <mapper class="com.chif.dao.UserDao"/>
    </mappers>
  • 测试
package com.chif.dao;

import com.chif.pojo.User;
import com.chif.utils.MybaitsUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class UserDaoTest {

    @Test
    public void test(){
        //1.获取SqlSession对象
        SqlSession sqlSession = MybaitsUtils.getSqlSession();
        //2.执行sql

        //方式一
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> userList = userDao.findAll();

        //方式二
//        List<User> userList = sqlSession.selectList("com.chif.dao.UserDao.findAll");


        for (User user : userList) {
            System.out.println(user);
        }

        //3.关闭SqlSession
        sqlSession.close();
    }
}

  • 注意事项:
    • 创建UserDao.xml 和 Userdao.java,名称是为了和之前的习惯保持一致
      在Mybaits中把持久层的操作接口名称和映射文件也叫做:Mapper
      所以:UserDao和UserMapper是一样的。

    • 在idea中创建目录的时候,目录和包是不一样的
      包在创建时:com.chif.dao 是三级结构
      目录在创建时:com.chif.dao 是一级结构

    • mybatis的映射配置文件必须和dao接口的包结构相同

    • 映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名

    • 映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名。

    • 当遵从了以上后三点时,在开发中就无须再写dao的实现类。

UserMapper.xml映射文件实现类

CRUD

1、namespace

namespace中的包名要和 Dao/mapper接口的包名一致,可以理解为绑定接口

2、select

选择、查询语句:

  • id:就是对应的namespace中的方法名;

  • resultType:Sql语句执行的返回值

  • parameterType:参数类型

    1.编写接口

     /**
     * 根据id查询用户
     */
    public User getUserById(int id);
    

    2.编写对应mapper中的sql语句

    <!--根据id查询用户-->
    <select id="getUserById" parameterType="int" resultType="com.chif.pojo.User">
        select * from user where id=#{id}
    </select>
    

    3.测试

    @Test
    public void testFindById(){
        //1.获取sqlSession对象
        SqlSession sqlSession = MybaitsUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserById(45);
        System.out.println(user);
    
        //2.关闭
        sqlSession.close();
    }
    

3、Insert

    <!--增加用户-->
    <insert id="addUser" parameterType="com.chif.pojo.User">
        insert into user(username) values(#{username})
    </insert>

4、update

 <!--修改用户-->
    <update id="updateUser" parameterType="com.chif.pojo.User">
        update user set username=#{username} where id=#{id}
    </update>

5、delete

<!--删除用户-->
    <delete id="deleteUser" parameterType="int">
        delete from user where id=#{id}
    </delete>

6、注意事项

  • 增删改需要提交事务!

  • 以上是基于代理dao的CRUD操作

7、万能Map

接口

    /**
     * 增加用户
     */
    public int addUser2(Map<String,Object> map);

配置

<!--增加用户-map-->
    <insert id="addUser2" parameterType="map">
        insert into user(username) values(#{name})
    </insert>

测试

@Test
    public void testAddUser2(){
        //1.获取sqlsession
        SqlSession sqlSession = MybaitsUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        Map<String,Object> map=new HashMap<String, Object>();
        map.put("name","老刘");
        int falg = mapper.addUser2(map);

        if (falg==1){
            System.out.println("插入成功"+falg);
        }

        //2.提交事务
        sqlSession.commit();
        //3.关闭
        sqlSession.close();
    }

mybatis中接口参数使用map类型的好处

  • 不用指定每个参数的名称.

  • 可以传递任意数量和任意类型的参数,而不用对每个参数进行命名和申明,非常利于扩展,在需要时不用额外动Java代码在xml中可以更灵活的获取参数,不用受前端参数变化的影响 parameterType="map"

  • 对象传递参数,在sql中取出对象的属性。parameterType="com.chif.pojo.User"

  • 只有一个基本类型参数的情况下,可以直接在sql中取到。 parameterType="int"可以省略不写

  • 多个参数用Map或者注解

8、模糊查询

两种方法
1.java代码执行的时候,传递通配符%%
mapper.getUserLike("%老%");
2.在sql拼接中使用通配符
select * from user where username like "%"#{value}"%"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值