MyBatis

目录

一.介绍

1.MyBatis的特性

二.初识MyBatis的增删改查

1.预备步骤

 2.最简单的增删改查操作

1)插入数据 

2)更新数据

3)删除数据

4)查询数据

3.功能优化

1.自动提交

2.日志功能

三.简化MyBatis的操作

1.利用properties文件配置数据库信息

2.typeAliases   类型别名 

3.简化引入映射文件

4.设置核心配置文件的模板和工具类

四.实现动态的增删改查

1.在配置文件中获取参数的两种方式

2.根据传递参数的类型个数不同而获取参数的方式不同

1)4中情况 

2)将4中情况转化为两种情况

3.动态查询

1)普通动态查询 

2)特殊SQL处理

五.处理复杂关系

1.处理属性名和字段名不同的情况

2.处理多对一关系查询

3.处理一对多关系查询

4.延迟加载

六.动态SQL

七.缓存

1.一级缓存

2.二级缓存

八.逆向工程

九.其他功能

1.获取自增的主键  



一.介绍

MyBatis是一个基于Java的持久层框架,提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。

持久层:存储在硬盘中,不会断电消失的数据。

SQL Maps:指的是数据库中的数据和Java数据的映射关系。也就是MyBatis封装JDBC的过程。

框架本质就是 jar包+配置文件。

1.MyBatis的特性

1.支持定制化SQL,存储过程以及高级映射的持久层框架

定制化SQL:SQL语句需要自己去写。

存储过程:是MySQL高级学习的内容

普通映射:利用JDBC访问数据库的过程中,自己封装了JDBC工具类,每当把数据从数据库中查询出来后,都会根据反射将它对应Java中的实体类对象,要求是字段名必须跟类的属性名保持一致,否则是映射不了的。

高级映射:实体类中的属性,通过SQL是查询不到的,比如一对多的关系,多对一的关系,这是表和表之间的关系,那么对应的Java中的实体类之间也需要有关系。用SQL查询出来的数据无法对应某个实体或实体的集合。

2.避免手动设置参数和获取结果集

3.可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。

 sql语句可以写到xml文件中,或写在注解中。

4.是一个半自动的ORM(Object Relation Mapping)框架

JDBC就是手动,所有的过程都要自己去写。

半自动就是封装了部分的功能,像sql还是需要自己写,也可以自己处理映射关系

ORM:对象关系映射,对象指的是Java实体对象,关系指的是关系型数据库,其实就是将Java中的实体类对象和关系型数据库中的数据创建映射关系。

二.初识MyBatis的增删改查

目录结构

1.预备步骤

Step1:创建maven工程

Step2:在pom.xml中添加mybatis相关的依赖

<dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>
    </dependencies>

Step3:在resources下面创建mybatis-config.xml文件(核心配置文件

核心配置文件详解-配置关于mybatis的相关信息。

在ssm整合后,可以没有这个配置文件,核心配置文件中所配置的内容可以交给spring管理。

<?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="jdbc.properties"/>

<!--设置类型别名-->
    <typeAliases>
<!--
用一个别名User,来代替全类名pojo.User,这个别名不区分大小写
如果不写alias属性,那么就会分配一个默认的别名,这个默认的别名就是类名且不区分大小写
所以写了个User和不写效果一样
-->
<!--        <typeAlias type="pojo.User" alias="User"></typeAlias>-->
<!--        以包为单位,给包下所有的类设置默认别名,这里给pojo下面所有的包都设置了默认别名且不区分大小写,这个比较常用-->
        <package name="pojo"/>
    </typeAliases>
<!--
配置链接数据库的环境
不管有多少个环境,也只能选择其中一个使用,default表示默认使用哪个环境
-->
    <environments default="development">
<!--
配置某个具体的环境每一个environment标签都是一个连接具体数据库的环境
id:表示连接数据库环境的一个唯一标识,不能重复
-->
        <environment id="development">
<!--
设置事务管理器的类型,JDBC类型需要手动提交事务
JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式,原生指的是 提交就是commit,回滚就是rollback,事务的提交和回滚需要手动处理
MANAGED:被管理,例如被Spring事务
-->
            <transactionManager type="JDBC"/>
<!--
dataSource:配置数据源
    type:POOLED  设置数据源的类型,表示使用数据库连接池来缓存数据库连接
    type:UNPOOLED   表示不使用数据库连接池来缓存数据库连接
    type:JNDI   表示上下文中的数据源
ssm整合之后就不需要设置数据源了, spring提供数据源
-->
            <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>
<!--        resources下面的不叫包(和包的图像不同),是具体的资源,包是装Java类的,所以这里要以路径的方式引入-->
<!--        <mapper resource="mappers/UserMapper.xml"/>-->
<!--        以包为单位引入映射文件时需要满足两点
            1.mapper接口所在的包要和映射文件所在的包一致,即包名要一样
            2.mapper接口要和映射文件的名字一致
            -->
        <package name="mapper"/>
    </mappers>
</configuration>

Step4:创建数据库mybatis和表t_user

Step5:创建pojo类对应t_user表

属性要和字段名相同,如果字段名有_,那么属性名就用驼峰命名法,查询字段时时用别名查询。

public class User {
    //保证属性名和字段名一致
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private String sex;
    private String email;

    public User() {
    }

    public User(Integer id, String username, String password, Integer age, String sex, String email) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.age = age;
        this.sex = sex;
        this.email = email;
    }

    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

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

    public String getSex() {
        return sex;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

Step6:创建mapper接口

现在在数据库中有了表,在Java中有了对应的对象。在Java中定义方法去操作表中的数据,就需要mapper来实现。

mapper就是JDBC中的DAO,一个mapper对应一个表。

//当调用接口中的方法,它会自动去匹配一个方法并且执行
public interface UserMapper {

    /*
    MyBatis面向接口编程的两个一致
    1.mapper接口的映射文件的namespace要和mapper接口的全类名保持一致
    2.映射文件中sql语句的id要和mapper接口中的方法名一致

    表-实体类-mapper接口-mapper映射文件 一一对应
     */
}

Step7:创建mapper的配置文件UserMapper.xml

就像是mapper接口的实现类,来写具体方法内的sql语句。

<?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="mapper.UserMapper">

</mapper>

Step8:在测试类中通过一系列步骤拿到mapper对象来执行mapper里面的方法

public class MyBatisTest {
    @Test
    public void testMyBatis() throws IOException {
        //加载核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        //获取sqlSessionFactoryBuilder
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //获取sqlSessionFactory对象
        SqlSessionFactory factory = builder.build(resourceAsStream);
        //获取SqlSession,sqlSession代表Java程序和数据库之间的会话。就像HttpSession是Java程序和浏览器之间的会话
        //SqlSession默认不自动提交事务,若需要自动提交事务可以在openSession方法中设置为true
        SqlSession sqlSession = factory.openSession(true);//设置true可以自动提交事务
        //获取mapper接口对象,这个方法的底层用到了代理模式,在底层为接口创建了实现类。
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //测试功能,通过mapper调用接口中的方法
          
    }

 2.最简单的增删改查操作

1)插入数据 

Step1:在UserMapper接口中添加方法

    //添加用户信息
    int insertUser();

Step2:在UserMapper.xml中添加配置

<!--    int insertUser();-->
        <insert id="insertUser">
            insert into t_user values(null,'admin','123',23,'男','123@qq.com')
        </insert>

Step3:在测试类中测试

        int result = mapper.insertUser();
        //sqlSession.commit();//手动提交事务,如果前面openSession中设置了true可以省略该句
        System.out.println(result);

2)更新数据

Step1:

    //修改用户信息
    void updateUser();
    

Step2:

<!--    void updateUser();-->
        <update id="updateUser">
            update t_user set username = '张三' where id = 12;
        </update>

3)删除数据

Step1:

    //删除用户信息
    void deleteUser();

Step2:

<!--    void deleteUser();-->
        <delete id="deleteUser">
            delete from t_user where id=12;
        </delete>

4)查询数据

Step1:

    User getUserById();
    //查询所有用户信息
    List<User> getAllUser();

Step2:

<!--     User getUserById();-->
<!--    resultType:设置默认映射关系,自动将查询出的结果表的字段名来作为属性名来给对象赋值,如果匹配到就赋值,匹配不到就不赋值将查询出来的结果转换成设置好的结果类型,再将结果作为返回值返回到这个方法-->
<!--    resultMap:设置自定义的映射关系,处理字段名和属性名不一致的情况,还有一对多和多对一的关系-->
        <select id="getUserById" resultType="pojo.User">
            select * from t_user where id=13;
        </select>
<!--    List<User> getAllUser();-->
        <select id="getAllUser" resultType="pojo.User">
            select * from t_user;
        </select>

3.功能优化

1.自动提交

int result = mapper.insertUser();
sqlSession.commit();
/*
因为核心配置文件<transactionManager type="JDBC"/>设置为tyep,所以需要手动提交事务
在执行sql后提交
*/

2.日志功能

1.在pom.xml中添加依赖

​<!--        日志信息-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>

​

2.在resources下面创建log4j.xml

<?xml version="1.0" encoding&
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值