首页 > 其他 > 详细

Mybatis入门(一)

时间:2020-03-28 00:45:20      阅读:66      评论:0      收藏:0      [点我收藏+]

Mybatis 简介

摘自文档: MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
读完这段话,感觉有些不太好理解,但从中我们可以明白Mybatis是一款持久层框架(对数据进行增删改查的框架),是对JDBC代码的封装,那么原生JDBC代码有什么不足呢?通过一个JDBC例子来说明一下

原生JDBC代码缺陷

  1. 创建tb_user表
create table tb_user(
    id int(11) primary key auto_increment comment ‘id‘,
    name varchar(20) comment ‘名字‘
) comment ‘用户表‘
  1. User实体
import lombok.Data;

@Data
public class User {
    /**
     * id
     */
    private int id;
    /**
     * 名字
     */
    private String name;
}
  1. UesrDao 对数据进行增删改查(偷了个懒,只写了查询和删除)
import com.test.jdbc.entity.User;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class UserDao {
    /**
     * 数据库连接地址
     */
    public static String URL = "jdbc:mysql://localhost:3306/user";
    /**
     * 用户名
     */
    public static String USER = "root";
    /**
     * 密码
     */
    public static String PASSWORD = "Test@2019";

    /**
     * 注册驱动
     */
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取所有用户
     * @return
     */
    public List<User> getAll() {
        List<User> userList = new ArrayList<>();

        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            // 1. 获取连接
            conn = DriverManager.getConnection(URL, USER, PASSWORD);

            // 2. 创建语句
            st = conn.createStatement();

            // 3. 执行语句
            rs = st.executeQuery("select * from tb_user");

            // 处理结果集
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");

                User user = new User();
                user.setId(id);
                user.setName(name);

                userList.add(user);
            }

            return userList;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            try {
                if (st != null) {
                    st.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if (rs != null) {
                    rs.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return userList;
    }

    /**
     * 根据ID删除用户
     * @param id
     * @return
     */
    public int deleteById(int id) {
        Connection conn = null;
        PreparedStatement pst = null;

        try {
            // 1. 获取连接
            conn = DriverManager.getConnection(URL, USER, PASSWORD);

            // 2. 创建语句
            pst = conn.prepareStatement("delete from tb_user where id=?");
            pst.setInt(1, id);// 索引从1开始,如果有多个参数需要设置, 这儿很容易出错,一不小心索引可能就乱了,不太灵活??
            // 3. 执行语句
            return pst.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            try {
                if (pst != null) {
                    pst.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return 0;
    }
}

通过以上JDBC代码我们发现,jdbc存在以下不足:

  1. 比如获取Connection,创建Statement, 处理ResultSet,释放资源等,其实这些固定代码格式和我们业务逻辑没有必然的关系,但我们却不能省略
  2. 取出来数据后,会调用对象对应的set方法给属性赋值,也很繁琐
  3. 为了防止SQL而使用的PrepareStatement,给参数设置值使用的索引,参数比较多的话,很容易出错
  4. 频繁创建释放连接,性能较差,可通过连接池解决
  5. sql语句写在java代码里,sql语句变动需要重新编译项目
  6. 等等等

接下来我们再回头看看Mybatis的简介

  1. MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作,这句看着Mybatis可以帮我们解决以上1,2,3的问题
  2. MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录,这句大致是sql语句查询出来的结果集,我们可以通过xml配置或者注解来映射为java语言里对应的数据类型(依然不太懂)。
    那就上例子了解一下吧!!

Mybatis简单例子

注意 基于Maven构建

  1. 引入Mybatis Jar包
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.2</version>
</dependency>
<!--Mysql驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.46</version>
</dependency>
<!---lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.20</version>
    <scope>provided</scope>
</dependency>
  1. 配置文件 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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/user"/>
                <property name="username" value="root"/>
                <property name="password" value="Test@2019"/>
            </dataSource>
        </environment>
    </environments>
    <!--指定Mapper文件位置-->
    <mappers>
        <mapper resource="com/mybatis/mapper/UserMapper.xml"/>
    </mappers>
</configuration>
  1. 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.mybatis.mapper">
    <!--获取所有用户-->
    <select id="getAll" resultType="com.mybatis.entity.User">
      select * from tb_user
    </select>

    <!--根据ID删除用户-->
    <delete id="deleteById" parameterMap="int">
        delete from tb_user where id=#{id}
    </delete>
</mapper>

Mybatis入门(一)

原文:https://www.cnblogs.com/rookie-test/p/12563250.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!