Mybatis的接口编程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38409944/article/details/82466742

重点内容#前言:
接口编程即面向接口编程。

接口编程和传统编程不一样的是:

TeacherMapper 一般接口名都要结尾Mapper
之前dao接口对应一个实现类 现在对应配置文件 相当于实现类

一张图了解接口编程:

这里写图片描述

配置Mybatis的接口编程:

定义接口,
实现Mapper类(sql映射文件),
配置全局变量

先来看看Mybatis的基本目录结构
这里写图片描述
重要文件:

1. src文件下包内的Mapper接口(Mybatis操作的对象)
2. conf文件下(自定义与src并列)包内的Mapper.xml的sql映射文件
3. properties连接数据库配置文件
4. config全局配置文件
5. 实体类entity

注意:
1. conf文件下(自定义与src并列)包内的Mapper.xml的sql映射文件要和src文件下包内的Mapper接口名字一致,并且包名也一致。
2. conf文件夹其实跟src共享一个空间。具体的可看下面这个链接
https://blog.csdn.net/sinat_34328764/article/details/79686414

总结:

mybatis的全局配置文件:  
包含数据库的连接池信息 事务管理信息 》》系统运行环境信息
sql映射文件:  
保存了每一个sql语句的映射信息,将sql抽取出来。

接口编程的流程:

1. 定义实体类entity。

字段要和数据库的一致最好,不一致也没事,可以使用别名,后面文章会讲。

2. 定义增删改查接口

举例:

public interface TeacherMapper{
    //增
    public Integer addTeacher(Teacher teacher);
}
3. 对应的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="dao.TeacherMapper">  
    <insert id="addTeacher">
        INSERT INTO teachers(name,gender) values(#{name},#{teacher_gender})
    </insert>
</mapper>

注意:
映射文件名必须和接口同名,并且放在与接口同一目录下。
各个参数:

namespace:名称空间,用来绑定接口地址  得是接口的全类名;
id:唯一标识,用来绑定接口的方法
insert标签还有参数:
parameterType:参数类型
resultType:返回值类型
#{id}:从传递过来的参数中取出id值
<mapper namespace="dao.FindTeacher"> 对应接口  而不是随便起名字
id="getTeacherById"对应接口的方法

以上操作实现的功能就是 将**sql映射文件绑定到接口

mapper接口没有实现类 但是mybatis会为这个接口生成一个动态代理对象
调用接口的方法就会执行对应的sql语句。

4. 配置连接数据库dbconfig.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useAffectedRows=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false
jdbc.username=root
jdbc.password=123456

5. 配置全局变量:mybatis-config.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="dbconfig.properties"></properties>
    <!-- 是否开启二级缓存 -->
    <settings>
        <setting name="cacheEnabled" value="true" />
    </settings>
    <!-- 绑定实体类 -->
    <typeAliases>
        <package name="entity" />
    </typeAliases>
    <!-- 配置数据库连接 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <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>
    <!-- 将我们写好的sql映射文件(TeacherMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
    <mappers>
        <package name="dao" />
    </mappers>
</configuration>

注意:

<mappers>
    <mapper class="dao.TeacherMapper"/>
</mappers>   

·实现的目标是将实现的dao包下的TeacherMapper映射文件配置到全局配置中。·

    <mappers>
        <package name="dao"/>
    </mappers>

·实现的目标是将实现的dao包下的所有sql映射文件配置到全局配置中。·

6. 编写测试类:TeacherTest
    @Test
    void test1() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            //代理类 
            TeacherMapper dox = sqlSession.getMapper(TeacherMapper.class);
            Teacher teacher = new Teacher("小明", "1");
            dox.addTeacher(teacher);
            sqlSession.commit();
        }finally {
            sqlSession.close();
        }
    }

注意:
1. 如果是增删改的话 需要手动提交

sqlSession.commit();

2 .sqlSession代表和数据库的一次会话
用完要关闭和connecion都一样 非线程安全

sqlSession.close();

不能private SqlSession sqlSession;这样放在成员变量中
每次都应该去获取新的对象
3. 传入接口得到代理类,实际上是对代理类进行操作。

TeacherMapper dox = sqlSession.getMapper(TeacherMapper.class);

额外了解下:没有sql映射文件的情况:

没有sql映射文件,所有的sql都是利用注解写在接口上; 接口直接绑定全局配置

接口:

@Select("select id,name,gender teacher_gender from teachers where id = #{id}")
Teacher getTeacherById(Integer id);

全局配置文件:

<mappers>
    <mapper class="dao.TeacherMapper"/>    //接口类全路径
</mappers>

那何时使用sql映射文件?

比较重要的,复杂的Dao接口我们来写sql映射文件
不重要,简单的Dao接口为了开发快速可以使用注解;

总结:

1. 增删改  需要传入一个对象的时候  为了方便起见  创建一个有参的构造函数  但是  记住  
也要同时创建一个无参的构造函数  因为很多都是依赖对象的默认构造函数
即无参构造函数,单单只有有参的构造函数  会覆盖默认的构造函数  使其失效

2。 还有接口可以直接定义以下返回值:
Integer Long Boolean  返回的是 受影响的行数 或者 true false
3. sqlSession.commit();  //增删改要主动提交数据commit  commit提交事务

SqlSession session=sessionFactory.OpenSession(true);不写commit();而自动提交
parameterType="integer"可以不用写
但是 如果返回对象  就需要 resultType指定对象类型
sql映射文件中的sql语句不需要分号结束


4. 除了Select(),只有Update(),Insert(),Delete()才需要commit();

5. SqlSession每执行一个SQL语句就要session.close(),用的时候再创建
6. 注意 如果是update的话  默认情况下返回值是找到的行 而不是实际修改的行 
举例 调用过一update后   返回1  再一次调用 返回值还是1
如何让它返回值为实际操作的行呢?
url中添加如下参数:
useAffectedRows=true

猜你喜欢

转载自blog.csdn.net/qq_38409944/article/details/82466742
今日推荐