我们接着入门实例一介绍一下如何使用Mybatis开发Dao方法
方法一:Dao接口以及dao接口实现
程序员需要编写Dao接口以及dao接口的实现类
结构
1,创建UserDao接口
public interface UserDao {
User findUserById(int id)throws IOException;
}
2,创建UserDao实现类UserDaoImpl
需要注入SqlSessionFactory,使用SqlSessionFactory生成SqlSession会话。
如果Mybatis和Spring整合,就可以让Spring管理SqlSessionFactory(将SqlSessionFactory在Spring容器中以单例方式存在。SqlSessionFactory创建SqlSession方法,是线程是安全的。),通过Spring将SqlSessionFactory注入到Dao接口中。
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory = null;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public User findUserById(int id) throws IOException {
// 从会话工厂得到会话
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过sqlSession操作数据库
// 第一个参数:UserMapper.xml中定义的statement的id
// 第二个参数:输入参数
User user = sqlSession.selectOne("test.findUserById", 4);
// 释放资源
sqlSession.close();
return user;
}
}
3,创建UserMapper.xml映射文件
<!--这块等于dao接口的实现 namespace必须和接口的类路径一样 -->
<mapper namespace="test">
<select id="findUserById" parameterType="int"
resultType="com.ghy.mybatis.po.User">
Select * From users Where id = #{id}
</select>
<insert id="insertUser" parameterType="com.ghy.mybatis.po.User">
Insert Into users(id,name,password) Values (#{id},#{name},#{password})
</insert>
</mapper>
4,创建测试用例UserDaoImplTest
public class UserDaoImplTest {
private SqlSessionFactory sqlSessionFactory=null;
@Before
public void setUp() throws Exception {
String resource="SqlMapConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
//创建会话工厂
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}
@After
public void tearDown() throws Exception {
}
@Test
public void testFindUserById() throws IOException {
UserDao userDao=new UserDaoImpl(sqlSessionFactory);
User user=userDao.findUserById(4);
System.out.println(user);
}
}
方法二:Mapper接口动态代理对象
程序员只需要编写mapper接口(就是dao接口),mapper是Mybatis的官方叫法,不需要写实现类。
结构
public interface UserMapper {
public User findUserById(int id);
public List<User> findUserList();
}
<!--这块等于dao接口的实现 namespace必须和接口的类路径一样 -->
<mapper namespace="com.ghy.mybatis.mapper.UserMapper">
<select id="findUserById" parameterType="int"
resultType="com.ghy.mybatis.po.User">
Select * From users Where id = #{id}
</select>
<select id="findUserList"
resultType="com.ghy.mybatis.po.User">
Select * From users
</select>
<insert id="insertUser" parameterType="com.ghy.mybatis.po.User">
Insert Into users(id,name,password) Values (#{id},#{name},#{password})
</insert>
</mapper>
UserMapper规则:
(1).UserMapper.xml的namespace是UserMapper.java的全路径名;
(2). UserMapper.xml中的statement的id是UserMapper.java中的方法名;
(3). UserMapper.xml中的statement的parameterType类型和UserMapper.java中的方法形参类型一致;
(4). UserMapper.xml中的statement的resultType类型和UserMapper.java中的方法返回值类型一致。
注:在UserMapper.xml中定义的resultType的类型应该是Sql查询结果一条记录映射java对象的类型。
是否返回List集合还是单个对象,由UserMapper接口方法返回值来决定。
如果返回的是个List集合,生成代理对象内部会调用sqlSession.selectList()方法获取一个集合。
如果返回的是一个单个对象,生成代理对象内部就会调用sqlSession.selectOne()方法获取单个对象。
3,将UserMapper.xml在SqlMapConfig.xml中配置
<mappers>
<mapper resource="sqlmap/UserMapper.xml" />
</mappers>
4,创建测试用例UserMapperTest
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory = null;
@Before
public void setUp() throws Exception {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@After
public void tearDown() throws Exception {
}
@Test
public void testFindUserById() {
//得到SqlSession
SqlSession sqlSession=sqlSessionFactory.openSession();
//通过SqlSession得到UserMapper的动态代理对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
//调用UserMapper的方法
User user=userMapper.findUserById(4);
System.out.println(user);
}
@Test
public void testFindUserList() {
//得到SqlSession
SqlSession sqlSession=sqlSessionFactory.openSession();
//通过SqlSession得到UserMapper的动态代理对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
//调用UserMapper的方法
List<User> users=userMapper.findUserList();
for (User user : users) {
System.out.println(user);
}
}
}