MyBatis从入门到不放弃(一)

在这里插入图片描述
MyBatis是目前java中使用最广泛的持久层框架,之前一直使用hibernate,但是它是全自动的,对于我们来说,有些sql语句还是要自己写的,所以MyBatis是半自动化的持久层框架。接下来,通过一篇文章来学会如何使用这个框架(还是那句话,学框架先不管什么原理,先把它跑起来再说,然后去学习,有代码的基础上去理解,这样会更加有效 个人建议,勿喷)
首先不管学习什么框架,要先准备好配置文件、jar包。可以去官网下载mybatis框架,里面就会一些必须的jar包,以及配置文件。下面先通过一个简单的案例使用MyBatis连接数据库。
配置文件如下:
SqlMappingConfig.xml(放在src下)

<?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>

    <!--配置sql打印-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!-- spring整合后 environments配置将废除 使用spring中的连接池 -->
    <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/jdbc?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <!--加载映射文件  这里就是将和你实体类在一起的配置文件加载进来-->
    <mappers>
        <mapper resource="com/yxc/domain/student.xml"></mapper>
    </mappers>
</configuration>

Student.java

package com.yxc.domain;

import lombok.Getter;
import lombok.Setter;

/**
 * 有了这个注解以后就不需要手动添加getter和setter方法了
 */
@Setter@Getter
public class Student {
    private int id;
    private String name;
    private int age;

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

student.xml(文件放在和student实例类同一目录下)

<?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="myTest1">
	<!--查询所有
     id:去一个标识符,后面会使用
     resultTYpe:返回的是什么类型的数据
     -->
	<select id="queryAll" resultType="com.yxc.domain.Student">
		select * from stu
	</select>
</mapper>

测试代码

package com.yxc.test;

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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
 * 测试类
 */
public class MyTest1 {
    public static void main(String[] args) throws IOException {
        //获取一个SqlSessionFactoryBuilder对象,用来获取SqlSessionFactory
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //加载配置文件
        InputStream in = Resources.getResourceAsStream("SqlMappingConfig.xml");
        //获取sqlSessionFactory
        SqlSessionFactory  sqlSessionFactory= sqlSessionFactoryBuilder.build(in);
        //最终目的获取一个数据库操作对象sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        System.out.println(sqlSession);
        List<Object> students = sqlSession.selectList("queryByName1");//这里的名字就是刚刚配置文件中id
        System.out.println(students);
        //关闭资源
        sqlSession.close();
    }

    }

执行结果就是将表中的所有学生信息打印出来。
我们可以发现其实基本原理还是和hibernate差不多的额,只是在少数地方变换了一下,hibernate是Session,而这边是sqlSession。关于两个框架的不同之处我们后面再说。学完以后再来总结一下所有的不同之处
在实体类中我们使用了@Setter@Getter,这样我们就不需要自己写get和set方法了,只要我们添加属性,它就会帮我们自动生成方法,使用这个主机首先要导入jar包(lombok.jar),在Idea中开发注意一定要将工程开启注解,否则工程是不会支持注解的,那么这个方法也就不会起到任何作用了,在Eclipse中开发,要安装一个插件以后导入jar包才可以使用。如果学过hibernate那么上面的代码肯定一看就可以理解,当然如果没有那么先不急着往后看,先理清一下代码,看看程序是怎么个执行流程。
下面通过我们老套路,使用MyBatis实现一个用户的增删查改的功能。
提示一下,所有数据库的操作第一步请把数据库的表建立好。
实体类

package com.yxc.domain;

import lombok.Getter;
import lombok.Setter;

/**
 * 一个用户类
 */
@Setter@Getter
public class User {
    private int id;
    private String username;
    private String password;
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

实体类对应的配置文件

<?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="CRUDByMyDatis">
    <!--在这里面配置各种sql语句-->

    <!--添加用户-->
    <select id="addUser" parameterType="com.yxc.domain.User">
        insert into user values(#{id},#{username},#{password})
    </select>

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

    <!--更新数据-->
    <select id="updateUser" parameterType="com.yxc.domain.User">
        update user set username=#{username} where id=#{id}
    </select>

    <!--根据id查询一条用户信息-->
    <select id="selectUser" parameterType="int" resultType="com.yxc.domain.User">
        select * from user where id=#{id}
    </select>

    <!--查询所有用户信息-->
    <select id="selectAll" resultType="com.yxc.domain.User">
        select * from user
    </select>

    <!--模糊查询-->
    <select id="selectByName" parameterType="String" resultType="com.yxc.domain.User">
        select * from user where username like '%${value}%'
    </select>

</mapper>



套路,对于数据库操作我们都喜欢写一个工具类 原因就是对于有些东西整个工程是共享的,所以我们只要在类加载的时候加载一次就可以了。提高效率

package com.yxc.utils;

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 java.io.IOException;
import java.io.InputStream;

/**
 * 获取SqlSession的工具类
 */
public class MyBatisUtils {
    private static SqlSessionFactory sqlSessionFactory=null;
    static{
        //创建一个SqlSessionFactoryBuilder对象,用来获取SqlSessionFactory
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();
        //加载配置文件
        InputStream in = null;
        try {
            in = Resources.getResourceAsStream("SqlMappingConfig.xml");
            sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 这个静态方法直接获取一个sqlsession对象
     * @return
     */
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

核心配置文件(我们可以发现其实核心配置文件每一次基本不需要修改什么,如果数据库的信息改了,那么我们修改一下,然后实体类资源的引入修改一下)

<?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>

    <!--配置sql打印-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!-- spring整合后 environments配置将废除 使用spring中的连接池 -->
    <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/jdbc?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="Y13627037792" />
            </dataSource>
        </environment>
    </environments>
    <!--加载映射文件-->
    <mappers>
        <mapper resource="com/yxc/domain/student.xml"></mapper>
        <mapper resource="com/yxc/domain/user.xml"></mapper>
    </mappers>
</configuration>

测试类
测试类中main方法都没有怎么测试,这里我们使用之前就是用过的单元测试,当然还是需要导入jar包,之后直接在方法上面贴上@Test标签,而且在IDEA中要开启支持注解。要执行哪一个方法,就双击它,右击然后执行就可以执行本方法了。

package com.yxc.test;

import com.yxc.domain.User;
import com.yxc.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

/**
 * 通过Mybatis来完成数据中的增删查改
 */
public class CRUDByMyDatis {
    //我们这里都是用测试方法

    @Test
    /**新增一个用户*/
    public void testAddUser(){
        //获取一个sqlSession对象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        //给定一个要添加的用户对象
        User user=new User();
        user.setId(5);
       user.setUsername("yyy");
        user.setPassword("555");
        sqlSession.insert("addUser",user);
        //提交事务
        sqlSession.commit();
        //关闭资源
       sqlSession.close();
    }

    @Test
    /**根据id删除一个用户*/
    public void deleteUser(){
        //获取sqlSession对象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        int result = sqlSession.delete("deleteUser", 5);
        //同样的如果操作成功,返回1
        System.out.println(result);
        //提交事务然后关闭资源
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    /**跟新一个用户信息*/
    public void updateUser(){
        //获取sqlSession对象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        User user=new User();
        user.setId(1);
        user.setUsername("yxc");
        int result = sqlSession.update("updateUser", user);
        System.out.println(result);
        //提交事务然后关闭资源
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    /**根据id查询一个用户信息*/
    public void selectOneUser(){
        //获取sqlSession对象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        //查询
        User user = sqlSession.selectOne("selectUser", 1);
        System.out.println(user);
        //对于查询语句来说不需要提交事务
        sqlSession.close();
    }
    /**查询所有用户信息*/
    @Test
    public void selectAll(){
        //获取sqlSession对象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        //查询所有
        List<User>  allUser = sqlSession.selectList("selectAll");
        System.out.println(allUser);
        //对于查询语句来说不需要提交事务
        sqlSession.close();
    }

    /**模糊查询 查询用户名中有字母x的用户
     * 使用这个方法只是想让我们了解一下#{}和${}的区别
     * #{}是一个占位符,${}是字符串拼接
     * #{}里面填的可以是value值,也可以是实体类中属性 ${}里面只能写value
     * */
    @Test
    public void selectByName(){
        //获取sqlSession对象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        //模糊查询所有
        List<User>  allUser = sqlSession.selectList("selectByName","x");
        System.out.println(allUser);
        //对于查询语句来说不需要提交事务
        sqlSession.close();
    }
}

上面就是简单的MyBatis入门,学会如果搭建好工程环境。这样我们在学习后面的知识的时候才可以很好的学习,多动手实现,是最好的检验学习的方法。

发布了33 篇原创文章 · 获赞 37 · 访问量 4399

猜你喜欢

转载自blog.csdn.net/weixin_42142899/article/details/101786372