一、mybatis下载、安装、配置参考上节。
二、mybatis原始Dao实现方式,创建Dao接口和实现类
UserDao接口
public interface UserDao {
User findUserById01(int id);
}
实现类:UserDaoImpl
public class UserDaoImpl implements UserDao {
//注入一个工厂
private SqlSessionFactory sqlSessionFactory;
//通过构造得到工厂对象
public UserDaoImpl( SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
/*我们通过看此实现类,可以知道,如果以后我们每次对数据库一个表进行操作,都要写这么一个Dao实现类,代码重复性高,
* 注入一个工厂、通过构造得到工厂对象、下面的findUserById里面的sqlsession、Sqlsession.close都是重复性代码
* 以后我们每创建一个Dao实现类都会写这些代码。唯一不一样的变量就是mapper里面的命名空间test和mapper里面的id。
* mybatis通过代理的方式,能够给我们简化。就是将命名空间=UserDao.class ,UserDao的实现方法=mapper里面的id,这样实际上以后我们的接口实现类由mybatis代理给我们做了,我们不用再写UserDaoimpl这个接口实现类了。
* 这样这两个变量解决了。
* */
@Override
public User findUserById01(int id) {
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById", id);
sqlSession.close();
return user;
}
}
mybatis的原始Dao方式的测试语句
public class sqlTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setup() throws IOException{
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void findUserById(){
//此处通过UserDaoImpl的构造函数,生成UserDao对象。
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
User findUserById = userDao.findUserById01(10);
System.out.println("结果:"+findUserById);
}
}
三、Mybatis代理实现方式
UserDao接口
public interface UserDao {
User findUserById(int id);
}
UserMapper配置
<?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">
<!--此处的命名空间=UserDao的类路径 -->
<mapper namespace="zym.com.Dao.UserDao">
<select id="findUserById" parameterType="int"
resultType="zym.com.po.User">
SELECT * FROM USER WHERE id =#{id}
</select>
</mapper>
SqlMapconfig.xml配置加入新建的UserMapper路径
<!-- 加载映射mapper文件 -->
<mappers>
<mapper resource="mapper/UserMapper.xml" />
</mappers>
只写了接口和mapper文件,就可以直接写测试类了,
public class sqlTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setup() throws IOException {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void findUserById(){
//此处通过UserDaoImpl的构造函数,生成UserDao对象。
SqlSession sqlSession = sqlSessionFactory.openSession();
/*
mybatis第二节中是原始的Dao方法实现,但是UserDaoImpl实现类里面有很多重复的代码,唯一不一样的变量就是mapper里面的命名空间test和mapper里面的id。
mybatis通过代理的方式,能够给我们简化。就是将命名空间=UserDao.class ,UserDao的实现方法=mapper里面的id
这样这两个变量解决了。
*/
UserDao mapper = sqlSession.getMapper(UserDao.class);
User findUserById = mapper.findUserById(10);
System.out.println("结果:"+findUserById);
}
}
个人总结:mybatis采用代理实现方式,首先是将sqlsession创建、关闭的重复代码取消了。最重要的是解决了Dao原始方式的麻烦,有了Dao方式,我们就可以以后把对数据库的操作移到controller以外。