Mybaits深入了解(三)----mybatis开发Dao的方法
2016-07-11 23:49
501 查看
原始dao开发方法
dao的接口
dao的实现类
测试程序
原始dao开发问题
Mapper代理方法
Mapperxml映射文件
Mapperjava接口文档
加载UserMapperxml文件
测试
调用SqlSession方法时,将statement的Id硬编码了,每个方法中都需要写statement Id,如果名称发生变化,不利于修改。
调用SqlSession方法时,由于sqlSession的方法(selectOne,selectList…)使用泛型,即使传入的变量类型错误,在编译阶段也不报错。不利于开发。
Mapper接口开发需要遵循以下规范:
1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
以上的规范主要是对下边的代码进行统一生成:
接口的定义有如下特点:
Mapper接口方法名和Mapper.xml中定义的statement的id相同
Mapper接口方法的输入参数类型和mapper.xml中定义的statement的parameterType的类型相同
Mapper接口方法的输出参数类型和mapper.xml中定义的statement的resultType的类型相同
dao的接口
dao的实现类
测试程序
原始dao开发问题
Mapper代理方法
Mapperxml映射文件
Mapperjava接口文档
加载UserMapperxml文件
测试
原始dao开发方法
程序员写代码的时候,需要写dao接口和
dao实现类。而且还需要向dao实现类中注入
SqlSessionFactory,在方法体内通过
SqlSessionFactory创建
SqlSession。下面举个栗子:
dao的接口
package cn.itcast.mybatis.dao; import java.util.List; import cn.itcast.mybatis.po.User; /** * dao接口,用户管理 * @author Administrator * */ 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; }
dao的实现类
package cn.itcast.mybatis.dao; /** * dao接口实现类 */ import java.util.Date; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import cn.itcast.mybatis.mapper.UserMapper; import cn.itcast.mybatis.po.User; public class UserDaoImpl implements UserDao { //需要向dao实现类中注入SqlSessionFactory //这里通过构造方法注入 private SqlSessionFactory sqlSessionFactory; public UserDaoImpl(SqlSessionFactory sqlSessionFactory){ this.sqlSessionFactory=sqlSessionFactory; } public User findUserById(int id) throws Exception { SqlSession sqlSession=sqlSessionFactory.openSession(); User user=sqlSession.selectOne("test.findUserById",id); sqlSession.close(); return user; } public List<User> findUserByName(String name) throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); List<User> list=sqlSession.selectList("test.findUserByName",name); sqlSession.close(); return list; } public void insertUser(User user) throws Exception { SqlSession sqlSession=sqlSessionFactory.openSession(); sqlSession.insert("test.insertUser",user); //提交事务 sqlSession.commit(); sqlSession.close(); } public void deleteUser(int id) throws Exception { SqlSession sqlSession=sqlSessionFactory.openSession(); sqlSession.insert("test.deleteUser",id); //提交事务 sqlSession.commit(); sqlSession.close(); } }
测试程序
package cn.itcast.mybatis.dao; import static org.junit.Assert.*; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test; import cn.itcast.mybatis.po.User; public class UserDaoImplTest { private SqlSessionFactory sqlSessionFactory; @Before public void setUp() throws Exception { //配置文件 String resource="SqlMapConfig.xml"; //得到配置文件流 InputStream inputStream=Resources.getResourceAsStream(resource); // 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactory 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); } }
原始dao开发问题
在dao的接口实现类中出现大量的模板方法,比如上面的例子中每个方法中都有opensession,closesession的方法。调用SqlSession方法时,将statement的Id硬编码了,每个方法中都需要写statement Id,如果名称发生变化,不利于修改。
调用SqlSession方法时,由于sqlSession的方法(selectOne,selectList…)使用泛型,即使传入的变量类型错误,在编译阶段也不报错。不利于开发。
Mapper代理方法
Mapper接口开发方法只需要开发Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体,同上边Dao接口实现类方法。Mapper接口开发需要遵循以下规范:
1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
以上的规范主要是对下边的代码进行统一生成:
User user = sqlSession.selectOne("test.findUserById", id); sqlSession.insert("test.insertUser", user);
Mapper.xml(映射文件)
定义mapper映射文件
UserMapper.xml(内容同Users.xml),需要修改
namespace的值为
UserMapper接口路径。将
UserMapper.xml放在
classpath下
mapper目录 下。
<?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"> <mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
Mapper.java(接口文档)
/** * 用户管理mapper */ Public interface UserMapper { //根据用户id查询用户信息 public User findUserById(int id) throws Exception; //查询用户列表 public List<User> findUserByUsername(String username) throws Exception; //添加用户信息 public void insertUser(User user)throws Exception; }
接口的定义有如下特点:
Mapper接口方法名和Mapper.xml中定义的statement的id相同
Mapper接口方法的输入参数类型和mapper.xml中定义的statement的parameterType的类型相同
Mapper接口方法的输出参数类型和mapper.xml中定义的statement的resultType的类型相同
加载UserMapper.xml文件
修改SqlMapConfig.xml文件:<!-- 加载映射文件 --> <mappers> <mapper resource="mapper/UserMapper.xml"/> </mappers>
测试
Public class UserMapperTest extends TestCase { private SqlSessionFactory sqlSessionFactory; protected void setUp() throws Exception { //mybatis配置文件 String resource = "sqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //使用SqlSessionFactoryBuilder创建sessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } Public void testFindUserById() throws Exception { //获取session SqlSession session = sqlSessionFactory.openSession(); //获取mapper接口的代理对象 UserMapper userMapper = session.getMapper(UserMapper.class); //调用代理对象方法 User user = userMapper.findUserById(1); System.out.println(user); //关闭session session.close(); } @Test public void testFindUserByUsername() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> list = userMapper.findUserByUsername("张"); System.out.println(list.size()); } Public void testInsertUser() throws Exception { //获取session SqlSession session = sqlSessionFactory.openSession(); //获取mapper接口的代理对象 UserMapper userMapper = session.getMapper(UserMapper.class); //要添加的数据 User user = new User(); user.setUsername("张三"); user.setBirthday(new Date()); user.setSex("1"); user.setAddress("北京市"); //通过mapper接口添加用户 userMapper.insertUser(user); //提交 session.commit(); //关闭session session.close(); } }
相关文章推荐
- Mybatis传递多个参数的解决办法(三种)
- 获取Java的MyBatis框架项目中的SqlSession的方法
- Mybatis逆工程jar包的修改和打包
- 深入浅析mybatis oracle BLOB类型字段保存与读取
- MyBatis MapperProvider MessageFormat拼接批量SQL语句执行报错的原因分析及解决办法
- MyBatis启动时控制台无限输出日志的原因及解决办法
- 详解Java的MyBatis框架和Spring框架的整合运用
- Java的MyBatis框架项目搭建与hellow world示例
- SpringMVC整合mybatis实例代码
- Java实现mybatis批量插入数据到Oracle
- oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
- MyBatis学习笔记(二)之关联关系
- 浅析Mybatis 在CS程序中的应用
- Java Mybatis框架入门基础教程
- Windows下Java+MyBatis框架+MySQL的开发环境搭建教程
- Mybatis与Ibatis的区别
- Mybatis控制台打印Sql语句的实现代码
- Mybatis传递多个参数进行SQL查询的用法
- MyBatis学习教程(二)―如何使用MyBatis对users表执行CRUD操作
- Java+MyBatis+MySQL开发环境搭建流程详解