一、原始dao的开发方式
即开发dao接口和dao实现类。首先添加Dao接口:
public interface UserDao {
// 1、 根据用户ID查询用户信息
public User findUserById(int id) throws Exception;
// 2、 根据用户名称模糊查询用户列表
public List<User> findUsersByName(String name) throws Exception;
// 3、 添加用户
public void insertUser(User user) throws Exception;
}
然后实现其接口即可:
public class UserDaoImpl implements UserDao {
// 依赖注入,将工程在外面创建
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {//将外面创建的工厂传递进来(以后spring)
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public User findUserById(int id) throws Exception {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 调用SqlSession的增删改查方法
// 第一个参数:表示statement的唯一标示
User user = sqlSession.selectOne("test.findUserById", id);
System.out.println(user);
// 关闭资源
sqlSession.close();
return user;
}
@Override
public List<User> findUsersByName(String name) {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 调用SqlSession的增删改查方法
// 第一个参数:表示statement的唯一标示
List<User> list = sqlSession.selectOne("test.findUsersByName", name);
System.out.println(list);
// 关闭资源
sqlSession.close();
return list;
}
@Override
public void insertUser(User user) {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 调用SqlSession的增删改查方法
// 第一个参数:表示statement的唯一标示
sqlSession.insert("test.insertUser", user);
System.out.println(user.getId());
// 提交事务
sqlSession.commit();
// 关闭资源
sqlSession.close();
}
}
那么在测试类中:
public class UserDaoTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
// 读取配置文件
// 全局配置文件的路径
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception {
// 创建UserDao
UserDao dao = new UserDaoImpl(sqlSessionFactory);
User user = dao.findUserById(1);
System.out.println(user);
}
}
二、Mapper代理的开发方式
分析上面的代码会发现有大量的重复的模板代码,并且存在硬编码【如sqlSession.insert("test.insertUser", user);】,为了解决以上问题,故采用开发mapper接口(相当于dao接口)来进行dao的开发,即通过开发mapper接口,将自动生成其代理类来进行操作。其中Mapper代理使用的是jdk的代理策略。如果采用Mapper代理的方式开发需要满足如下开发规范:
- mapper接口的全限定名要和mapper映射文件的namespace值一致。
- mapper接口的方法名称要和mapper映射文件的statement的id一致。
- mapper接口的方法参数类型要和mapper映射文件的statement的parameterType的值一致,而且它的参数是一个。
- mapper接口的方法返回值类型要和mapper映射文件的statement的resultType的值一致。
首先开发mapper接口:
public interface UserMapper {
// 1、 根据用户ID查询用户信息
public User findUserById(int id) throws Exception;
// 2、 添加用户
public void insertUser(User user) throws Exception;
}
之后创建User的映射文件,在config下创建mapper目录然后创建UserMapper.xml(这是mybatis的命名规范,当然,也不是必须是这个名称)。由其规范可以确定其映射文件如下(接口在包com.itheima.mybatis.mapper.UserMapper下面):
<mapper namespace="com.itheima.mybatis.mapper.UserMapper">
<!-- 根据用户ID查询用户信息 -->
<select id="findUserById" parameterType="int" resultType="User">
SELECT
* FROM USER WHERE id =#{id}
</select>
<!-- 添加用户 -->
<insert id="insertUser" parameterType="com.itheima.mybatis.po.User">
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT
LAST_INSERT_ID()
</selectKey>
INSERT INTO USER
(username,birthday,sex,address)
VALUES(#{username},#{birthday},#{sex},#{address})
</insert>
</mapper>
之后将映射文件加到全局配置文件即可。然后便可以进行测试:
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
// 读取配置文件
// 全局配置文件的路径
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception {
// 创建UserMapper对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 由mybatis通过sqlsession来创建代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.findUserById(1);
System.out.println(user);
sqlSession.close();
}
@Test
public void testInsertUser() throws Exception {
// 创建UserMapper对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 由mybatis通过sqlsession来创建代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUsername("东哥hm19");
user.setAddress("宝盛西里24号楼");
mapper.insertUser(user);
System.out.println(user.getId());
sqlSession.commit();
sqlSession.close();
}
}