您的位置:首页 > 其它

MyBatis初探二

2016-04-03 00:53 495 查看
摘要: 1.Mybatis 的 Dao 层( 持久层 )的开发方式。

一、Mybatis 的 Dao 层两种开发方式

1、原始Dao开发模式( 自己手动实现Dao层接口和实现类 )
》 实现思路:编写Dao接口和实现类,在Dao接口中注入单例的SqlSessionFactory,通过SqlSessionFactory获取SqlSession来获取数据库操作对象。》

package com.ts.dao;

import com.ts.domain.Users;

public interface UsersDao {

//根据ID查询用户信息
Users findUserById(int id) throws Exception;

}

package com.ts.dao.impl;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.ts.dao.UsersDao;
import com.ts.domain.Users;

public class UsersDaoImpl implements UsersDao {

private SqlSessionFactory sqlSessionFactory;

//构造函数注入SqlSessionFactory
public UsersDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory =sqlSessionFactory;
}

/**
* 1和3是模板代码
* 1.SqlSession sqlSession = getSqlSession();
* 2.业务逻辑
* 3.sqlSession.close();
*/

@Override
public Users findUserById(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
Users user  = sqlSession.selectOne("Users.findUserById", id);
sqlSession.close();
return user;
}

缺点: 1.代码冗余,重复代码很多。

2.根据Users.xmlMapper映射文件的id获取SQL语句(Users.findUserById),硬编码在Java代码里了。

3.调用SqlSession方法时,传入的参数编译期间不报错,不能及时发现错误。(如:sqlSession.selectOne("Users.findUserById","123");

2、mapper代理方法( 自己只需要写mapper接口( Dao接口 ) ):与Spring整合后就更简单,这种方式也就不需要了,在这做大概了解。
根据接口编写规范:Mybatis可以自动生成Mapper接口实现类的代理对象

1.编写UserMapper.java接口和UserMapper.xml的SQL映射文件

package com.ts.dao;
public interface UserMapper {
public Users findUserById(int id) throws Exception;
}

<mapper namespace="com.ts.dao.UserMapper">
<select id="findUserById" parameterType="int" resultType="com.ts.domain.Users">
select * from Users where id = #{id}
</select>
</mapper>

2.Mybatis自动生成代理实现类需要遵循的规范

->Mapper.xml的namespace 和 mapper.xml接口全限定名一致( 观察上面代码 )

->Mapper.java接口中的方法名和mapper.xml中每个SQL的ID一致

->Mapper.java接口中的输入参数类型和mapper.xml中每个SQL的输入参数指定的类型一致

->Mapper.java接口中的返回值参数类型和mapper.xml中每个SQL的返回值指定的类型一致

3.测试( 不要忘记把mapper.xml添加到SqlMapConfig.xml中)

package com.ts.dao.test;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import com.ts.dao.UserMapper;
import com.ts.domain.Users;

public class UserMapperTest {

private static SqlSessionFactory sqlSessionFactory;

@Before
public void before() throws IOException{
//通过输入流读取全局配置信息创建工厂
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

}

@Test
public void test() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//生成代理实现类
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Users user = userMapper.findUserById(1);
//==>Users [id=1, name=田硕, sex=男, birth=Sat Apr 02 00:00:00 CST 2016, address=河南商丘]
System.out.println(user);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: