mybatis是一个支持普通SQL查询,存储过程和高级映射的优秀的持久层的框架,是apache下的顶级项目。mybatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。mybatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。
其中,开发dao有两种方法,一种原始的dao开发方法,程序员需要写dao接口和dao实现类。另一种是mapper代理方法,程序员只需要写mapper接口相当于dao接口。下面看看这两种写法。
先配置好mybatis的核心配置文件:SqlMapConfig.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>
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<!-- <mapper resource="me/gacl/mapping/userMapper.xml"/> -->
</mappers>
</configuration>
原始dao开发方法
写法一
1.编写dao接口(UserDao)
public interface UserDao {
// 根据id查询用户信息
public User findUserById(int id) throws Exception;
}
2.编写dao实现类
public class UserDaoImpl implements UserDao {
// 需要向dao实现类中注入SqlSessionFactory
// 这里通过构造方法注入
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public User findUserById(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//这里的test.findUserById是与下面的映射文件user.xml中的namespace+id有关。
User user = sqlSession.selectOne("test.findUserById", id);
// 释放资源
sqlSession.close();
return user;
}
}
3.编写映射文件(user.xml)
<mapper namespace="test">
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE id=#{value}
</select>
</mapper>
不管是哪种写法,映射文件都要添加到核心配置文件SqlMapConfig.xml的mappers标签内。
4.编写测试类
public class Test {
public static void main(String[] args) throws Exception {
// mybatis配置文件
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 创建UserDao的对象
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
// 调用UserDao的方法
User user = userDao.findUserById(1);
System.out.println(user);
}
}
测试结果:
User [id=1, name=孤傲苍狼, age=27]
这种方式还有一种形式,就是把实现类的工作移到测试类里面完成,dao和到实现都不需要,只需要一个映射文件和测试类。
写法二
1.编写映射文件(user.xml)
<mapper namespace="test">
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE id=#{value}
</select>
</mapper>
添加映射文件到核心配置文件SqlMapConfig.xml的mappers标签内。
2.编写测试类
public class Test {
public static void main(String[] args) throws IOException {
//mybatis的配置文件
String resource = "SqlMapConfig.xml";
//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
//创建能执行映射文件中sql的sqlSession
SqlSession session = sessionFactory.openSession();
String statement = "test.getUser";//映射sql的标识字符串
//执行查询返回一个唯一user对象的sql
User user = session.selectOne(statement, 1);
System.out.println(user);
}
}
测试结果:
User [id=1, name=孤傲苍狼, age=27]
mapper代理方法
1.编写mapper.java(UserMapper.java相当于java接口)
public interface UserMapper {
// 根据id查询用户信息
public User findUserById(int id) throws Exception;
}
2.编写mapper.xml(UserMapper.xml)
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
<!--通过id查询用户表的记录 -->
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE id=#{value}
</select>
</mapper>
添加映射文件到核心配置文件SqlMapConfig.xml的mappers标签内。
注意:
(1)在mapper.xml中namespace等于mapper接口地址
(2)mapper.java接口中的方法名和mapper.xml中statement的id一致
(3)mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。
(4)mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。
3.编写测试类
public class Test {
public static void main(String[] args) throws Exception {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成mapper代理对象
UserDao userDao =session.getMapper(UserDao.class);
User user=userDao.findUserById(1);
System.out.println(user.toString());
session.close();
}
}
测试结果:
User [id=1, name=孤傲苍狼, age=27]
总结
通过以上各种写法的形式可以看出,写法的形式上可以有多种,但本质上的区别是在拿到session对象后采用何种执行SQL的方式。
其核心区别为:
SqlSession session = sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成mapper代理对象
UserDao userDao =session.getMapper(UserDao.class);
User user=userDao.findUserById(1);
和
SqlSession session = sessionFactory.openSession();
String statement = "test.getUser";//映射sql的标识字符串
//执行查询返回一个唯一user对象的sql
User user = session.selectOne(statement, 1);
这两种session执行SQL的区别。
第一种是通过代理的方式,执行dao接口中的方法时,会调用其对应的映射文件中的同名sql脚本。
第二种方式可用dao,也可以不用dao,其实质为session直接根据namespace调用对应的映射文件中的sql脚本。