Mybatis框架学习02
写在前面
本文接上文:https://www.cnblogs.com/wushenjiang/p/12451977.html
1.原始dao开发方法(程序员需要写dao接口和dao实现类)
思路:
- 1.程序员首先书写dao接口和dao实现类
- 2.向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession。
代码展示:
dao接口:
public interface UserDao {
//根据id查询用户信息
public User findUserById(int id) throws Exception;
//添加用户信息
public void insertUser(User user) throws Exception;
//删除用户信息
public void deleteUser(int id) throws Exception;
}
dao实现类:
//需要向dao实现类中注入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;
}
@Override
public void insertUser(User user) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行插入操作
sqlSession.insert("test.insertUser",user);
//执行提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
@Override
public void deleteUser(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.delete("test.deleteUser",id);
//执行提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
测试代码(使用Junit进行单元测试)
public class UserDaoImplTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
// 创建sqlSessionFactory
// mybatis配置文件
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,传入mybatis的配置文件信息
sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
}
@Test
public void testFindUserById() throws Exception {
// 创建UserDao的对象
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
// 调用UserDao的方法
User user = userDao.findUserById(1);
System.out.println(user);
}
开发中的问题:
- 1.dao接口实现类中存在大量模版方法
- 2.调用sqlsession方法时将statement的id硬编码了
- 3.调用sqlsession方法传入的变量IDE不会报错,不利于开发。
2.mapper代理开发方法(程序员只需提供mapper接口)
思路:
- 需要编写一个mapper.xml映射文件
- 需要遵守一定的开发规范.
开发规范:
-
1.在mapper.xml中namespace等于mapper接口地址
-
2.mapper.java接口中的方法名和mapper.xml中statement的id一致
-
3.mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致
-
4.mapper.java接口中的方法返回值和mapper.xml中statement的resultType指定的类型一致
-
例:
代码展示:
需要在SqlMapConfig.xml中加载mapper.xml
测试代码:
@Test
public void testFindUserByName() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
// 创建Usermapper对象,mybatis自动生成mapper代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> list = mapper.findUserByName("赵");
System.out.println(list);
sqlSession.close();
}
小结
mapper接口方法比起原始Dao接口方法要灵活的多,因此建议在开发中尽量使用mapper接口方法来实现.
3.SqlMapConfig.xml内的几项参数解释
3.1 properties属性
可以加载来自其他配置文件,以降低程序的耦合性。如我们可以将数据库配置单写一个properties,然后在SqlMapConfig.xml中读取它,如图:
建议: 不要在properties元素体中添加任何属性值,只将属性值定义在properties文件中。在properties文件中定义属性名要有一定的特殊性,如XXXX.XXX
3.2 setting(全局配置)
可用于调整mybatis框架的一些运行参数,如开启二级缓存、开启延迟加载等
3.3 typeAliases(别名)
在mybatis中,自带了许多别名,如图:
但在开发中,我们也可以将自己的pojo类自定义一个别名以方面我们的使用:
单个定义:
批量定义:(常用)
3.4 mappers(映射配置)
mappers主要用来加载映射文件,我们有三种加载方式:
1.通过resource加载单个映射文件:
2.通过mapper接口加载单个映射文件(前提是使用mapper代理方法)
3.批量加载mapper(推荐使用)