Mybatis入门程序,根据id查询用户

1. 创建数据库(在源代码中给出)

sql_table.sql:记录表结构
sql_data.sql:记录测试数据,在实际企业开发中,最后提供一个初始化数据脚本

数据库

JDBC传统程序问题总结

1、数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响 数据库性能。
设想:使用数据库连接池管理数据库连接。

2、将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。
设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。


3、向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
设想:将sql语句及占位符号和参数全部配置在xml中。

4、从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,,不利于系统维护。
设想:将查询的结果集,自动映射成java对象。

2. Mybatis框架

mybatis是一个持久层的框架,是apache下的顶级项目。
mybatis托管到goolecode下,再后来托管到github下。

mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。

mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)

原理

3. 工程结构

jar包和配置文件

4. SqlMapConfig.xml

配置mybatis的运行环境,数据源、事务等。

<?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>


    <!-- 1. 和spring整合后 environments配置将废除-->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理,事务控制由mybatis-->
            <transactionManager type="JDBC"/>
            <!-- 数据库连接池,由mybatis管理-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 2. 加载映射文件 -->
    <mappers>
        <mapper resource="sqlMap/user.xml"/>
    </mappers>

</configuration>

5. 创建pojo类

package com.eurasia.pojo;

import java.util.Date;

/**
 * Created by yvettee on 2017/11/22.
 */
public class User {

    //属性名和数据库表的字段对应
    private int id;
    private String username;// 用户姓名
    private String sex;// 性别
    private Date birthday;// 生日
    private String address;// 地址

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", sex=" + sex
                + ", birthday=" + birthday + ", address=" + address + "]";
    }
}

6. 映射文件

记得要在SqlMapConfig.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">
<!-- namespace命名空间,作用就是对sql进行分类化管理
注意:使用mapper代理方法开发,namespace有特殊重要作用
-->
<mapper namespace="test">
    <!--在映射文件中配置很多sql语句-->
    <!--需求:通过id查询用户表的记录-->
    <!--通过select执行数据库查询
    id:标识映射文件中的sql,将sql语句封装到mappedstatement,
    所以将id称为statement的id
    #{}表示一个占位符,parameterType指定输入参数的类型
    #{id}:其中id表示接收输入的参数,名称叫id,如果输入参数是简单类型,#{}中参数名可以任意
    resultType:指定sql输出结果所映射的java对象类型
    -->

    <select id="findUserById" parameterType="int" resultType="com.eurasia.pojo.User">
      SELECT * FROM USER WHERE id = #{id};
    </select>
</mapper>

7. 程序编写

package com.eurasia.test;

import com.eurasia.pojo.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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

/**
 * Created by yvettee on 2017/11/23.
 */
public class MybatisFirst {
    //根据id查询用户信息,得到一条记录
    @Test
    public void findUserByIdTest() throws IOException {

        //Mybatis配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);


        //创建会话工厂,传入Mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过SqlSession操作数据库
        //第一个参数:映射文件中statement的id,等于namespace+statement的id
        //指定和映射文件中匹配的parameterType类型的参数
        User user = sqlSession.selectOne("test.findUserById", 1);
        System.out.println(user);

        //释放资源
        sqlSession.close();
    }
}

源代码:https://github.com/yvettee36/MybatisOrdinary