MyBatis - 介绍、简单入门程序

时间:2023-03-09 17:51:55
MyBatis - 介绍、简单入门程序

JDBC编程中的问题

    1. 将SQL语句硬编码到Java代码,不利于系统维护。
        设想如何解决:将SQL单独抽取出来,在配置文件(xml方式、properties文件)进行配置。
    2. 数据库连接不能重复利用,对数据库资源是一中浪费。
        设想如何解决:使用数据库连接池管理数据库连接。
    3. 向Statement设置参数时,对于参数的位置通过硬编码指定,不利于系统维护。
        设想如何解决:是否能够自动将Java对象的值设置到Statement。
    4. 遍历结果集,resultSet.getString硬编码指定列名称。
        设想如何解决:能否自动将SQL查询结果集转成Java对象。

MyBatis介绍

        MyBatis 本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到google code,并且改名为MyBatis。
        MyBatis 是一个优秀的持久层框架,它对JDBC的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等JDBC繁杂的过程代码。
        MyBatis 通过xml或主键的方式将要执行的statement配置起来,并通过Java对象和statement中的SQL进行映射生成最终执行的SQL语句,最后由MyBatis框架执行SQL并将结果映射成Java对象并返回。
        MyBatis是一个不完全的ORM框架,MyBatis也可以进行对象关系映射,但是还是需要手动写SQL语句。Hibernate对JDBC的封装比较深,是一个完全的优秀的ORM框架,完全实现了Java对象到关系的映射,SQL不需要手动编写。

Mybatis框架

    Mybatis配置
    MyBatis - 介绍、简单入门程序

    1. SqlMapConfig.xml是MyBatis的核心配置文件,配置了数据源(连接池)、事务mapper.xml是MyBatis的映射文件。
    2. SqlSessionFactory 会话工厂,用户生产会话SqlSession。
    3. SqlSession 会话,是一个面向用户的门面接口,用于操作数据库(CRUD)
    4. Executor执行器,SqlSession内部通过Executor操作数据库,Executor需要使用Mapped Statement中封装的数据信息来操作数据库。
    5. Mapped Statement是MyBatis一个底层封装对象,封装了SQL语句、传入SQL语句的参数,将SQL查询结果映射成Java对象。

Mybatis入门程序

    1. 添加jar包 下载地址:链接:http://pan.baidu.com/s/1mgtFYxa 密码:vq10 (包括源码)
        核心jar包是:mybatis-3.2.8.jar
        依赖jar包在lib目录下
        还需要自己添加数据库的jar包
        创建一个Java Project (下图是最终项目图)
        MyBatis - 介绍、简单入门程序MyBatis - 介绍、简单入门程序
    2. log4j.properties日志文件(主要用户控制台打印log)
        添加Source Folder :config,并且创建log4j.properties
        直接使用官网配置,只是改成DEBUG模式    
1
2
3
4
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

    3. 创建SqlMapConfig.xml配置文件
        在config文件夹下创建SqlMapConfig.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
<configuration>
    <!-- 和spring整合后environments配置将废除 -->
    <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/mybatis?characterEncoding=utf8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
</configuration>

    4. 创建po类,User 在package com.hqu.model下 ,并创建数据库和对应表插入测试数据
        目标:将sql查询结果映射成Java对象,po类的属性和user表字段对应
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.hqu.model;
import java.sql.Date;
public class User {
    private int id;
    private String username;
    private String sex;
    private Date birthday;
    private String address;
    private String detail;
    private float score;
    // getter and setter .. 
}
MyBatis - 介绍、简单入门程序MyBatis - 介绍、简单入门程序

    5. 编写User.xml(mapper.xml文件 ) 在config创建文件夹sqlmap并创建User.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<mapper namespace="test">
    <!-- 查询用户信息
    select :将select标签内容称为statement
    id:是在user.xml的唯一标识,statement的id
    parmeterType:指向sql(向statement中)中传入参数的类型
    #{}:表示一个点位符,{}中的id表示传入变量名,当传入单个值{}中的变量可以随意
    resultType:将sql查询结果集映射成java对象的类型 -->
    <select id="findUserByName" parameterType="string" resultType="com.hqu.model.User">
        select * from User where username = #{id}
    </select>
    <insert id="insertUser" parameterType="com.hqu.model.User">
        insert into
        user(username,birthday,sex,address,detail,score)
        values (#{username},#{birthday},#{sex},#{address},#{detail},#{score})
    </insert>
</mapper>

6.将User.xml在SqlMapConfig.xml配置

1
2
3
4
5
6
7
<configuration>
    ...
    <!-- 加载映射文件 -->
    <mappers>
        <mapper resource="sqlmap/User.xml" />
    </mappers>
</configuration>
7. Mybatis查询程序
    新建类测试测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class MybatisTest {
    SqlSession sqlSession = null;
    @Before
    public void before() throws IOException {
     
        String resource = "SqlMapConfig.xml"// mybatis的配置文件
        InputStream is = Resources.getResourceAsStream(resource);
        // 创建会话工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        sqlSession = sqlSessionFactory.openSession(); // 从会话工厂中的到会话
    }
    @After
    public void after() {
        sqlSession.close(); // 释放资源
    }
    @Test
    public void testSelect() {
        // 通过sqlSession操作数据库
        // 第一个参数:user.xml定义的statement的id
        // 第二个参数:输入参数
        User user = sqlSession.selectOne("test.findUserByName""jerome");
        System.out.println(user);
    }
     
    @Test
    public void testInsert() {
        User user = new User();
        user.setUsername("jelly");
        user.setSex("女");
        user.setAddress("深圳");
        user.setScore(12f);
        sqlSession.insert("test.insertUser", user);
         
        sqlSession.commit(); // 提交事务
    }
}
结束。
codeMyBatis - 介绍、简单入门程序链接:http://pan.baidu.com/s/1sjlzpAP 密码:exmy

Mybatis是如何解决JDBC的问题

    1. 将SQL语句硬编码到Java代码,不利于系统维护。
        设想如何解决:将SQL单独抽取出来,在配置文件(xml方式、properties文件)进行配置。
        在mybatis的映射文件(如:User.xml)配置sql语句。
    2. 数据库连接不能重复利用,对数据库资源是一中浪费。
        设想如何解决:使用数据库连接池管理数据库连接。
        在SqlMapConfig.xml下的environments节点配置了连接池
    3. 向Statement设置参数时,对于参数的位置通过硬编码指定,不利于系统维护。(如preparedStatement.setString(1,"jerome"))
        设想如何解决:是否能够自动将Java对象的值设置到Statement。
         在User.xml中通过paramenterType,输入参数的类型,在sql语句通过#{}表示占位符号,{}写的是po的属性名,完成自动将java对象映射到sql语句中。
    4. 遍历结果集,resultSet.getString硬编码指定列名称。(如:resultSet.getString("id"))
        设想如何解决:能否自动将SQL查询结果集转成Java对象
        User user = sqlSession.selectOne("test.findUserByName", "jerome");

参考传智播客公开课:链接:http://pan.baidu.com/s/1bnbH2qj 密码:9f30
后期详细深入视频  链接:http://pan.baidu.com/s/1qWFTzQ0 密码:jqqx (资料暂时就这些了)
参考文档:
1. http://mybatis.org/mybatis-3/zh/index.html (MyBatis官方文档)
对应的pdf(英文):链接:http://pan.baidu.com/s/1pJrL42v 密码:2yq0
对应的pdf(中文):链接:http://pan.baidu.com/s/1pJqzBDp 密码:dwhf