sqlSession 在哪使用
它是线程不安全的,因为它还处理数据域属性,因此使用在方法体内使用,当成局部变量使用。
1、原始dao实现
思路:需要向dao实现类中注入sqlfactory ,然后在方法体内通过selfactory创建session。
实现类:
public class UserDaoImpl implements UserDao {
//注入SqlSessionFactory
private SqlSessionFactory sqlSessionFactory;
//暂且通过构造函数进行注入
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public User findUserById(int id) throws Exception {
// 线程不安全,因此通过方法体创建
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById",id);
sqlSession.close();
return user;
}
}
问题在哪?
1、dao接口实现类的方法存在大量重复代码。
2、调用sqlsession方法时将statement的参数硬编码了。
3、调用sqlsession方法时,由于使用泛型,在编译阶段不会判断参数类型问题
2、mapper代理实现
第一步:创建UserMapper.java 接口
public interface UserMapper {
User findUserById(int id) throws Exception;
}
第二步: 创建userMapper.xml配置文件(在普通的dao实现中,也是需要),命名空间namespace等于UserMapper.java的地址
<mapper namespace="cn.itcast.mybatis.sqlMapper.UserMapper">
第三步:接口的方法定义,满足以下规范:
-
方法的名称等于xml中的id
-
java中 方法的 输入参数和返回值 和 xml 中parametertype 和resulttype 一致
第四步:再把userMapper.xml配置文件写入核心配置文件中。
测试一下
@Test
public void testMapperDao() throws Exception {
// mybatis配置文件
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂,传入mybatis配置文件的信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//需要获得session对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 用对象开启mapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 通过userMapper调用方法,等价于调用daoImpl的实现
User user = userMapper.findUserById(1);
System.out.println(user.toString());
}
显示成功
User [id=1, username=王五, sex=2, birthday=null, address=null]
这时有两个问题需要思考?
问题1 如果返回是多个User怎么办?
解决:mapper代理会根据接口方法的返回值,内部自动选择调用selectOne 或者 selectList。
public interface UserMapper {
//查
User findUserById(int id) throws Exception;
List<User> findUserByName(String name) throws Exception;
// 增
void insertUser(User user) throws Exception;
//删
void deleteUserById(int id) throws Exception;
//更新
void updateUser(User user) throws Exception;
}
问题2:输入的参数只能有一个,因为配置文件中的paramtype只能对应一个。如果希望传入多个参数怎么办?
解决是:把参数封装成类,然后通过parameterType引入。