mybatis使用的三个部分
- 数据查询主体 :
SqlSession
- 查询映射层 :
Mapper接口
- 数据维护层 :
Bean 设计
一、添加maven依赖
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- mysql依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
二、添加mybatis配置文件
1、基本配置
<?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>
<!--
environments:开发模式
work:工作模式
default="development",id="development",两个的属性值必须一致
-->
<!--配置环境-->
<environments default="development">
<!--配置mysql的环境-->
<environment id="development">
<!--配置事务的类型-->
<transactionManager type="JDBC"/>
<!--配置数据源(连接池)-->
<dataSource type="POOLED">
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="lxn123"/>
</dataSource>
</environment>
</environments>
<!-- 在配置文件中 关联包下的 接口类-->
<!-- 注册Mapper(映射)文件 -->
<mappers>
<mapper class="com.atguigu.mybatis.test3.UserMapper"/>
</mappers>
</configuration>
在<mappers>中有两个子元素 1.<package> 2.<mapper>
mappers 标签下有许多 mapper 标签,每一个 mapper 标签中配置的都是一个独立的映射配置文件的路径,配置方式有以下几种。
第一种:使用相对路径进行配置。示例代码如下:
这种方式不用保证同接口同包同名
<mappers>
<mapper resource="org/mybatis/mappers/UserMapper.xml"/>
<mapper resource="org/mybatis/mappers/ProductMapper.xml"/>
<mapper resource="org/mybatis/mappers/ManagerMapper.xml"/>
</mappers>
第二种:使用绝对路径引入进行配置。示例代码如下:
<mapper url="文件路径名">
<mappers>
<mapper url="file:///var/mappers/UserMapper.xml"/>
<mapper url="file:///var/mappers/ProductMapper.xml"/>
<mapper url="file:///var/mappers/ManagerMapper.xml"/>
</mappers>
第三种:使用接口类注册引入进行配置。示例代码如下:
<mapper class="接口路径">
保证接口名(例如IUserDao)和xml名(IUserDao.xml)相同,还必须在同一个包中。
例如:<mapper class="cn.sdut.dao.IPersonDao"/>
<mappers>
<mapper class="org.mybatis.mappers.UserMapper"/>
<mapper class="org.mybatis.mappers.ProductMapper"/>
<mapper class="org.mybatis.mappers.ManagerMapper"/>
</mappers>
但是对于接口方法使用注解方式来说,使用这种方式没有xml文件都可以,更别提同包同名什么的限制条件了。
第四种:使用接口所在包名引入进行配置。示例如下:
<package name="映射文件所在包名">
这种引入方式相当于批量引入一个包下的所有映射器
注意:这种方式必须保证接口名(例如IUserDao)和xml名(IUserDao.xml)相同,还必须在同一个包中。
<package name="cn.sdut.dao"/>
<mappers>
<package name="org.mybatis.mappers"/>
</mappers>
2、进阶配置
configuration | 包裹所有配置标签,是整个配置文件的顶级标签 |
---|---|
properties | 属性,该标签可以引入外部配置的属性,也可以自己配置。该配置标签所在的同一个配置文件中的其他配置均可引用此配置中的属性 |
setting | 全局配置参数,用来配置一些改变运行时行为的信息,例如是否使用缓存机制,是否使用延迟加载,是否使用错误处理机制等。并且可以设置最大并发请求数量、最大并发事务数量,以及是否启用命令空间等 |
typeAliases | 类型别名,用来设置一些别名来代替 Java 的长类型声明,如 java.lang.int 变为 int,减少配置编码的冗余 |
typeHandlers | 类型处理器,将 sql 中返回的数据库类型转换为相应 Java 类型的处理器配置 |
objectFactory | 对象工厂,实例化目标类的工厂类配置 |
plugins | 插件,可以通过插件修改 MyBatis 的核心行为,例如对语句执行的某一点进行拦截调用。 |
environments | 环境集合属性对象,数据库环境信息的集合。在一个配置文件中,可以有多种数据库环境集合,这样使 MyBatis 将 sql 同时映射至多个数据库 |
environment | 环境子属性对象,数据库环境配置的详细配置 |
transactionManager | 事务管理,指定 MyBatis 的事务管理器 |
dataSource | 数据源,使其中的 type 指定数据源的连接类型,在标签对中可以使用 property 属性指定数据库连接池的其他信息 |
mappers | 映射器,配置 sql 映射文件的位置,告知 MyBatis 去哪里加载 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>
<!-- 1.properties属性引入外部配置文件 -->
<properties resource="org/mybatis/example/config.properties">
<!-- property里面的属性全局均可使用 -->
<property name="username" value="root"/>
<property name="password" value="root"/>
</properties>
<!-- 2.全局配置参数 -->
<settings>
<!-- 设置是否启用缓存 -->
<setting name="cacheEnabled" value="true"/>
<!-- 设置是否启用懒加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
<!-- 3.别名设置 -->
<typeAliases>
<typeAlias alias="student" type="cn.com.mybatis.student"/>
<typeAlias alias="teacher" type="cn.com.mybatis.teacher"/>
<typeAlias alias="integer" type="java.lang.Integer"/>
</typeAliases>
<!-- 4.类型转换器 -->
<typeHandlers>
<!-- 一个简单类型转换器 -->
<typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>
<!-- 5.对象工厂 -->
<objectFactory type="org.mybatis.example.ExampleObjectFactory">
<!-- 对象工厂注入的参数 -->
<property name="someProperty" value="100"/>
</objectFactory>
<!-- 6.插件 -->
<plugins>
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
<!-- 7.environments数据库环境配置 -->
<!-- 和Spring整合后environments配置将被废除 -->
<environments default="development">
<environment id="development">
<!-- 使用JDBC事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="sqlmap/UserMapper.xml"/>
<mapper resource="sqlmap/OtherMapper,.xml"/>
</mappers>
</configuration>
三、创建接口和实体类,定义查询方法
接口
public interface IStudentDao {
/**
* 查询所有操作。(只需要接口,不需要实现类)
* @return
*/
List<Student> findAll();
}
实体类
public class Student implements Serializable {
private int sid;
private String sname;
private String sex;
private Date birthday;
private int cno;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
......
//自己实现其他的get set方法,这里省略
}
四、创建对应的xml映射文件(mapper.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.stevensam.dao.IStudentDao">
<!--配置查询所有学生的方法-->
<select id="findAll" resultType="com.stevensam.domain.Student">
SELECT * FROM student;
</select>
</mapper>
MyBatis自动映射功能:
1、首先通过接口中的方法名与sql查询语句进行关联
2、当查询到的字段与pojo中的字段完全对应的时候,就会将查询结果自动映射成一个pojo对象
3、如果数据库字段和类字段不一致,则需要进行转换,所以一般设计数据库的时候,字段采用驼峰式
五、创建测试类
public class UserMapperTest {
@Test
//获取所有数据
public void testGetAllUsers(){
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.工厂生产SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
IStudentDao mapper = session.getMapper(IStudentDao.class);
//5.使用代理对象执行方法
List<Student> studentList = mapper.findAll();
for (Student stu:studentList) {
System.out.println(stu);
}
//6.释放资源
session.close();
in.close();
}
}