D37-Mybatis(02)

目标: 利用Mybatis实现增删改查
Mybatis官方文档: http://www.mybatis.org/mybatis-3/zh/index.html

一、动态代理方式—proxy

1.1 编写核心配置文件–SqlMapConfig.xml

 
    <mappers>
        <mapper resource="UserMapper.xml">mapper>
    mappers>

1.2 接口 UserDao

这里定义所有实现增删改查的方法。

1.3 编写 XxxMap.xml 文件

  • 此为映射文件, 需要在这个文件中编写sql的增删改查。
    • 命名空间:命名空间的值为dao层接口的全限定名。
  • id:id的值为dao层接口内的方法名称。
<mapper  namespace="">

mapper>

1.4 测试类–TestMybatis

  • 解析核心配置文件-- SqlMapConfig.xml
  • 实现接口UserDao中的方法
private SqlSessionFactory sessionFactory;
@Before
    public void init() throws IOException {
        //创建 SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //解析核心配置文件
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
        sessionFactory = sqlSessionFactoryBuilder.build(is);
    }
      SqlSession sqlSession = sessionFactory.openSession();
        //创建dap接口的实现类
        UserDao dao = sqlSession.getMapper(UserDao.class);

1.5 查询–select

1.5.1 UserMapper.xml文件中编写sql语句

  • resultType: 设置返回值的类型(与UserDao接口中的方法对应)
  • pojo对象(java对象): 全限定名

查询表中的所有数据

<--查询表中的所有数据-->

<select id="findAll" resultType="com.domain.User">
        SELECT * FROM  USER ;
    select>

根据id查询用户信息


<select id="findUserById" parameterType="int" resultType="com.domain.User">
            SELECT * from user WHERE id = #{id} ;
        select>

模糊查询

  • 拼接符:${}
    • pojo对象(java对象):#{pojo对象中的属性名}
    • 基本数据类型和String:
      • ${value} - value为固定值
<select id="findUserByName" parameterType="com.domain.User" 
							resultType="com.domain.User">
        SELECT * FROM USER  WHERE  username LIKE  '%${username}%' ;
    select>

1.5.2 测试类–TestMybatis

  • 创建 SqlSessionFactoryBuilder
  • 解析核心配置文件
 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //解析核心配置文件
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
       SqlSessionFactory   sessionFactory = sqlSessionFactoryBuilder.build(is);
    SqlSession sqlSession = sessionFactory.openSession();
        //创建dap接口的实现
    UserDao dao = sqlSession.getMapper(UserDao.class);    
  • 查询所有用户信息
 //调用方法
        List<User> list=dao.findAll();
        for (User user : list) {
            System.out.println(user);
        }
  • 根据id查询用户信息
 //调用方法
        User userById = dao.findUserById(13);
        //提交事务
        sqlSession.commit();
        sqlSession.close();
        System.out.println(userById);
  • 模糊查询
 //调用方法
        User user = new User();
        user.setUsername("王");
        List userByName = dao.findUserByName(user);
        //提交事务
        sqlSession.commit();
        sqlSession.close();
        System.out.println(userByName);

1.6 添加用户–insert

1.6.1 UserMapper.xml

  • parameterType:请求参数的类型
  • ognl表达式
    • 占位符:#{}
      • pojo对象(java对象):#{pojo对象中的属性名}
  • keyProperty:将返回值赋值给实体中id属性
  • 添加完信息后,返回添加的id
    • useGeneratedKeys: 获得最新生成的id(设置为true)
<insert id="addUser" parameterType="com.domain.User" keyProperty="id" useGeneratedKeys="true">
        insert into user (username,sex,birthday,address)
        values (#{username},#{sex},#{birthday},#{address}) ;
    insert>

1.6.2 测试类

  • 创建 SqlSessionFactoryBuilder
  • 解析核心配置文件
 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //解析核心配置文件
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
          sessionFactory = sqlSessionFactoryBuilder.build(is);
    SqlSession sqlSession = sessionFactory.openSession();
        //创建dap接口的实现
    UserDao dao = sqlSession.getMapper(UserDao.class);    

因为上面的语句每次都会使用,所以将他们提取出来,到 1.4 中,下面的语句不再写。

  • 方法testaddUser()实现添加
//调用方法
        User user= new User();
        user.setUsername("Saber");
        user.setSex("女");
        user.setBirthday(new Date());
        user.setAddress("英灵之战");
        //将信息封装到user实体中
        dao.addUser(user);

        //提交事务
        sqlSession.commit();
        sqlSession.close();
        System.out.println("最新添加的id:"+user.getId());
    }
  • 注意:

    • 提交事务 注掉,会出现下面这种状况,控制台显示添加成功
      在这里插入图片描述
    • 但数据库却没有添加成功
      D37-Mybatis(02)_第1张图片

1.7更新用户信息-update

1.7.1 xml文件

<update id="updateUser" parameterType="com.domain.User">
        UPDATE user set sex = #{sex} WHERE  id = #{id};
    update>

1.7.2 测试类

  • testupdateUser()方法
 //调用方法
        User user = new User();
        user.setSex("女");
        user.setId(11);
        int count = dao.updateUser(user);
        //提交事务
        sqlSession.commit();
        sqlSession.close();
        System.out.println("影响了:"+count);

1.8 删除–delete

1.8.1 xml文件

  • parameterType:请求参数的类型
    • pojo对象(java对象):全限定名
      • 基本数据类型和string:包装类的全限定名或基本类型(不区分大小写)
<delete id="deleteUser" parameterType="com.domain.User">
        DELETE FROM USER WHERE  id= #{id};
    delete>

ps:可以将com.domain.User改成int

1.8.2 测试

  • 调用testfindUserById()方法
//调用方法
        User userById = dao.findUserById(13);
        //提交事务
        sqlSession.commit();
        sqlSession.close();
        System.out.println(userById);

二、用传统方式实现增删改查

2.1 UserMapper.xml

与上面的一样。

2.2 修改位置–UserDaoImpl,java

在dao层,新建UserDaoImpl.java 文件,实现User接口中的方法。

  • 提取所有方法的共同点
 private SqlSessionFactory sqlSessionFactory;
    public UserDaoImpl(SqlSessionFactory factory){
        this.sqlSessionFactory=factory;
    }

//参数1:请求标识 namespace
//参数2:请求时的参数信息 (接口UserDao中的方法参数)

2.2.1 查询

查询所有用户信息

public List<User> findAll() {
        //完成查询的所有信息,并将查询结果返回
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //调用框架提供的方法完成查询所有用户信息
        //参数1:请求标识  namespace
        //参数2:请求时的参数信息
        List<User> list = sqlSession.selectList("UserDaoImpl.findAll");
        sqlSession.commit();
        sqlSession.close();
        return list;
    }

查找指定id

  • findUserById()方法
 SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession.selectOne("UserDaoImpl.findUserById", id);

模糊查询

SqlSession sqlSession = sqlSessionFactory.openSession();
 return sqlSession.selectList("UserDaoImpl.findUserByName", user);

2.2.2 添加用户信息

sqlSession.insert("UserDaoImpl.addUser",user);

2.2.3 更新用户信息

SqlSession sqlSession = sqlSessionFactory.openSession();
int update = sqlSession.update("UserDaoImpl.updateUser",user);
事务提交
  return update;

2.2.4 删除指定id

 SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.delete("UserDaoImpl.deleteUser",id);
  事务提交

2.3 测试类

与动态代理的测试类差不多,只是略有不同而已。

 private SqlSessionFactory sessionFactory;
@Before
    public void init() throws IOException {
        //创建SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //解析核心配置文件
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
        sessionFactory = sqlSessionFactoryBuilder.build(is);
    }
  • 以查询所有用户信息为例
  UserDaoImpl userDao = new UserDaoImpl(sessionFactory);
        //调用方法
        List<User> list=userDao.findAll();
        for (User user : list) {
            System.out.println(user);
        }

只需要实现UserDaoImpl对象,并将sessionFactory传入即可。

四、Sql映射文件的参数深入

4.1 parameterType

  • 配置请求参数:
    • Pojo对象:对象的全限定类名
      基本数据类型或String:包装类型的全限定类名|基本数据类型名称,不区分大小写(int)

4.2 resultType

  • 描述返回值类型:
    • Pojo对象:对象的全限定类名
    • 基本数据类型或String :包装类型的全限定类名 | 基本数据类型的名称(int)

4.3 resultMap配置映射关系

  • id:唯一标识
  • type: 封装对象的 全限定类名
<resultMap id="userResultMap" type="cn.domain.User">
		<id property="对象中的属性" column="字段名称">
		<result property=”对象中的属性” column=”字段名称”>
resultMap>

4.3 核心配置文件的配置方式

4.3.1 properties

  • 引入外部的properties配置文件
    • Resouce:properties文件的路径(相对路径)
  • 使用properties文件中的内容
    • ${properties文件中的key}

4.3.2 typeAliases

  • < typeAlias > 设置别名
    • Type:实体类的全限定名
    • Alias:别名
  • < package>: 统一对包下所有的实体类设置别名
    • Name:包名
    • 别名:当前类名(不区分大小写)

4.4 Mappers:

  • 引入sql映射文件
  • < mapper>: 引入sql映射文件
    • Resource:sql映射文件的路径
  • Class:dao接口的全限定类名(约定sql映射文件的位置和命名)
  • < package> : 统一引入包下的所有映射文件
    • Name:包名
<mappers>
        
        
        
        
        
        <package name="com.dao">package>
    mappers>

你可能感兴趣的:(框架,事务提交,resultMap,动态代理的方式,传统方式)