实训日志 || Mybatis框架理解

Mybatis是一款半自动的ORM框架,提供SQL灵活性和高级映射。它是通过XML或注解配置,将Java对象与数据库表映射。尽管需要手写SQL,但Mybatis简化了参数设置和结果集封装,提高了开发效率。文章介绍了Mybatis的配置、User类创建、Mapper映射文件编写、全局配置文件设置、接口定义以及测试类的编写过程。
摘要由CSDN通过智能技术生成

1、什么是mybatis?

Mybatis是一款半自动的ORM持久层框架,具有较高的SQL灵活性,支持高级映射(一对一、一对多),Mybatis可以通过简单的XML文件或注解来配置和映射原始类型、接口;Mybatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作,但它的数据库无关性较低。

·什么是ORM

Object Relation Mapping , 对象关系映射。对象是☞面向对象对象(Java对象),关系☞的是数据库中的关系模型(数据库表);

对象关系映射,指的就是Java对象和数据库的关系模型之间建立一种对应关系,比如用一个Java的Strudent类去对应数据库中的一张表,类中的属性和表中的列一一对应。Strudent类就对应Student表,一个Student对象就对应Student表中的一行数据。

·为什么mybatis是半自动的ORM框架

用mybatis进行开发,需要手动编写SQL语句。由于mybatis需要手写SQL语句,所以它有较高的灵活性,可以根据需要,自由的对SQL进行定制,也因为要手写SQL,当要切换数据库时,SQL语句可能就要重写,因为不同的数据库有不同的方言,所以mybatis的数据库无关性低。

虽然mybatis需要手写SQL,但是相比于JDBC,它提供了输入映射和输出映射,可以方便的进行SQL参数设置,以及结果集封装。并且还提供了关联查询和动态SQL功能,极大地提升了开发地效率。

·什么是持久层

将业务数据存储到磁盘,也具有长期储备能力,只要磁盘不损坏,如果在断电情况下,重启电脑仍然可以读取数据。

2、开发步骤

1)导入jar包

在pom.xml文件中的<dependencies></dependencies>中导入依赖

 <!-- mysql驱动 -->
    <dependency>
      <groupId>com.mysql</groupId>
      <artifactId>mysql-connector-j</artifactId>
      <version>8.0.32</version>
    </dependency>
    <!--DBCP数据库连接池-->
    <!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
    <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>1.4</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.11</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.26</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

2)创建User类

package entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor

public class User {
    private Integer id;
    private String username;
    private  String userpwd;
    private  double money;
}

3)编写mapper.xml映射文件(写操作对应的SQL语句,例如增删查改)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
        "http://mybatis.apache.org/dtd/mybatis-3-mapper.dtd">
<!-- 该文件是一个Mybatis的映射文件
 namespace:执行的是接口(映射器)的全称(包名,接口名)
 -->
<mapper namespace="mapper.UserMapper">
<select id="selectUserById"  parameterType="int" resultType="entity.User">
    select id,uname as userName,upwd  as userPwd,money from myjdbc where id=#{id}

</select>

    <select id="userLogin" parameterType="entity.User" resultType="entity.User">
        select  id,uname as userName,upwd  as userPwd,money from  myjdbc where uname =#{username}  and upwd =#{userpwd}
    </select>

    <insert id="insertUser" parameterType="entity.User" >
        insert into myjdbc values(null,#{username},#{userpwd},#{money})
    </insert>
    <update id="updatePwdById" parameterType="entity.User">
        update  myjdbc set upwd=#{password}  where  id=#{id}
    </update>

    <delete id="deleteUserById" parameterType="entity.User">
        delete from myjdbc where id=#{id}
    </delete>

</mapper>

4)编写全局配置文件(配置数据源信息)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 该文件是Mybatis配置文件 -->
<!-- 配置Mybatis文件相关数据(配置数据库环境) -->
<configuration>
    <!--
           environments:指定数据库相关信息
           default:默认使用哪一个数据库环境

        -->

    <environments default="gcd">
        <environment id="gcd">
            <!-- 使用JDBC事务管理 -->
            <transactionManager type="JDBC"/>
            <!-- 数据库连接 -->
            <dataSource type="POOLED">
            <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/gcddb"/>
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
        </dataSource>
        </environment>
    </environments>
    <!-- 配置指定的映射文件(指定Mybaitis对数据库操作的地址,默认在resource文件下去找该映射文件) -->
    <mappers>
        <mapper resource="mapper.xml"/>
    </mappers>
</configuration>

5)编写接口类

package mapper;

import entity.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 这个接口也称为mybatis的映射器
 * 映射器中的方法对应的是映射文件中的
 */
public interface UserMapper {
    //根据id查询用户数据
    User selectUserById(Integer id);
    //查询所有用户的数据
    List<User> selectUserAll();

    //用户登录
    User userLogin( User user);

    //用户登录2

    //用户注册
    boolean insertUser(User user);

    //修改密码
    boolean updatePwdById(@Param("password") String password , @Param("id") Integer id );

    //删除数据
    int deleteUserById( Integer id);

    //删除多条数据
    boolean batchById(@Param("ids") String[] ids);

    //
    List<User> selectUserByPage(@Param("page") Integer currectPage, @Param("size") Integer size);



}

6)编写测试类

package testData;

import entity.User;
import mapper.UserMapper;
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 javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class TestUser {
    UserMapper mapper;
    SqlSession sqlSession;
    @Before
    @Test

    public void test01() throws IOException {

        //创建一个数据源工厂
        SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
        //读取mybatis配置文件
        InputStream is = Resources.getResourceAsStream("config.xml");
        /*
         * SqlSessionFactory理解成数据源,相当于JDBC中的DataSource,
         * 以下关于SqlSessionFactory作为理解
         * 1.SqlSessionFactory是线程安全的,可以让多个执行的线程同时存取
         * 2.SqlSessionFactory(单列)当操作多个数据库时,可以为每个数据库指定的SqlSessionFactory
         */
        SqlSessionFactory ssf = ssfb.build(is);
        //sqlSession相当于JDBC的Connction
       sqlSession =  ssf.openSession(true); //自动提交
         /*
             获取映射器:
             SqlSession提供了getMapper()的方法返回符合Mapper的映射器要求的对象,
              在这里我们只需要调用该对象的方法也就是访问了数据库
          */
        mapper = sqlSession.getMapper(UserMapper.class);

    }
    @Test

    public void test02()  {

        User user = mapper.selectUserById(3);
        System.out.println(user);

    }
    @Test

    public void test03()  {

        List<User> users =  mapper.selectUserAll();
        System.out.println(users);

    }

    @Test

    public void test04()  {
        User user = new User();
        user.setUsername("admin100");
        user.setUserpwd("00000");
        User u = mapper.userLogin(user);
        if(u!=null){
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }

    }

    @Test

    public void test06()  {
       User user  =new User(null,"admin","234567",100000);
       boolean b = mapper.insertUser(user);
       sqlSession.commit(); //手动提交
       if(b==true)
       {
           System.out.println("注册成功");
       }else {
           System.out.println("注册失败");
       }

    }

    @Test

    public void test07()  {
        boolean b = mapper.updatePwdById("123456",3);
        if(b==true)
        {
            System.out.println("修改成功");
        }else {
            System.out.println("修改失败");
        }

    }


    @Test

    public void test08()  {
        int n = mapper.deleteUserById(4);
        if(n==1)
        {
            System.out.println("删除成功");
        }else {
            System.out.println("删除失败");
        }

    }

     //映射器(接口)
    //映射文件(mapper)
     @Test

     public void test09()  {
         String[] strArr = {"10","11"};
         boolean b =mapper.batchById(strArr);
         if(b==true)
         {
             System.out.println("批量删除成功");
         }else {
             System.out.println("批量删除失败");
         }

     }

    @Test

    public void test10()  {
        List<User> users = mapper.selectUserByPage(1,2);
        System.out.println(users.size());

    }
}

3、总结

Mybatis其实是对JDBC的操作数据库的过程进行了封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建Connection、手动设置参数等JDBC复杂的代码。

JDBC和Mybatis的区别

1)从层次上看,JDBC是较底层的持久层操作方式,而Mybatis都是在JDBC基础上进行了封装使其更加方便程序员对数据库的操作。

2)从功能上看,JDBC只是简单的建立数据库连接,然后建立statement,将Sql语句传给statement去执行,如果是有返回结果的查询语句,则会将查询结果放到ResultSet对象,通过对ResultSet对象的遍历来获取数据。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值