Mybatis框架的存在简化业务代码与数据库的交互,实现了对数据库的操作与业务逻辑的解耦,方便维护。
Mybatis的开发步骤:
- 添加Mbatis的坐标。
- 创建数据表。
- 创建实体类。
- 编写映射文件。
- 编写核心文件。
- 编写测试类。
使用Mybatis实现简单的开发:
添加Mybatis坐标的代码:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
创建数据表:
创建实体类:
public class User1 {
private String username;
private Integer password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getPassword() {
return password;
}
public void setPassword(Integer password) {
this.password = password;
}
@Override
public String toString() {
return "User1{" +
"username='" + username + '\'' +
", password=" + password +
'}';
}
}
创建映射文件:
<?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">
<!--namesapce属性 表示当前文件的命名空间 可以是使用 命名空间。id(sql操作的id来进行具体的实现和调用)-->
<mapper namespace="Mymapper">
<!-- 来个参数分别表示 id就是id resultType 参数指明返回值的类型-->
<select id="user1" resultType="com.itheima.zhujie.doman.User1">
select * from user
</select>
</mapper>
映射文件详解:
映射文件中<mapper namespace="Mymapper">中的namespace属性是代表的映射文件的命名空间,
<sql标签 id="id名称" resultType="封装返回数据的实体类的权限类名" parameterType="对传入sql数据的权限类名,可以是实体类型也可以是普通的数据类型" >
通过id+命名空间可以实现调用映射文件中特定的sql操作。
主配置文件:
<?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>
<!-- 配置当前数据源的环境-->
<!-- 下面可以配置很多的环境 default属性就是指明选择下面的那个环境 -->
<environments default="deve">
<!-- 指明当前环境的 环境id 供上面进行选择-->
<environment id="deve">
<!-- 指明是使用的哪一个事务管理器-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源 type属性是指明当前数据源的类型 POOLED 表示的是池类型的 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/spring"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<!-- 加载映射文件-->
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
由 <environments default="deve">和<environment id="deve">可以看出在主配置文件中可以配置多个数据源,可以根据运行环境来选择不同的数据源。例如:测试时的数据源,编译时的数据源。
配置数据源的时候需要指明数据源的事务管理器,需要指明数据源的类型。
需要加载映射文件,<mapper resource="映射文件的地址">中映射文件的地址是相对于类加载路径的。加载映射文件路径的原因是在使用Mybatis时需要加载主配置文件,所以在主配置文件中引入映射文件一起加载。
测试类:
public static void main(String[] args) throws IOException {
//加载核心配置文件 其中参数的地址是相对于 类加载路径下的地址
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session的会话对象
SqlSession sqlSession = build.openSession();
//执行数据库的操作 参数是 命名空间.id
List<User1> objects = sqlSession.selectList("Mymapper.user1");
System.out.println(objects);
//关闭session会话对象
sqlSession.close();
}
}
Mybatis的增删改查的操作
插入操作:
测试类:
只要对数据中的数据进行了修改就需要进行提交事务的操作。sql会话对象.commit()。
执行操作中user参数是进行传入sql语句的实体类对象。
修改操作
测试类:
映射文件中:
使用#{*******}表达式来进行接收传入的实体类对象中的属性值,***要和实体类中的属性名一致,才能实现精确封装。
删除操作:
这是传入的参数是基本数据类型所以paramterType的属性值书写简单类型的权限类名。
sql语句中使用#{任意字符串}方式引用传递的单个参数
核心配置文件概述:
为数据类型定义别名
在映射文件中操作sql语句的参数或者是sql语句返回的数据类型 可以使用别名来进行设置,减少代码的复杂度。
基本数据类型的别名:
不是基本数据类型的,是自己创建的实体类,需要在核心配置文件中进行定义别名。
示例:
其中type代表的是需要进行设置别名的实体类的权限别名,alias表示定义的别名。
Mybatis的相关API:
Mybatis通过接口的代理方式实现Dao层
使用这种方式只需要我们编写Mapper接口,由mybatis框架来进行创建对应的实现类【原理是使用动态代理】
接口代理方式的开发规范:
- Mapper.Xml文件中的namespace(映射文件中额命名空间)和Mapper接口的全限定名相同。
- Mapper接口中的方法名和Mapper。Xml中定义的每个statement(sql操作的标签)的id相同。
- Mapper接口中的方法的输入参数类型要和映射文件中定义的每个sql的parameterType的类型相同。
- Mapper接口中的方法的返回值要和映射文件中定义的每个sql的resultType的类型相同相同。
图形规范:
代码实现:
Dao层接口:
mapper代码的实现:
public interface UserDao {
void save();
}
映射文件:
测试代码:
@Test
public void sh() throws IOException {
//加载核心配置文件 其中参数的地址是相对于 类加载路径下的地址 返回值是一个流
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//获得sqlsession工厂对象
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得sqlsession的会话对象
SqlSession sqlSession = build.openSession();
//执行数据库的操作
UserDao1 mapper = sqlSession.getMapper(UserDao1.class);
List<User> save = mapper.save();
System.out.println(save);
//关闭session会话对象
sqlSession.close();
使用接口代理的方式需要使用sqlsession会话对象创建mapper对象,sqlSession.getMapper(UserDao1.class);参数是mapper接口的类对象。 List<User> save = mapper.save();返回值类型自动识别。
mapper接口中的方法含有参数:
dao层接口:
映射文件: