Mybatis Dao开发方式详解

Mybatis-Dao开发详解

1 Dao需求

1.1 根据用户ID查询用户信息

1.2 根据用户名查找用户列表

1.3 添加用户

2 原始Dao开发方法

2.1使用原有的user映射文件user.xml,不需修改(接上文Mybatis入门详解中,从中复制即可)

2.2 新建一个UserDao接口

在这里插入图片描述

package com.lpp.mybatis.dao;

import com.lpp.mybatis.pojo.User;

import java.util.List;

public interface UserDao {
//
    /**
    * @Description: 根据用户ID查询用户信息
    * @Param:  ID
    * @return:
    * @Author: LPP
    * @Date:2020/2/16
    */

    User getUserById(Integer id);

    /**
    * @Description:  根据用户名查找用户列表
    * @Param:username
    * @return:
    * @Author: LPP
    * @Date:2020/2/16
    */
    List<User> getUserByUserName(String username);

    /**
    * @Description:添加用户
    * @Param:
    * @return:
    * @Author: LPP
    * @Date:2020/2/16
    */
    void insertUser(User user);
}

2.3 新建一个UserDaoImpl接口实现类

在这里插入图片描述

package com.lpp.mybatis.dao.impl;

import com.lpp.mybatis.dao.UserDao;
import com.lpp.mybatis.pojo.User;
import com.lpp.mybatis.utils.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;

import java.util.List;

public class UserDaoImpl implements UserDao {


    @Override
    public User getUserById(Integer id) {
        SqlSession sqlSession= SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
        User user=sqlSession.selectOne("User.getUserById",id);
        sqlSession.close();
        return user;
    }

    @Override
    public List<User> getUserByUserName(String username) {
        SqlSession sqlSession=SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
        List<User> list=sqlSession.selectList("getUserByUserName",username);
       sqlSession.close();
        return list;
    }

    @Override
    public void insertUser(User user) {
        SqlSession sqlSession=SqlSessionFactoryUtils.getSqlSessionFactory().openSession(true);
        sqlSession.insert("User.insertUser",user);
        sqlSession.close();
    }
}

2.4 使用dao测试

打开UserDao,光标放到UserDao上,Ctrl+shift+T出现如下图点击第二个
在这里插入图片描述
我们把测试放到com.lpp.mybatis.test包下,下面三个全选,OK即可
在这里插入图片描述
在这里插入图片描述
UserDaoTest.java

package com.lpp.mybatis.test;

import com.lpp.mybatis.dao.UserDao;
import com.lpp.mybatis.dao.impl.UserDaoImpl;
import com.lpp.mybatis.pojo.User;

import java.util.Date;
import java.util.List;

class UserDaoTest {

    @org.junit.jupiter.api.Test
    void getUserById() {
        UserDao userDao=new UserDaoImpl();
        User user=userDao.getUserById(33);
        System.out.println(user);
    }

    @org.junit.jupiter.api.Test
    void getUserByUserName() {
        UserDao userDao=new UserDaoImpl();
        List<User> list=userDao.getUserByUserName("%张%");

        for(User user : list){
            System.out.println(user.toString());
        }
    }

    @org.junit.jupiter.api.Test
    void insertUser() {
        UserDao userDao=new UserDaoImpl();
        User user=new User();
        user.setUsername("魏无羡");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setAddress("上海");
        userDao.insertUser(user);
    }
}

测试一下第一个功能:根据用户ID查询用户信息

结果如下:
在这里插入图片描述

3 接口动态管理

3.1动态代理dao开发规则

1.namespace命名必须是接口的全路径名
2.接口的方法名必须与映射文件的sql id一致
3.接口的输入参数必须与映射文件的parameterType类型一致
4.接口的返回类型必须与映射文件的resultType类型一致

3.2动态代理dao开发步骤

1.创建UserMapper.xml映射文件

<?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">
        <!--namespace命名空间,用于隔离sql语句,后面有重要作用
                -->
<!--动态代理的开发规则:
        1、namespace必须是全路径名
        2、接口的方法必须与sql id一致
        3、接口的参数与parameterType一致
        4、接口的返回值必须与resultType一致-->

<mapper namespace="com.lpp.mybatis.mapper.UserMapper">

    <select id="getUserById" parameterType="int" resultType="uSER">
    SELECT id,username,birthday,sex,address FROM user where id=#{id};
</select>

    <!--如果返回结果为集合:只需设置为每一个的数据类型-->
    <select id="getUserByUserName" parameterType="String" resultType="com.lpp.mybatis.pojo.User">
        SELECT id,username,birthday,sex,address  FROM user WHERE username LIKE #{name};
    </select>
    <!--  插入用户-->
    <!-- useGeneratedKeys:使用自增,keyProperty与之配套使用,这里是user的主键-->
    <insert id="insertUser" parameterType="com.lpp.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id">
        insert into user(username,birthday,sex,address)values ( #{username},#{birthday},#{sex},#{address});
    </insert>

    <!--更新用户-->
    <update id="updateUser" parameterType="com.lpp.mybatis.pojo.User">
        update user set username =#{username} where id=#{id};
    </update>

   <!-- 删除用户-->
    <delete id="deleteUser" parameterType="int">
        delete from user where id=#{id}
</delete>

</mapper>

2.创建UserMapper接口

package com.lpp.mybatis.mapper;

import com.lpp.mybatis.pojo.User;

import java.util.List;

public interface UserMapper {
//
    /**
    * @Description: 根据用户ID查询用户信息
    * @Param:  ID
    * @return:
    * @Author: LPP
    * @Date:2020/2/16
    */

    User getUserById(Integer id);

    /**
    * @Description:  根据用户名查找用户列表
    * @Param:username
    * @return:
    * @Author: LPP
    * @Date:
    */
    List<User> getUserByUserName(String username);

    /**
    * @Description:添加用户
    * @Param:
    * @return:
    * @Author: LPP
    * @Date:
    */
    void insertUser(User user);



}

3.加载UserMapper.xml两种方法,在SqlMapConfig.xml中添加
方法1:如下图

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

方法2:

<!--    加载映射文件-->
    <mappers>
     <!--映射文件包扫描:推荐
            1.接口文件必须和映射文件同一目录下
            2.接口文件名称必须和映射文件名称一致-->
        <package name="com.lpp.mybatis.mapper"/>
    </mappers>

在这里插入图片描述
SqlMapConfig.xml内容(Mybatis入门详解中也有,这里再写一遍)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--环境配置-->
    <!-- 加载规则,首先加载标签内部属性,再加载外部文件,名称相同时,会替换相同名称的内容 -->
    <properties resource="jdbc.properties">
      <property name="jdbc.username" value="root"/>
        <property name="jdbc.password" value="root"/>
    </properties>

   //这里是新添加的
    <typeAliases>
<!-- 单个定义别名,不区分大小写-->
<!--        <typeAlias type="User" alias="user"/>-->
<!--       别名包扫描器,别名是类的全称,不区分大小写,推荐方式-->
        <package name="com.lpp.mybatis.pojo"/>
    </typeAliases>


    <!--默认环境-->
    <environments default="development">
        <!--mysql环境-->
        <environment id="development">
            <!--JDBC事务-->
            <!-- 使用JDBC管理事务-->
            <transactionManager type="JDBC"/>
            <!--POOLED连接池-->
            <!--数据库连接池 -->
            <dataSource type="POOLED">
                <!--四大参数-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_01?characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

<!--    加载映射文件-->
    <mappers>
        <mapper resource="user.xml"/>
        <!--<mapper resource="UserMapper.xml"/>-->
        <!-- 映射文件,class扫描器
            1.接口文件必须和映射文件同一目录下
            2.接口文件名必须和映射文件的名称一致-->
        <!--<mapper class="UserMapper"/>-->
		<!--映射文件包扫描:推荐
            1.接口文件必须和映射文件同一目录下
            2.接口文件名称必须和映射文件名称一致-->
        <package name="com.lpp.mybatis.mapper"/>
    </mappers>
</configuration>

3.3 测试动态代理dao(操作方法同上测试方法)

在这里插入图片描述
UserMapperTest中代码

package com.lpp.mybatis.test;

import com.lpp.mybatis.mapper.UserMapper;
import com.lpp.mybatis.pojo.User;
import com.lpp.mybatis.utils.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;

import java.util.Date;
import java.util.List;

class UserMapperTest {

    @Test
    void getUserById() {
        SqlSession sqlSession= SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
        //获取接口的代理实现类
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        User user=userMapper.getUserById(24);
        System.out.println(user);
        sqlSession.close();
    }

    @Test
    void getUserByUserName() {
        SqlSession sqlSession=SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        List<User> list=userMapper.getUserByUserName("%魏%");
        for(User user:list){
            System.out.println(user);
        }
        sqlSession.close();
    }

    @Test
    void insertUser() {
        SqlSession sqlSession=SqlSessionFactoryUtils.getSqlSessionFactory().openSession(true);
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        User user=new User();
        user.setUsername("蓝忘机");
        user.setSex("男");
        user.setBirthday(new Date());
        user.setAddress("浙江");
        userMapper.insertUser(user);
        sqlSession.close();
    }
}

我这里测试一下第三个功能:
在这里插入图片描述
在这里插入图片描述
测试成功!

发布了8 篇原创文章 · 获赞 13 · 访问量 230

猜你喜欢

转载自blog.csdn.net/weixin_44228113/article/details/104348383