全局配置文件
有数据源一些运行环境信息,使用这个配置文件,可以创建一个SqlSessionFactory对象。
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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?useSSL=false" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
<mappers>
<mapper resource="EmployeeMapper.xml" />
</mappers>
</configuration>
说明:
<configuration>
标签中,配置了数据库的信息;
<mapppers>
标签中,配置了sql映射文件,将其注册到全局文件
中,即根据该全局文件生成的SqlSessionFactory对象包含了这个映射。
编写sql映射文件
EmployeeMapper.xml,该文件定义了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="com.shen.mybaties.EmployeeMapper">
<!--
namespase:名称空间
id:唯一标识
resultType:返回值类型
#{id}:从传递过来的参数中取出id值
-->
<select id="selectEmp" resultType="com.shen.mybaties.bean.Employee">
select id,last_name lastName,email,gender from tbl_employee where id = #{id}
</select>
</mapper>
其中:
(1)namespase:命名空间,防止id冲突,类似于包名。
(2)id:唯一标识,调用的时候使用该标识。
(3)resultType:返回值类型,使用全类名,MyBatis帮我们将结果自动转换成对应的bean(需要有setter方法)。
(4)sql中的#{id}
:传递过来的参数
编写测试类
(1)根据官方文档,首先我们需要构建一个SqlSessionFactory对象。
(2)使用SqlSessionFactory对象创建一个SqlSession对象
(3)使用SqlSession对象执行已映射的 SQL 语句。
(4)使用完,需要关闭SqlSession对象。
代码如下:
/**
* 1. 根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象
* 有数据源一些运行环境信息
* 2. sql映射文件,配置了每一个sql,以及sql的封装规则等.
* 3. 将sql映射文件注册在全局配置文件中
* 4. 写代码
* 1). 根据全局配置文件得到SqlSessionFactory
* 2). 使用sqlSession工程,获取到sqlSession对象使用它来执行增删改查
* 一个sqlSession就是代表和数据库一次会话,用完关闭
* 3). 使用swl的唯一标志来告诉MyBatis执行哪个sql,sql都是保存在sql映射文件中的.
*/
@Test
public void test() throws IOException {
String resource = "mybaties.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2、获取sqlSession示例,能直接执行已经映射的sql语句
SqlSession openSession = sqlSessionFactory.openSession();
try {
// arg1:唯一标识,namespace+id
// arg2:传递的参数
Employee employee = openSession.selectOne("com.shen.mybaties.EmployeeMapper.selectEmp", "1");
System.out.println(employee);
} finally {
openSession.close();
}
}
接口式编程
编写一个接口
public interface EmployeeMapper {
public Employee getEmpById(Integer id);
}
绑定接口和方法
编写好接口后,需要修改我们的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="com.shen.mybaties.dao.EmployeeMapper">
<!--
namespase:名称空间,指定为接口的全类名
id:唯一标识,改为对应的方法名
resultType:返回值类型
#{id}:从传递过来的参数中取出id值
public Employee getEmpById(Integer id);
-->
<select id="getEmpById" resultType="com.shen.mybaties.bean.Employee">
select id,last_name lastName,email,gender from tbl_employee where id = #{id}
</select>
</mapper>
有两点需要注意:
(1)命名空间的变化:命名空间改为接口类的全类名
。
(2)sql语句的id的变化:id改为接口类的方法名
。
有了这两点,MyBatis会自动帮我们进行绑定。
编写新的测试方法
@Test
public void test2() throws IOException {
// 1. 获取SqlSessionFactory
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
// 2. 获取sqlSession示例,能直接执行已经映射的sql语句
SqlSession openSession = sqlSessionFactory.openSession();
try {
// 3. 获取接口的实现类对象
// 会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
EmployeeMapper employeeMapper = openSession.getMapper(EmployeeMapper.class);
Employee employee = employeeMapper.getEmpById(1);
System.out.println(employeeMapper.getClass());
System.out.println(employee);
} finally {
openSession.close();
}
}
注意:
(1)把获取sqlSessionFactory的方法提取出来,代码复用。
(2)注释3中,不是直接获取Employee对象,而是先获取一个Mapper类(接口实现类),直接调用该接口的sql方法,即可获取该对象。
通过调试输出观察,openSession
获取的employeeMapper
实际上是一个代理对象
。
好处
1、解耦
2、不用担心易错的字符串字面值以及强制类型转换,这里的接口方法已经规定了入参类型,返回值类型,这样我们可以更好地避免人为错误。
推荐使用接口式编程
。
小结
- 基于接口式编程
原生: Dao ======> DaoImpl
mybatis: Mapper ======> xxMapper.xml - SqlSession代表和数据库的一次会话:用完必须关闭;
- SqlSession和connection一样,都是非线程安全的,不能写成成员变量,每次使用应该获取新的对象。
- mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象,需要将接口和xml进行绑定。
获取方式:
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class); - 两个重要的配置文件:
1). mybatis的全局配置文件:包含数据库连接池信息,事务管理信息等,系统运行环境信息,以及注册sql映射信息。
2). sql映射文件:保存了每一个sql语句的映射信息。