博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

MyBatis - 01简介入门

Posted on 2020-11-23 20:29  Kingdomer  阅读(116)  评论(0编辑  收藏  举报

MyBatis - 01简介入门

(1)原始jdbc 操作

(1.1)查询操作

    @Test
    public void testSelect() throws SQLException, ClassNotFoundException {
        // 注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 获得连接
        Connection connection = DriverManager.getConnection("jdbc:mysql:///dev", "root", "Mysql2020");
        // 获得statement
        PreparedStatement statement = connection.prepareStatement("select id, username, password from user");
        // 执行查询
        ResultSet resultSet = statement.executeQuery();
        // 遍历结果集
        while(resultSet.next()){
            // 封装实体
            User user = new User();
            user.setId(resultSet.getInt("id"));
            user.setUsername(resultSet.getString("username"));
            user.setPassword(resultSet.getString("password"));
            System.out.println(user);
        }
        // 释放资源
        resultSet.close();
        statement.close();
        connection.close();
    }

(1.2)插入操作

    @Test
    public void testInsert() throws SQLException, ClassNotFoundException {
        User user = new User();
        user.setUsername("jerry");
        user.setPassword("2020");

        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql:///dev", "root", "Mysql2020");
        PreparedStatement statement = connection.prepareStatement("insert into user(username,password)values (?,?)");
        // 设置占位符参数
        statement.setString(1, user.getUsername());
        statement.setString(2, user.getPassword());
        statement.executeUpdate();

        statement.close();
        connection.close();
    }

(1.3)原始jdbc开发存在的问题

① 数据库连接创建、释放频繁造成系统资源浪费,从而影响系统性能。

② sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能性较大,sql变动需要改变java代码。

③ 查询操作时,需要手动将结果集中的数据手动封装到实体中。插入操作时,需手动将实体的数据设置到sql语句的占位符位置。

(1.4)上述问题的解决方案

① 使用数据库连接池初始化连接资源

② 将sql语句抽取到xml配置文件中

③ 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射

 

(2)MyBatis简介

> mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,

  而不需要花费精力去处理 加载驱动、创建连接、创建statement等繁杂的过程。

> mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句。

> mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,

  屏蔽了jdbc api底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作。

 

(3)MyBatis开发入门

(3.1)引入mybatis坐标

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.43</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

(3.2)创建数据库表

CREATE TABLE `user` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(20) NULL DEFAULT NULL,
    `password` VARCHAR(20) NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1
;

(3.3)创建实体类

public class User {

    private int id;
    private String username;
    private String password;
    // 省略其他代码
}

(3.4)创建Mapper.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="userMapper">

    <select id="findAll" resultType="com.bearpx.spring.mybatis.domain.User">
        select * from user
    </select>

</mapper>

 

(3.5)编写核心文件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>

    <!--数据源环境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/dev"/>
                <property name="username" value="root"/>
                <property name="password" value="Mysql2020"/>
            </dataSource>
        </environment>
    </environments>

    <!--加载映射文件-->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"></mapper>
    </mappers>
</configuration>

(3.6)测试

    @Test
    public void test1() throws IOException {
        // 获得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        // 获得session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        // 获得session 会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 执行操作   参数: namespace + id
        List<User> userList = sqlSession.selectList("userMapper.findAll");
        // 打印结果
        System.out.println(userList);
        // 释放资源
        sqlSession.close();

    }

 

[User{id=1, username='zhangsan', password='123'}, User{id=2, username='lisi', password='456'}]