mybatis是一个支持普通SQL查询,存储过程和高级映射的优秀的持久层的框架,是apache下的顶级项目。mybatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。mybatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。

其中,开发dao有两种方法,一种原始的dao开发方法,程序员需要写dao接口和dao实现类。另一种是mapper代理方法,程序员只需要写mapper接口相当于dao接口。

原始dao开发方法

1.编写dao接口(UserDao)

  1. public interface UserDao {
  2. // 根据id查询用户信息
  3. public User findUserById(int id) throws Exception;
  4. }

2.编写dao实现类

  1. public class UserDaoImpl implements UserDao {
  2. // 需要向dao实现类中注入SqlSessionFactory
  3. // 这里通过构造方法注入
  4. private SqlSessionFactory sqlSessionFactory;
  5. public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
  6. this.sqlSessionFactory = sqlSessionFactory;
  7. }
  8. @Override
  9. public User findUserById(int id) throws Exception {
  10. SqlSession sqlSession = sqlSessionFactory.openSession();
  11. //这里的test.findUserById是与下面的映射文件user.xml中的namespace+id有关。
  12. User user = sqlSession.selectOne("test.findUserById", id);
  13. // 释放资源
  14. sqlSession.close();
  15. return user;
  16. }
  17. }

3.编写映射文件(user.xml)

  1. <mapper namespace="test">
  2. <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
  3. SELECT * FROM USER WHERE id=#{value}
  4. </select>
  5. </mapper>

4.编写测试类

  1. public class UserDaoImplTest {
  2. private SqlSessionFactory sqlSessionFactory;
  3. // 此方法是在执行testFindUserById之前执行
  4. @Before
  5. public void setUp() throws Exception {
  6. // 创建sqlSessionFactory
  7. // mybatis配置文件
  8. String resource = "SqlMapConfig.xml";
  9. // 得到配置文件流
  10. InputStream inputStream = Resources.getResourceAsStream(resource);
  11. // 创建会话工厂,传入mybatis的配置文件信息
  12. sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  13. }
  14. @Test
  15. public void testUserDaoImpl() throws Exception{
  16. // 创建UserDao的对象
  17. UserDao userDao = new UserDaoImpl(sqlSessionFactory);
  18. // 调用UserDao的方法
  19. User user = userDao.findUserById(1);
  20. System.out.println(user);
  21. }
  22. }

测试结果:

mapper代理方法

1.编写mapper.java(UserMapper.java相当于java接口)

  1. public interface UserMapper {
  2. // 根据id查询用户信息
  3. public User findUserById(int id) throws Exception;
  4. }

2.编写mapper.xml(UserMapper.xml)

  1. <mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
  2. <!--通过id查询用户表的记录 -->
  3. <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
  4. SELECT * FROM USER WHERE id=#{value}
  5. </select>
  6. </mapper>

注意:

(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指定的类型一致。

3.编写测试类

  1. public class UserMapperTest {
  2. private SqlSessionFactory sqlSessionFactory;
  3. // 此方法是在执行testFindUserById之前执行
  4. @Before
  5. public void setUp() throws Exception {
  6. // 创建sqlSessionFactory
  7. // mybatis配置文件
  8. String resource = "SqlMapConfig.xml";
  9. // 得到配置文件流
  10. InputStream inputStream = Resources.getResourceAsStream(resource);
  11. // 创建会话工厂,传入mybatis的配置文件信息
  12. sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  13. }
  14. @Test
  15. public void testFindUserById() throws Exception {
  16. SqlSession sqlSession=sqlSessionFactory.openSession();
  17. //创建UserMapper对象,mybatis自动生成mapper代理对象
  18. UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
  19. //调用UserMapper的方法
  20. User user=userMapper.findUserById(1);
  21. System.out.println(user);
  22. sqlSession.close();
  23. }
  24. }

测试结果:

现在最常用的方法是第二种使用mapper代理的方法,不过第一种也有公司在用所以两种都要知道。

【mybatis基础】mybatis开发dao两种方法的更多相关文章

  1. MyBatis无限级分类实现的两种方法--自关联与map集合

    1.这回先创建数据库吧 下表cid是CategoryId的缩写,cname是CategoryName的缩写,pid是parentId的缩写 无限级分类一般都包含这三个属性,至少也要包含cid和pid才 ...

  2. Java 基础,小数百分比两种方法

    public static void main(String[] args) { System.out.println(getPercent(1, 2)); } public static Strin ...

  3. mybatis 根据id批量删除的两种方法

    原文:https://blog.csdn.net/qq_40010745/article/details/81032218 mybatis 根据id批量删除的两种方法   第一种,直接传递给mappe ...

  4. 设置Mybatis打印调试sql的两种方式

    http://blog.csdn.net/gao36951/article/details/53641432 ********************************************* ...

  5. mybatis中批量插入的两种方式(高效插入)

    MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用 ...

  6. C# Windows Phone 8 WP8 开发,取得手机萤幕大小两种方法。

    原文:C# Windows Phone 8 WP8 开发,取得手机萤幕大小两种方法. 一般我们在开发Windows Phone App时,需要取得萤幕的大小来自定义最佳化控制项的大小,但是开如何取得萤 ...

  7. Hadoop基础-HDFS递归列出文件系统-FileStatus与listFiles两种方法

    Hadoop基础-HDFS递归列出文件系统-FileStatus与listFiles两种方法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. fs.listFiles方法,返回Loc ...

  8. 【java基础 13】两种方法判断hashmap中是否形成环形链表

    导读:额,我介绍的这两种方法,有点蠢啊,小打小闹的那种,后来我查了查资料,别人都起了好高大上的名字,不过,本篇博客,我还是用何下下的风格来写.两种方法,一种是丢手绢法,另外一种,是迷路法. 这两种方法 ...

  9. Hive开发中使用变量的两种方法

    在使用hive开发数据分析代码时,经常会遇到需要改变运行参数的情况,比如select语句中对日期字段值的设定,可能不同时间想要看不同日期的数据,这就需要能动态改变日期的值.如果开发量较大.参数多的话, ...

随机推荐

  1. leetcode1007

    public class Solution { public int MinDominoRotations(int[] A, int[] B) { var na = A.Length; var nb ...

  2. [记录] Mysql 复制表格结构

    有时候我们需要原封不动的复制一张表的表结构来生成一张新表,MYSQL提供了两种便捷的方法 一.LIKE方法 like方法能一模一样的将一个表的结果复制生成一个新表,包括复制表的备注.索引.主键外键.存 ...

  3. visio交叉线不凸起

    使用visio作图时,经常会遇到交叉线在相交时会形成一个弯曲弓形,这有时十分影响视图效果.可以采用下面的方法消除弓形. 1.visio2003:只需要选中该交叉线,选择“格式”->“行为”,在打 ...

  4. Centos6与Centos7防火墙设置与端口开放的方法

    Centos升级到7之后,内置的防火墙已经从iptables变成了firewalld.所以,端口的开启还是要从两种情况来说明的,即iptables和firewalld.更多关于CentOs防火墙的最新 ...

  5. NSTimer内存泄漏

    用NSTimer调用 timer = [NSTimer scheduledTimerWithTimeInterval:timerInterval target:self selector:@selec ...

  6. nodejs 解决跨域

    1.失败 app.all('*', function (req, res, next) { res.header("Access-Control-Allow-Origin", &q ...

  7. 尚硅谷springboot学习4-helloworld探究

    1.POM文件 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spr ...

  8. PHP使用redis防止大并发下二次写入(如如何防止重复下订单)

    php调用redis进去读写操作,大并发下会出现:读取key1,没有内容则写入内容,但是大并发下会出现同时多个php进程写入的情况,这个时候需要加一个锁,即获取锁的php进程有权限写. $lock_k ...

  9. Haskell语言学习笔记(90)Default

    安装 data-default-class $ cabal install data-default-class Installed data-default-class-0.1.2.0 Prelud ...

  10. week05 06绑定滚动条 去抖动

    像这种小代码 为了满足某种需求 可以直接上网搜 这些都是JS代码和react无关 我们下拉 就会触发事件从而调用loading more news 那个函数 react要求我们加个key key就是唯 ...