zoukankan      html  css  js  c++  java
  • 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);
    
        }
    }
    

    如有错漏,欢迎指正

  • 相关阅读:
    mysql排序
    MySQL命令行导出数据库
    os.path python使用遍历文件夹文件
    linux后台运行和关闭、查看后台任务
    WebDriver中自动识别验证码--Python实现
    一起学react (1) 10分钟 让你dva从入门到精通
    git命令大全
    jQuery中的100个技巧(译)
    Flow入门初识
    深入理解typescript的Functions
  • 原文地址:https://www.cnblogs.com/lazy-brain/p/12706778.html
Copyright © 2011-2022 走看看