• Mybatis入门(一)


    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>
    
    1. UserDao
    import com.mybatis.entity.User;
    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.InputStream;
    import java.util.List;
    
    public class UserDao {
        /**
         * 获取所有用户
         * @return
         */
        public List<User> getAll() {
            try {
                // 通过配置文件 生成SqlSessionFactory
                String resource = "mybatis-config.xml";
                InputStream inputStream = Resources.getResourceAsStream(resource);
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
                // 获取sqlSession
                SqlSession sqlSession = sqlSessionFactory.openSession();
    
                List<User> userList = sqlSession.selectList("com.mybatis.mapper.UserMapper.getAll");
    
                // 关闭资源
                sqlSession.close();
    
                return userList;
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return null;
        }
    
        /**
         * 根据ID删除
         * @param id
         * @return
         */
        public int deleteById(int id) {
            try {
                // 通过配置文件 生成SqlSessionFactory
                String resource = "mybatis-config.xml";
                InputStream inputStream = Resources.getResourceAsStream(resource);
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
                // 获取sqlSession
                SqlSession sqlSession = sqlSessionFactory.openSession();
    
                int num = sqlSession.delete("com.mybatis.mapper.UserMapper.deleteById", 1);
    
                // 提交
                sqlSession.commit();
                // 关闭资源
                sqlSession.close();
    
                return num;
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return 0;
        }
    }
    
    1. 测试
    import com.mybatis.entity.User;
    import org.junit.Assert;
    import org.junit.Test;
    
    import java.util.List;
    
    public class UserDaoTest {
        /**
         * 获取所有用户
         */
        @Test
        public void testGetAll() {
            List<User> userList = new UserDao().getAll();
    
            System.out.println(((List) userList).size());
        }
    
        /**
         * 根据ID删除用户
         */
        @Test
        public void testDeleteById() {
            int num = new UserDao().deleteById(1);
            Assert.assertEquals(1, num);
        }
    }
    
    1. 项目目录结构:

    以上就是Mbatis的简单用法,总结一下大致分为以下几个步骤:

    1. 引入Mybatis依赖
    2. Mybatis配置文件
    3. 加载配置文件,通过SqlSessionFactoryBuilder生成通过SqlSessionFactory,然后获取SqlSession对象
    4. 通过SqlSession对象执行对应的语句,eg: sqlSession.selectList("com.mybatis.mapper.UserMapper.getAll"); 注意:com.mybatis.mapper.UserMapper.getAll 是有 UserMapper.xml 文件里的命名空间+对应的ID组成的

    细心的你一定发现,我们没使用任何JDBC代码就完成了对数据的增删改查操作,对数据库进行操作返回的结果集也自动给我们赋值了,比如上面List<User> userList=sqlSession.selectList。但上面Mybatis的写法依然有些不足,比如sqlSession.selectList("com.mybatis.mapper.UserMapper.getAll") 中的selectList的参数,也很容易拼错,即使拼写错误,编译器也不会给我们任何提示(毕竟符合java语法)。如何解决这个问题,请看下篇文章分解。

    完整例子代码 下载地址

  • 相关阅读:
    java基础之 javac编译单个文件并执行 带jar包
    java 按照字符数分解字符串
    转载 模糊查询map中的key
    public final static PrintStream out = null; 的实例化猜想
    从0开始搭个网站在云上 思路引导
    java 泛型操作
    git 命令行
    React Native 安卓添加阴影
    react native 按钮的那些事
    mac 下 react Native android环境搭建
  • 原文地址:https://www.cnblogs.com/rookie-test/p/12563250.html
Copyright © 2020-2023  润新知