mybatis学习记录二——mybatis开发dao的方法
4.1 SqlSession使用范围
4.1.1 SqlSessionFactoryBuilder
通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory
将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。
在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。
4.1.2 SqlSessionFactory
通过SqlSessionFactory创建SqlSession,使用单例模式管理sqlSessionFactory(工厂一旦创建,使用一个实例)。
将来mybatis和spring整合后,使用单例模式管理sqlSessionFactory。
4.1.3 SqlSession
SqlSession是一个面向用户(程序员)的接口。
SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象)、。
SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。
SqlSession最佳应用场合在方法体内,定义成局部变量使用。
4.2 原始dao开发方法(程序员需要写dao接口和dao实现类)
4.2.1 思路
程序员需要写dao接口和dao实现类。
需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession
4.2.1 dao接口
- public interface UserDao {
- //根据id查询用户信息
- public User findUserById(int id) throws Exception;
- //根据用户名列查询用户列表
- public List<User> findUserByName(String name) throws Exception;
- //添加用户信息
- public void insertUser(User user) throws Exception;
- //删除用户信息
- public void deleteUser(int id) throws Exception;
- }
4.2.3 dao接口实现类
- public class UserDaoImpl implements UserDao {
- // 需要向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();
- }
- }
4.2.4 测试代码:
- public class UserDaoImplTest {
- private SqlSessionFactory sqlSessionFactory;
- // 此方法是在执行testFindUserById之前执行
- @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);
- }
- }
4.2.5 总结原始 dao开发问题
1、dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。
2、调用sqlsession方法时将statement的id硬编码了
3、调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。
4.3 mapper代理方法(程序员只需要mapper接口(相当 于dao接口))
4.3.1 思路(mapper代理开发规范)
程序员还需要编写mapper.xml映射文件
程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。
开发规范:
1、在mapper.xml中namespace等于mapper接口地址
- <!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
- 注意:使用mapper代理方法开发,namespace有特殊重要的作用,namespace等于mapper接口地址
- -->
- <mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
<select id="findUserById" parameterType="int" resultType="user">
SELECT * FROM USER WHERE id=#{value}
</select>
2、mapper.java接口中的方法名和mapper.xml中statement的id一致
3、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。
4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。
- public interface UserMapper {
//根据id查询用户信息- public User findUserById(int id) throws Exception;
总结:
以上开发规范主要是对下边的代码进行统一生成:
User user = sqlSession.selectOne("test.findUserById", id);
sqlSession.insert("test.insertUser", user);
。。。。
4.3.2 mapper.java
- //根据id查询用户信息
- public User findUserById(int id) throws Exception;
4.3.3 mapper.xml
- <select id="findUserById" parameterType="int" resultType="user">
- SELECT * FROM USER WHERE id=#{value}
- </select>
4.3.4 在SqlMapConfig.xml中加载mapper.xml
- <mapper class="cn.mybatis.mapper.UserMapper"/>
4.3.5 测试
- public class UserMapperTest {
- private SqlSessionFactory sqlSessionFactory;
- // 此方法是在执行testFindUserById之前执行
- @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 {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用userMapper的方法
User user = userMapper.findUserById(1);
System.out.println(user);
}
4.3.6 一些问题总结
4.3.6.1 代理对象内部调用selectOne或selectList
如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。
如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。
4.3.6.2 mapper接口方法参数只能有一个是否影响系统 开发
mapper接口方法参数只能有一个,系统是否不利于扩展维护。
系统 框架中,dao层的代码是被业务层公用的。
即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。
注意:持久层方法的参数可以包装类型、map。。。,service方法中建议不要使用包装类型(不利于业务层的可扩展)。
mybatis学习记录二——mybatis开发dao的方法的更多相关文章
- MyBatis 学习记录5 MyBatis的二级缓存
主题 之前学习了一下MyBatis的一级缓存,主要涉及到BaseExecutor这个类. 现在准备学习记录下MyBatis二级缓存. 配置二级缓存与初始化发生的事情 首先二级缓存默认是不开启的,需要自 ...
- MyBatis 学习记录4 MyBatis的一级缓存
主题 分享记录一下MyBatis的一级缓存相关的学习. Demo public static void firstLevelCache() { init("mybatis-config.xm ...
- Mybatis学习笔记(二) —— mybatis入门程序
一.mybatis下载 mybaits的代码由github.com管理,下载地址:https://github.com/mybatis/mybatis-3/releases 下载完后的目录结构: 二. ...
- MyBatis学习笔记二:MyBatis生产中使用环境搭建
这里是在上一个环境的基础上修改的,这里就不在给出所有的配置,只给出哪里修改的配置 1.修改POJO对象为注解方式 2.创建Dao层接口 package com.orange.dao; import c ...
- MyBatis学习--mybatis开发dao的方法
简介 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. 主要概念介绍: MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFac ...
- mybatis学习第(二)天
Mybatis第二天 高级映射 查询缓存 关于与spring的整合和反转工程我偷懒了,下次看. 使用的sql: CREATE TABLE USER( id INT PRIMARY KEY A ...
- MyBatis学习(二)
mybatis开发dao的方法 作用范围 SqlSessionFactoryBuilder是以工具类方式来使用,需要创建sqlSessionFactory就new一个SqlSessionFactory ...
- MyBatis学习系列二——增删改查
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作(转载)
本文转载自:http://www.cnblogs.com/jpf-java/p/6013540.html 上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybati ...
随机推荐
- 使用urllib和http.cookiejar获取python老男孩学员成绩
打开http://crm.oldboyedu.com/crm/grade/single/ 鼠标右键查看源代码,可以看到我们需要post的name.如下: 这里需要在post试提交token和searc ...
- TOJ 1883 Domino Effect
Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...
- 使用openssl在命令行加密
对于需要在应用软件中进行加密编程的开发者,通过命令行把基本的加密操作做一遍是很有意义的.openssl支持在命令行进行各种基本加密算法的操作.这些操作过程无需编程,其命令参数与程序函数调用加密的参数有 ...
- D3(v5) in TypeScript 坐标轴之 scaleBand用法
在学习d3时候,发现在TS中实现D3的坐标轴中遇到一些错误,而这些错误却不会存在于js(因为ts的类型检查)写法中,因此做下笔记: import * as d3 from 'd3';import * ...
- [转] 微信小程序 页面跳转 传递参数
本文转自:http://blog.csdn.net/qq_31383345/article/details/52795212 微信小程序的页面跳转,页面之间传递参数笔记. CSDN微信小程序开发专栏, ...
- ICONIX
- c#-foreach的秘密
foreach的秘密 class Program { static void Main(string[] args) { //创建Person的对象 Person p1=new Person(); / ...
- SQL Server与Oracle有什么区别?
1.可操作平台上: Oracle可在所有主流平台上运行,Oracle数据库采用开放的策略目标,它使得客户可以选择一种最适合他们特定需要的解决方案.客户可以利用很多种第三方应用程序.工具.而SQL Se ...
- Java ConcurrentHashMap初始化
初始化ConcurrentHashMap时可以指定map大小,由于ConcurrentHashMap代码默认大小是2n,这里需要把用户填的大小转换成2n备注:代码基于jdk 1.8.0_91Concu ...
- mysql五补充:SQL逻辑查询语句执行顺序(待完善)
一.SELECT语句关键字的定义顺序(语法顺序) SELECT DISTINCT <select_list> FROM <left_table> <join_type&g ...