Mybatis框架学习笔记二(基于配置文件的配置)

Mybatis框架学习笔记二

基础mybatis配置文件方式配置

前面的准备工作(即创建数据库表,1.编写数据源,2.依赖导入,3.编写实体类)与上篇相同
3.添加UserVo实体类

public class QueryVo {
    private User user;
    private List<Integer> ids;
    //下面是get,set方法
    ...
}

4.编写持久层接口

package com.learn.dao;
public interface UserDao {

    /**
     * 保存用户方法
     */
    void saveUser(User user);

    /**
     * 根据id查询用户信息
     */
    User findById(Integer userId);

    /**
     * 根据id删除用户
     */
    void deleteById(Integer id);

    /**
     * 根据id更新用户信息
     */
    void updataById(User user);

    /**
     * 根据传入的条件查询
     * @param user 查询的条件,可以有各个属性,也可能都没有
     */
    List<User> findByCondition(User user);

    /**
     * 根据QueryVo提供的id集合查询用户集合
     */
    List<User> findUserInIds(QueryVo vo);
}

5.在resources目录下建立与Dao(Mapper)接口相同的目录结构,并在该目录下创建UserDao.xml文件
我这里就是com/learn/dao(resources是目录,所以需要将.改成/)

<?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属性:Dao(Mapper)接口的全类名-->
<mapper namespace="com.learn.dao.UserDao">

    <!--如果实体类中属性名与数据库中列名不对应时,
    如果不在sql语句中使用映射的方式,则需要使用下列这种方式来保证对象的正确封装-->
    <!--配置 查询结果的列名和实体类的属性名的对应关系-->
    <!--id属性:唯一标识,type属性:指定要封装成哪个类-->
    <resultMap id="userMap" type="com.learn.domain.User">
        <!--首先要设置主键字段的对应property属性:指定实体类中的属性名称,column属性:数据库表键值名称,下同 -->
        <id property="id" column="id"></id>
        <!--property 实体类中的名称     column 数据库中的列中的列名        -->
        <!--非主键字段的对应-->
        <result property="username" column="username"></result>
        <result property="address" column="address"></result>
        <result property="sex" column="sex"></result>
        <result property="birthday" column="birthday"></result>
    </resultMap>

    <!--保存用户-->
    <insert id="saveUser" parameterType="com.learn.domain.User">
        <!--配置插入操作后,获取插入数据的id-->
        <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address});
    </insert>

    <!--根据id查询用户-->
    <!--如果实体类中属性名与数据库中列名不对应时,需要使用下面注释掉的这一种方法来配置 -->
    <!--<select id="findById" parameterType="int" resultMap="userMap">-->
    <!--parameterType 参数类型,resultType要封装成的数据类型-->
    <select id="findById" parameterType="int" resultType="com.learn.domain.User">
        select * from user where id = #{uid};
        <!--当只要一个参数时,{}里面的变量名可以随便写-->
    </select>

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

    <!--根据id更新数据-->
    <update id="updataById" parameterType="com.learn.domain.User">
        update user set username = #{username} where id = #{id};
        <!--当传入的参数是一个对象时,可以直接写属性名-->
    </update>

    <!--根据<if></if>条件查询-->
    <select id="findByCondition" parameterType="com.learn.domain.User" resultType="com.learn.domain.User">
        select * from user where 1=1
        <!--添加where 1=1恒等式,方便添加其它条件-->
        <if test="username != null">
            and username = #{username}
        </if>
        <if test="sex != null">
            and sex = #{sex}
        </if>
    </select>
    
    <!--根据QueryVo提供的id集合查询用户集合-->
    <select id="findUserInIds" parameterType="com.learn.domain.QueryVo" resultType="com.learn.domain.User">
        select * from user
        <where>
            <if test="ids != null and ids.size() > 0">
                <!--遍历ids集合并拼接sql语句-->
                <foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
                    #{uid}
                    <!--#{里面的内容由 item属性的值决定}-->
                </foreach>
            </if>
        </where>
    </select>
</mapper>

6.在resources目录下新建SqlMapConfig.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,加载JDBC配置文件读取数据库连接信息-->
    <properties resource="jdbcConfig.properties">
    </properties>


    <!--配置环境-->
    <environments default="mysql">
        <!--配置mysql的环境-->
        <environment id="mysql">
            <!--配置事务-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置连接池-->
            <dataSource type="POOLED">
                <!--如果value里的key值必须与配置文件里面的保存一致-->
                <property name="driver" value="${jdbc.driver}"></property>
                <property name="url" value="${jdbc.url}"></property>
                <property name="username" value="${jdbc.username}"></property>
                <property name="password" value="${jdbc.password}"></property>
            </dataSource>
        </environment>
    </environments>
    <!--配置映射文件的位置-->
    <mappers>
<!--        <mapper resource="com/learn/dao/UserDao.xml"></mapper>-->
<!--        package用于指定dao接口所在的包,当指定之后就不需要再写mapper以及resource或者class了-->
        <package name="com/learn/dao"></package>
    </mappers>
</configuration>

7.编写测试类

//避免篇幅过长,我就只写了测试保存的方法
public class MybatisTest {

    private InputStream is;
    private SqlSession sqlSession;
    private UserDao userDao;

    @Before//用于在方法执行前执行
    public void init() throws IOException {
        //1.读取配置文件,生成字节输入流
        is = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.获取SqlSessionFactory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        //3.获取SqlSession对象
        sqlSession = factory.openSession();
        //4.获取dao的代理对象
        userDao = sqlSession.getMapper(UserDao.class);
    }

    @After//用于在方法执行之后执行
    public void destroy() throws IOException {
        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
        is.close();
    }

    /**
     * 测试保存操作
     */
    @Test
    public void testsaveUser(){
        User user = new User();
        user.setUsername("test");
        user.setAddress("1234");
        user.setSex("男");
        user.setBirthday(new Date());
        System.out.println(user);
        //5.测试保存方法
        userDao.saveUser(user);
        System.out.println(user);

    }
}

如有错漏,欢迎指正

原文地址:https://www.cnblogs.com/lazy-brain/p/12706778.html