Mybatis --06.mybatis动态代理Dao接口实现CRUD操作

版权声明:转载请注明原始链接 https://blog.csdn.net/sswqzx/article/details/83755565

使用mybatis动态代理Dao实现CRUD操作要求:

1、持久层接口(UserDao)和持久层接口的映射配置(UserDao.xml)必须在相同的包下 
2、持久层映射配置中mapper标签的namespace属性取值必须是持久层接口的全限定类名 
3、SQL语句的配置标签<select>,<insert>,<delete>,<update>的id属性必须和持久层接口的方法名相同。

1、创建动态代理Dao接口UserMapper

UserMapper.java

package com.sswblog.dao;
import com.sswblog.domain.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;

/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 19:55 2018/11/5
 */
public interface UserMapper {
    /**
     * 根据id查询用户
     *
     * @param id
     * @return
     */
    public User findUserById(Long id);

    /**
     * 查询所有用户
     *
     * @return
     */
    public List<User> findAllUsers();

    /**
     * 保存用户
     *
     * @param user
     */
    public void insertUser(User user);

    /**
     * 根据id删除用户
     *
     * @param id
     */
    public void deleteUser(Long id);

    /**
     * 更新用户
     *
     * @param user
     */
    public void updateUser(User user);

    /**
     * 登录
     * 使用动态代理,当接口中的某个方法有多个参数时,通过@Param注解指定参数名字
     * @param userName
     * @param password
     * @return
     */
    public User login(@Param("userName")String userName, @Param("password")String password);

}

2、创建映射文件UserMapper.xml(在核心配置文件中添加映射)

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">

<mapper namespace="com.sswblog.dao.UserMapper">

    <resultMap type="User" id="userMap" autoMapping="true">
        <id column="id" property="id"/>
        <result column="user_name" property="userName"></result>
    </resultMap>


    <select id="findUserById" resultMap="userMap">
        select <include refid="CommonSqlSpace.CommonSqlId"></include> from tb_user where id = #{id}
    </select>

    <select id="findAllUsers" resultType="User" resultMap="userMap">
        select <include refid="CommonSqlSpace.CommonSqlId"></include> from tb_user
    </select>

    <insert id="insertUser" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
        INSERT INTO tb_user (
        user_name,
        password,
        name,
        age,
        sex,
        birthday,
        created,
        updated
        )
        VALUES
        (
        #{userName},
        #{password},
        #{name},
        #{age},
        #{sex},
        #{birthday},
        NOW(),
        NOW()
        )
    </insert>

    <update id="updateUser">
        UPDATE tb_user set
        user_name = #{userName},
        password = #{password},
        name = #{name},
        age = #{age},
        sex = #{sex},
        birthday = #{birthday},
        updated = NOW()
        WHERE
        id = #{id}
    </update>

    <delete id="deleteUser">
        delete from tb_user where
        id = #{id}
    </delete>

    <!--
             此处需要接收多个参数,有三种方式:
            方式一:#{0}   #{1}
            方式二:#{param1}  #{param2}
            方式三:在接口方法的形参中加@Param注解指定名字,这里通过#{名字}来接收参数,如果只有
                   一个参数,#{名字}可以自定义

         -->
    <select id="login" resultType="User">
        select * from tb_user where user_name = #{userName} and password = #{password}
    </select>

</mapper>

注意:mapper中的nameSpace是持久层接口全限定名称

SQL语句的配置标签<select>,<insert>,<delete>,<update>的id属性必须和持久层接口的方法名相同

mybatis-config.xml

<?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"/>
    <!--开启驼峰、让实体类的属性和数据库中的键一一映射-->
    <!--<settings>-->
        <!--<setting name="mapUnderscoreToCamelCase" value="false"/>-->
    <!--</settings>-->
    <!--开启别名-->
    <typeAliases>
        <!--<typeAlias type="com.sswblog.domain.User" alias="User" />-->
        <package name="com.sswblog.domain"/>
    </typeAliases>
    <!--
        environments标签:用于配置多个环境(测试环境、生产环境)
            default属性:默认环境的id
        environment标签:配置一个具体的环境
            id属性:一个具体环境的id
        transactionManager标签:指定事务的类型
            type属性:可以取的值有:JDBC|MANAGED
                JDBC:表示从数据源获取数据库连接来提交或回滚事务
                MANAGED:表示把事务交给容器来管理,一般不用
        dataSource标签:配置数据源
            type属性:指定数据源类型,可以取的值有:UNPOOLED|POOLED|JNDI
                UNPOOLED:无连接池的数据源,每次都重新获取数据库连接,使用完后关闭连接
                POOLED:带连接池的数据源
                JNDI:使用JNDI数据源
    -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--指定驱动类名-->
                <property name="driver" value="${jdbc.driverClass}"/>
                <!-- 指定连接地址 -->
                <property name="url" value="${jdbc.url}"/>
                <!-- 指定用户名 -->
                <property name="username" value="${jdbc.username}"/>
                <!-- 指定密码 -->
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入映射文件-->
    <mappers>
        <mapper resource="UserMappers.xml"></mapper>
        <mapper resource="UserDaoMappers.xml"></mapper>
        <mapper resource="CommonSql.xml"></mapper>
        <mapper resource="UserMapper.xml"></mapper>
    </mappers>

</configuration>

 CommonSql.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">
<mapper namespace="CommonSqlSpace">
    <sql id="CommonSqlId">
        id,user_name,password,name,age,sex,birthday,created,updated
    </sql>
</mapper>

3、创建单元测试类UserMapperTest.java

package com.sswblog.test;

import com.sswblog.dao.UserMapper;
import com.sswblog.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 19:57 2018/11/5
 */
public class UserMapperTest {
    private UserMapper userMapper = null;
    private SqlSession sqlSession = null;
    @Before
    public void setup() throws IOException {
        //读取mybatis配置文件
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        sqlSession = sqlSessionFactory.openSession(true);//true为自动提交事务
        userMapper = sqlSession.getMapper(UserMapper.class);
    }

    @Test
    public void findUserByIds(){
        User user = userMapper.findUserById(2L);
        System.out.println("user = " + user);
    }

    @Test
    public void findAllusers(){
        List<User> allUsers = userMapper.findAllUsers();
        for (User allUser : allUsers) {
            System.out.println("allUser = " + allUser);
        }
    }
    @Test
    public void insertUsers(){
        User user = new User();
        user.setUserName("小王八e");
        user.setPassword("11111111");
        user.setName("库里33");
        user.setSex(12);
        user.setAge(222);
        Date date = new Date();
        user.setBirthday(date);
        userMapper.insertUser(user);
        //手动提交事务
        //sqlSession.commit();
        System.out.println("user=="+user);
    }

    @Test
    public void deleteUser(){
        userMapper.deleteUser(20L);
        //sqlSession.commit();
    }

    @Test
    public void updateUser(){
        User user = userMapper.findUserById(9L);
        user.setAge(22);
        userMapper.updateUser(user);
        //sqlSession.commit();
    }

    @Test
    public void login(){
        User user = userMapper.login("lisi", "123456");
        if (user == null){
            System.out.println("登录失败");
        }else {
            System.out.println("登录成功");
        }
    }
}

测试了最后一条

猜你喜欢

转载自blog.csdn.net/sswqzx/article/details/83755565