使用 MyBatis 操作数据库

一、概述

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects)为数据库中的记录。

二、数据库表

在这里插入图片描述

三、JDBC连接数据库(MyBatis底层实现)

以下为JDBC连接和操作数据库代码

package com.test;

import java.sql.*;

/**
 * @author Nigori
 * @date 2020/2/13
 **/
public class JdbcTest_01 {

    static final String driver = "com.mysql.jdbc.Driver";
    static final String url = "jdbc:mysql://localhost:3306/db_mybatis_test?useUnicode=true&characterEncoding=utf-8&useSSL=false";
    static final String username = "root";
    static final String password = "root";

    public static void main(String[] args) {

        Connection conn = null;
        PreparedStatement prst = null;
        ResultSet rs = null;

        try {
            //1、加载连接驱动
            Class.forName(driver);

            //2、getConnection()方法连接数据库
            conn = DriverManager.getConnection(url,username,password);

            //3、写执行的SQL语句
            String sql = "select * from tb_role";

            //4、创建PreparedStatement类对象,用来执行SQL语句
            prst = conn.prepareStatement(sql);

            //5.ResultSet类,用来存放获取的结果集
            rs = prst.executeQuery();

            //6、循环输出结果集内容
            while(rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String role = rs.getString("role");
                
                System.out.println("id  "+id+"  --  "+"name  "+name+"  role  "+role);
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}

总结
JDBC连接和操作数据库基本步骤:
1. 创建项目后导入连接数据库的jar包,下载:mysql-connector-java-5.1.48.jar
2. 设置四大属性(driver ,url ,username,password)
3. 加载数据库驱动
4. 创建Connection对象,连接数据库
5. 创建PreparedStatement 对象,执行SQL语句
6. 创建ResultSet对象,保存结果集

四、MyBatis 的四大核心组件

  • SqlSessionFactoryBuilder(构造器)
  • SqlSessionFactory(工厂接口)
  • SqlSession(会话)
  • SQL Mapper(映射器)
    在这里插入图片描述

MyBatis-3 的 GitHub 地址:https://github.com/Convallaria-gjh/mybatis-3

1. SqlSessionFactoryBuilder(构造器)

SqlSessionFactoryBuilder 仅用于创建SqlSessionFactory,创建成功后生命周期结束。

2. SqlSessionFactory(工厂接口)

SqlSessionFactory 可被认为为数据库的连接池,生命周期为整个MyBatis 应用中。其作为一个单例,让它在应用中被共享。

在这里插入图片描述
构建SqlSessionFactory方式:
① XML 方式:详见 五、MyBatis框架访问数据库mybatis-config.xml
② 代码方式:
常用于 在配置文件中,需要配置加密过的数据库用户名和密码,需要在我们生成SqlSessionFactory前解密为明文的时候。

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
3. SqlSession(会话)

SqlSession 相当于数据库的一个连接(Connection 对象)生命周期应该存活在一个业务的请求中,需用 try…catch…finally… 语句保证其正确关闭。
在这里插入图片描述
SqlSession 的作用:

  • 获取 Mapper 接口
  • 发送 SQL 语句
  • 控制数据库事务
4. SQL Mapper(映射器)

映射器 由一个接口和对应的 XML 文件(或注解)组成。 可以配置以下内容:

  • 描述映射规则
  • 提供 SQL 语句,并可以配置SQL的参数类型,返回类型,缓存刷新等信息
  • 配置缓存
  • 提供动态SQL

实现方式:
① XML 实现:

  • mapper 包下定义接口
  • mapper 包下配置 SQL 映射文件
  • 在主配置文件(mybatis-config.xml)中加载 SQL 映射文件路径(斜杠式)

② 注解实现:

  • mapper 包下定义接口
  • 接口文件中添加注解映射
  • 在主配置文件(mybatis-config.xml)中加载接口路径(点式)

特点:
MyBatis 默认情况下提供自动映射,即SQL返回的列名能和POJO对应起来即可。注解方式不适用于对数据库进行复杂的操作。生命周期应该小于等于SqlSession的生命周期,mapper 代表一个请求中的业务处理,完成了相关的业务,就废弃它。

五、MyBatis框架访问数据库(实例)

MyBatis框架访问数据库
在这里插入图片描述
1. 准备MyBatis环境,下载:mybatis-3.5.2log4j-1.2.17.jar
2. 搭建MyBatis框架结构

  • 创建包结构
  • 在WEB-INF下创建lib文件夹,导入MyBatis的jar包;导入连接数据库的jar包,导入日志文件log4j的jar包。
  • 在src根目录下创建MyBatis的主配置文件 mybatis-config.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="jdbc.properties" />
    <typeAliases>
        <typeAlias alias="role" type="com.mybatis_04.pojo.Role"/>
    </typeAliases>
    <environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>
</environments>
    <mappers>
        <mapper resource="com/mybatis_04/mapper/RoleMapper.xml"/>
    </mappers>
</configuration>
  • 在src根目录下导入log4j的属性配置文件log4j.properties
log4j.rootLogger=DEBUG,stdout
log4j.logger.org.mybatis.example.BlogMapper=TRACE
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %c: %m%n

  • 在src根目录下导入JDBC的配置文件jdbc.properties(可选)
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/db_mybatis_test?useUnicode=true&characterEncoding=utf-8&useSSL=false
jdbc.username = root
jdbc.password = root

  • 在mapper包结构,创建SQl映射文件Xxx+包名.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="">
    <select id="" parameterType="" resultType="">
    ...
    </select>
</mapper>
  • 在mapper包结构,创建接口文件 RoleMapper.java
package com.mybatis_04.mapper;

import com.mybatis_04.pojo.Role;
import java.util.List;

/**
 * @author Nigori
 * @date 2020/5/8
 **/
public interface RoleMapper {
    public int insertRole(Role role);
    public int deleteRole(int id);
    public int updateRole(Role role);
    public List<Role> findRole(String roleName);
    public Role getRole(int id);
}

  • 搭建测试程序

Demo 结构如图:
在这里插入图片描述
用MyBatis实现对数据库的增、删、改、查
POJO(domain)文件 Role.java

package com.mybatis_04.pojo;

/**
 * @author Nigori
 * @date 2020/5/8
 **/
public class Role {
    private int id;
    private String name;
    private String roleName;

    /*getter and setter*/

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

SQl映射文件 RoleMapper.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:命名空间
        不同的mapper映射文件使用不同的namespace来做区分(命名不可重复)
        使用命名空间.sqlId的形式来找到我们所需要执行的sql语句

        parameterType:sql语句传递的参数类型
-->
<mapper namespace="com.mybatis_04.mapper.RoleMapper">
    <!--
        注意:所有标签必须写id属性
              <select>标签parameterType属性可以省略,resultType属性必须写

              对于<insert>,<update>,<delete>标签通常只写id属性。
    -->
    <insert id="insertRole" parameterType="role">
        insert into tb_role(id,name,role) values(#{id},#{name},#{roleName});
    </insert>

    <delete id="deleteRole" parameterType="int">
        delete from tb_role where id = #{id};
    </delete>

    <update id="updateRole" parameterType="role">
        update tb_role set name = #{name},role = #{roleName} where id = #{id};
    </update>

    <select id="getRole" parameterType="int" resultType="role">
        select id,name,role as roleName from tb_role where id = #{id};
    </select>

    <select id="findRole" parameterType="String" resultType="role">
        select id,name,role as roleName from tb_role where role like concat('%',#{roleName});
    </select>
</mapper>

测试类 MybatisMainTest.java

package com.mybatis_04.main;

import com.mybatis_04.mapper.RoleMapper;
import com.mybatis_04.pojo.Role;
import com.mybatis_04.utils.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import java.util.List;

/**
 * @author Nigori
 * @date 2020/5/8
 **/
public class MybatisMainTest {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger(MybatisMainTest.class);
        SqlSession sqlSession = null;

        try {
            //调用工具类,实例化SqlSession对象
            sqlSession = SqlSessionFactoryUtils.openSqlSession();
            //Mapper接口发送SQL
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);


            //查询单条记录
            /*Role role = roleMapper.getRole(101);
            logger.info(role.getRoleName());*/

            //删除记录
            /*roleMapper.deleteRole(103);*/

            //查询所有记录
            List<Role> roleList = roleMapper.findRole("民");
            for (Role role:roleList) {
                System.out.println(role);
            }

            //更新记录
            /*Role role = new Role();
            role.setId(100);
            role.setName("小月");
            role.setRoleName("工人");
            roleMapper.updateRole(role);*/

            //插入记录
            /*Role role = new Role();
            role.setId(103);
            role.setName("小新");
            role.setRoleName("商人");
            roleMapper.insertRole(role);*/
        } catch (Exception e) {
            sqlSession.rollback();
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.commit();
                sqlSession.close();
            }
        }
    }
}

工具类 SqlSessionFactoryUtils.java

package com.mybatis_04.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;

/**
 * @author Nigori
 * @date 2020/5/8
 **/
public class SqlSessionFactoryUtils {

    private final static Class<SqlSessionFactoryUtils> LOCK = SqlSessionFactoryUtils.class;
    private static SqlSessionFactory sqlSessionFactory = null;

    //不能通过new方式创建SqlSessionFactoryUtils
    private SqlSessionFactoryUtils() { }

    //创建SqlSessionFactory对象
    public static SqlSessionFactory getSqlSessionFactory() {

        //防止多线程中多次实例化SqlSessionFactory对象,保证唯一性
        synchronized (LOCK) {
            if (sqlSessionFactory != null) {
                return sqlSessionFactory;
            }
            String resource = "mybatis-config.xml";
            InputStream inputStream = null;
            try {
                inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
        return sqlSessionFactory;
    }

    //创建SqlSession对象
    public static SqlSession openSqlSession() {
        if (sqlSessionFactory == null) {
            getSqlSessionFactory();
        }
        return sqlSessionFactory.openSession();
    }
}

 
总结      Demo地址:https://github.com/Convallaria-gjh/MyBatisTest
SqlSession对象的创建步骤:
1. 引入主配置文件

String resource = "mybatis-config.xml";

2. 通过加载主配置文件,创建输入流

InputStream inputStream = Resources.getResourceAsStream(resource);

3. 通过建造者对象调用建造方法,创建SqlSessionFactory对象

SqlSessionFactory sqlSessionFactory =  new SqlSessionFactoryBuilder().build(inputStream);

4. 用SqlSessionFactory对象创建SqlSession对象

SqlSession session = sqlSessionFactory.openSession();

5. 用SqlSession对象操作数据库
 
 
Ps :MyBatis 之 面向接口编程的各参数的具体详解
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值