Mybatis学习一

1、MyBatis介绍

MyBatis 本是apache的一个开源项目iBatis,它是一个基于java的持久层框架。
MyBatis支持普通SQL查询,存储过程和高级映射的持久层框架,使用比较简单,使用XML或者注解配置和原始映射,将接口和java的POJO(Plain Old Java Objects)映射成数据库中的记录。

2、MyBatis的环境搭建

java环境
eclipse
mysql
mybatis运行环境(jar包)

这里写图片描述

3、框架流程

这里写图片描述

1、SqlMapConfig.xml

SqlMapConfig.xml是mybatis的全局配置文件,配置数据库,数据源,事务mybatis运行环境。

2、SqlSessionFactory

根据配置文件SqlMapConfig.xml创建工厂

3、SqlSesssion

通过工厂来创建SqlSession会话,在这里操作数据库,完成SQL的增,删,改,查

4、Executor

执行SqlSession语句,操作数据库执行。

5、mapped statement

对操作数据库存储封装(sql语句,输入参数,输出结果等)

4、入门示例

1、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>
<properties resource="db.properties">
        <!--properties中还可以配置一些属性名和属性值 -->
        <!-- <property name="jdbc.driver" value=""/> -->
    </properties>
    <environments default="development">
        <environment id="development">
        <!-- 使用jdbc事务管理,事务控制由mybatis-->
            <transactionManager type="JDBC" />
        <!-- 数据库连接池,由mybatis管理-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>

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

    </mappers>

</configuration>

数据库文件配置

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/student
jdbc.username=root
jdbc.password=123456

2、POJO类

简单的JavaBean类

package com.example.po;
public class User {

    private String name;
    private int age;
    private String cls;
    private int id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getCls() {
        return cls;
    }

    public void setCls(String cls) {
        this.cls = cls;
    }

    public int getId() {
        return id;
    }

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

    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + ", cls=" + cls + ", id="
                + id + "]";
    }

}

3、映射文件User.xml文件

在映射文件中写SQL语句
参数
id:标识映射文件的sql标识
parameterType:参数类型
resultType:返回值类型

<?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命名空间-->
<mapper namespace="test">
    <select id="findUserById" parameterType="int" resultType="com.example.po.User">
        SELECT * FROM USER WHERE id=#{value}
    </select>
</mapper>

4、在SqlMapConfig.xml中加载映射文件

<mappers>
        <mapper resource="sqlmap/User.xml"/>

    </mappers>

5、单元测试

package mybatis.jdbc;

import java.io.IOException;
import java.io.InputStream;
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 com.example.po.User;

public class JdbcTest {

    @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类型的参数
        // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象
        // selectOne查询出一条记录
        User user = sqlSession.selectOne("test.findUserById", 1);

        System.out.println(user);

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

    }
}

5、细节

1、参数

parameterType:输入的参数类型
resultType指定输出结果的类型

2、#{}和¥{}

#{}是一个点位符,接收的参数可以是简单类型,pojo,hashmap,
${}表示一个拼接的符号,会引起sql注入,因此不建议使用。

3、selectOne和selectList

selectOne查询一条记录进行映射。如果使用selectOne实现,也可以使用selectList实现(list中只有一条记录)

selectList表示查询列表进映射。如果有多条的话,使用selectOne则会报错。

6、传统Dao开发遇到的问题

1、dao接口实现类方法中存在大量的重复代码
2、存在很多 硬编码,不等于维护和修改
3、调用sqlsession方法时传入的变量,使用泛型,如果出错,编译时候也不会报,不利于开发。
解决办法mapper代理方法

7、mapper代理方法

1、定义接口

package com.example.mapper;

import com.example.po.User;

public interface UserMapper {
    public User findUserById(int id) throws Exception;

}

2、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.example.mapper.UserMapper">

    <select id="findUserById" parameterType="int" resultType="com.example.po.User">
        SELECT
        * FROM USER WHERE id=#{value}
    </select>


</mapper>

3、SqlMapConfig.xml文件中配置

<!-- 加载 映射文件 -->
    <mappers>
        <mapper resource="sqlmap/User.xml" />
        <package name="com.example.mapper"/>
    </mappers>

4、测试用例

public class UserMapperTest {
    private SqlSessionFactory sqlSessionFactory;

    // 此方法是在执行testFindUserById之前执行
    @Before
    public void setUp() throws Exception {
        // 创建sqlSessionFactory

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

        // 创建会话工厂,传入mybatis的配置文件信息
        sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(inputStream);
    }

    //用户信息的综合 查询


    @Test
    public void testFindUserById() throws Exception {

        SqlSession sqlSession = sqlSessionFactory.openSession();

        //创建UserMapper对象,mybatis自动生成mapper代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        //调用userMapper的方法

        User user = userMapper.findUserById(1);

        System.out.println(user);


    }

}

8、Sql片段

为什么使用sql片段
1、在进行Sql查询的时候,可能都要进行一些统一的操作。比如判断用户是否输入内容,如果没有内容,则不进行后续sql查询
2、一些比较常用的sql语句抽取出来,组成sql片段。
示例如下:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值