JDBC太死板,不试试Mybatis大法?

Mybatis简介

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。

MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

Mybatis框架核心

1、mybatis配置文件,包括Mybatis全局配置文件和Mybatis映射文件,其中全局配置文件配置了数据源、事务等信息;映射文件配置了SQL执行相关的信息。

2、mybatis通过读取配置文件信息(全局配置文件和映射文件),构造出SqlSessionFactory,即会话工厂。

3、通过SqlSessionFactory,可以创建SqlSession即会话。Mybatis是通过SqlSession来操作数据库的。

4、SqlSession本身不能直接操作数据库,它是通过底层的Executor执行器接口来操作数据库的。Executor接口有两个实现类,一个是普通执行器,一个是缓存执行器(默认)。

5、Executor执行器要处理的SQL信息是封装到一个底层对象MappedStatement中。该对象包括:SQL语句、输入参数映射信息、输出结果集映射信息。其中输入参数和输出结果的映射类型包括HashMap集合对象、POJO对象类型。

Mybatis使用入门指南

1.下载Mybatis

mybaits的代码由github.com管理,下载地址:Mybatis下载网址
在这里插入图片描述

2.导入jar包

Mybatis的jar包
在这里插入图片描述
此外,Mybatis属于是JDBC框架,自然少不了jdbc的驱动包啦,根据使用的数据库,下载对应的驱动包就行了。

本教程中还额外使用了junit,便于代码的分段测试,与Mybatis框架无关。

以上提到的两种jar包,推荐前往Maven仓库进行下载,链接为Maven中央仓库

3.代码实现

完成了jar包导入后,我们就可以开始进行Mybatis框架的搭建与使用啦。
(本教程使用的编辑器为Intellij IDEA)

a)创建一个java项目
在这里插入图片描述
无须勾选任何框架,直接一路Next,输入项目名称,点击Finish便创建完成。

b)创建项目内文件架构
在这里插入图片描述
整个项目的文件架构如上图所示,接下来,博主会顺着架构的顺序依次进行讲解!

c)开发步骤:
1、创建PO(model)类,根据需求创建;
2、创建全局配置文件SqlMapConfig.xml;
3、编写映射文件;
4、加载映射文件,在SqlMapConfig.xml中进行加载;
5、编写测试程序,即编写Java代码,连接并操作数据库。

思路:
1.读取配置文件;
2.通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂。
3.通过SqlSessionFactory创建SqlSession。
4.调用SqlSession的操作数据库方法。
5.关闭SqlSession。

在看代码实现之前,希望小伙伴能够熟记这个Mybatis开发的流程,代码是实现的一种工具,开发的思路才是核心,只有掌握了思路,才能在面对问题的时候想到解决方案。

d)代码实现
在开始之前,先给自己的开发过程搞一份“保险”,就是使用lib包中导入的log4j这个jar包,提供日志。
在这里插入图片描述
log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

“保险”搞定,那么就开始干活了!

根据思路的第一步,根据需求创建model类。

既然要创建model,那么我们首先要有一张数据表
在这里插入图片描述
接下来的操作博主就基于这张表来讲解。

User.java

package model;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
	
	//这里的变量与表中的列一致
    private int id;
    private String username;
    private String password;
    
    //常规get/set方法
    public int getId(){
        return id;
    }
    public void setId(int id){
        this.id=id;
    }
    public String getUsername(){
        return username;
    }
    public void setUsername(String username){
        this.username=username;
    }
    public String getPassword(){
        return password;
    }
    public void setPassword(String password){
        this.password=password;
    }
    
	//定义类容器
    public User(){
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }
    
    //定义输出结构
    @Override
    public String toString(){
        return "User[id="+id+",username="+username+",password="+password+"]";
    }
}

第二步,创建全局配置文件SqlMapConfig.xml

SqlMapConfig.xml

<?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>
    <properties resource="db.properties"></properties>
    <!--配置别名-->
    <typeAliases>
        <package name="model"></package>
    </typeAliases>
</configuration>

第三步,编写映射文件;

User.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="user">
	//查找用户sql语句
    <select id="findUserByName" parameterType="String" resultType="model.User">
        select * from user where username like '%${value}%'
    </select>
    //插入用户sql语句
    <insert id="insertUser" parameterType="model.User">
        <selectKey keyProperty="id" resultType="int" order="AFTER">
            select LAST_INSERT_ID()
        </selectKey>
        insert into user(username,password)
        values(#{username},#{password});
    </insert>
    //删除用户sql语句
    <delete id="deleteUser" parameterType="String">
        delete from user where username=#{username}
    </delete>
    //更新用户sql语句
    <update id="updateUser" parameterType="model.User">
        update user set password=#{password} where id=#{id};
    </update>
</mapper>

第四步,加载映射文件,在SqlMapConfig.xml中进行加载

<mappers>
	<mapper resource="sqlmap/User.xml"></mapper>
</mappers>

上面的代码添加到SqlMapConfig.xml末尾的位置,完整的代码如下:

SqlMapConfig.xml

<?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>
    <properties resource="db.properties"></properties>
    <!--配置别名-->
    <typeAliases>
        <package name="model"></package>
    </typeAliases>
    <mappers>
        <mapper resource="sqlmap/User.xml"></mapper>
    </mappers>
</configuration>

第五步,编写测试程序,即编写Java代码,连接并操作数据库。

1.读取配置文件

既然是要操作数据库,那必须要和数据库连接呀,那么JDBC技术中的数据库基本配置步骤还是不能少的,走起!

db.properties

driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
name=root
password=******

上面是使用数据库的配置文件,以这种额外配置文件的形式写出有一个好处,就是你下次写Mybatis项目的时候这个配置文件可以直接复制黏贴,不用再写一遍了。

注意:与JDBC的url略有不同,url要加serverTimezone=UTC,否则会报错!

接下来,就去SqlMapConfig.xml中配置Mybatis

<!--配置Mybatis信息-->
    <environments default="development">
        <environment id="development">
            <!--配置JDBC事务控制,有Mybatis进行管理-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源,采用dbcp连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${driverClass}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${name}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

完整的代码如下

SqlMapConfig.xml

<?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>
    <properties resource="db.properties"></properties>
    <!--配置别名-->
    <typeAliases>
        <package name="model"></package>
    </typeAliases>
    <!--配置Mybatis信息-->
    <environments default="development">
        <environment id="development">
            <!--配置JDBC事务控制,有Mybatis进行管理-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源,采用dbcp连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${driverClass}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${name}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="sqlmap/User.xml"></mapper>
    </mappers>
</configuration>

2.通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂

demo.java

package test;

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

import java.io.InputStream;

public class demo {

    @Before
    public void before() throws IOException {
        System.out.println("获取session");
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }
}

3.通过SqlSessionFactory创建SqlSession

demo.java

package test;

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

import java.io.InputStream;

public class demo {

    SqlSession session = null;

    @Before
    public void before() throws IOException {
        System.out.println("获取session");
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        session = sessionFactory.openSession();
    }
}

4.调用SqlSession的操作数据库方法

demo.java

package test;

import model.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class demo {

    SqlSession session = null;

    @Before
    public void before() throws IOException {
        System.out.println("获取session");
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        session = sessionFactory.openSession();
    }

    //添加用户
    @Test
    public void test1() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sessionFactory.openSession();
        User user = new User("superadmin", "superadmin");
        int i = session.insert("insertUser", user);
        session.commit();
        System.out.println("===i=" + i);
        System.out.println("用户的id : " + user.getId());
    }

    //删除用户
    @Test
    public void test2() throws IOException {
        int i = session.delete("deleteUser", "superadmin");
        session.commit();
        System.out.println("i=" + i);
    }

    //更新用户
    @Test
    public void test3() throws IOException {
        User user = new User();
        user.setId(1);
        user.setPassword("root");
        int i = session.update("updateUser", user);
        session.commit();
        System.out.println("更改的行号:" + i);
    }
    //查找用户
    @Test
    public void test4() throws IOException{
        List<User> users = session.selectList("findUserByName", "y");
        System.out.println(users);
    }
}

5.关闭SqlSession

package test;

import model.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class demo {

    SqlSession session = null;

    @Before
    public void before() throws IOException {
        System.out.println("获取session");
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        session = sessionFactory.openSession();
    }

    @After
    public void after() {
        System.out.println("关闭session");
        session.close();
    }

    //添加用户
    @Test
    public void test1() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sessionFactory.openSession();
        User user = new User("superadmin", "superadmin");
        int i = session.insert("insertUser", user);
        session.commit();
        System.out.println("===i=" + i);
        System.out.println("用户的id : " + user.getId());
    }

    //删除用户
    @Test
    public void test2() throws IOException {
        int i = session.delete("deleteUser", "superadmin");
        session.commit();
        System.out.println("i=" + i);
    }

    //更新用户
    @Test
    public void test3() throws IOException {
        User user = new User();
        user.setId(1);
        user.setPassword("root");
        int i = session.update("updateUser", user);
        session.commit();
        System.out.println("更改的行号:" + i);
    }
    //查找用户
    @Test
    public void test4() throws IOException{
        List<User> users = session.selectList("findUserByName", "y");
        System.out.println(users);
    }
}

好啦,到这里整个Mybatis实现增删改查就完成啦!是不是感觉比JDBC更加的灵活呢?

结语

这篇博客主要介绍了Mybatis实现增删改查,如果想了解JDBC的小伙伴可以看下博主的这篇文章JDBC连接数据库详解

如果说这篇文章有让你学到一定的知识的话,不妨点个赞和关注,让博主能够看到。如果讲解中有什么错误和疏忽,也劳烦在评论中指出或提问,博主会第一时间进行更新和答复,谢谢!

发布了8 篇原创文章 · 获赞 10 · 访问量 322

猜你喜欢

转载自blog.csdn.net/weixin_44018540/article/details/103930688
今日推荐