重点内容#前言:
接口编程即面向接口编程。
接口编程和传统编程不一样的是:
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