02 Mybatis CRUD操作

目录

CRUD操作

代码

保存操作的细节

OGNL表达式

概念

用处

多条件查询

resultMap

概念

properties标签

作用

url

概念

获取本地资源的url

typeAlias package

typeAlias

package


  1. CRUD操作

    1. 代码

      1. package cn.lq.test;
        
        import cn.lq.dao.DaoUser;
        import cn.lq.domain.QueryCondition;
        import cn.lq.domain.User;
        import org.apache.ibatis.session.SqlSession;
        import org.apache.ibatis.session.SqlSessionFactory;
        import org.apache.ibatis.session.SqlSessionFactoryBuilder;
        import org.junit.After;
        import org.junit.Before;
        import org.junit.Test;
        
        import org.apache.ibatis.io.Resources;
        
        import java.io.IOException;
        import java.io.InputStream;
        import java.util.Date;
        import java.util.List;
        
        /*
        author: lq
        time: 2020-04-14 18:52
        */
        public class TestMybatis {
            private InputStream is = null;
            private SqlSessionFactory factory = null;
            private SqlSession sqlSession = null;
            private DaoUser daoUser = null;
        
            /**
             * 初始化操作
             */
            @Before
            public void init() throws IOException {
                //1读取配置文件
                is = Resources.getResourceAsStream("SqlMapConfig.xml");//Resources类使用的包是:import org.apache.ibatis.io.Resources;
                //2创建SqlSessionFactory工厂
                factory = new SqlSessionFactoryBuilder().build(is);
                //3使用工厂生产SqlSession对象
                sqlSession = factory.openSession(true);//true 设置自动提交事务, 不推荐使用自动题解事务
                //4使用SQLSession创建dao的代理对象
                daoUser = sqlSession.getMapper(DaoUser.class);
                //5使用代理对象执行方法
            }
        
            /**
             * 提交事务
             * 释放资源
             */
            @After
            public void destroy() throws IOException {
                //提交事务
        //        sqlSession.commit();
                //6释放资源
                is.close();
                sqlSession.close();
            }
        
            /**
             * mybatis入门
             *
             * @throws IOException
             */
            @Test
            public void testFindAll() throws IOException {
                List<User> users = daoUser.findAll();
                for (User user : users) {
                    System.out.println(user);
                }
            }
        
            /**
             * 测试 添加用户
             *
             * @throws IOException
             */
            @Test
            public void testAdd() throws IOException {
                User user = new User(null, "lq2", new Date(), "m", "hn");
                System.out.println("user = " + user);
                daoUser.add(user);
                System.out.println("user = " + user);
            }
            /**
             * 测试 更新用户
             *
             * @throws IOException
             */
            @Test
            public void testUpdate() throws IOException {
                User user = new User(49, "lq1", new Date(), "f", "hn1");
                daoUser.update(user);
            }
            /**
             * 测试 删除用户
             *
             * @throws IOException
             */
            @Test
            public void testDelById() throws IOException {
                daoUser.delById(46);
            }
            /**
             * 测试 根据id查询
             *
             * @throws IOException
             */
            @Test
            public void testFindById() throws IOException {
                User user = daoUser.findById(45);
                System.out.println("user = " + user);
            }
            /**
             * 测试 模糊查询
             *
             * @throws IOException
             */
            @Test
            public void testFindByUsername() throws IOException {
                String username ="王";
                // % 要在传递参数的时候进行设置
                List<User> users = daoUser.findByUsername("%" + username + "%");
                for (User user : users) {
                    System.out.println(user);
                }
            }
            /**
             * 测试 查询总记录数
             *
             * @throws IOException
             */
            @Test
            public void testFindTotalCount() throws IOException {
                int count = daoUser.findTotalCount();
                System.out.println("count = " + count);
            }
            /**
             * 测试 模糊查询
             *
             * @throws IOException
             */
            @Test
            public void testFindByQueryCondition() throws IOException {
                User user = new User();
                user.setUsername("%王%");
                QueryCondition queryCondition = new QueryCondition();
                queryCondition.setUser(user);
                List<User> byQueryCondition = daoUser.findByQueryCondition(queryCondition);
                for (User user1 : byQueryCondition) {
                    System.out.println(user1);
                }
            }
        }
        
        

         

      2. <?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="cn.lq.dao.DaoUser">
            <resultMap id="userMap" type="user">
                <!--必须先配置主键的对应关系-->
                <id property="uid" column="id"></id>
                <!--配置剩余非主键的对应关系-->
                <result property="userName" column="username"></result>
            </resultMap>
            <!--配置查询所有-->
            <!--属性id(方法名)和resultType(写全类名)是不能缺少的!-->
            <select id="findAll" resultType="user">
                select * from user
            </select>
            <!--添加-->
            <insert id="add" parameterType="user">
                <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
                    <!--keyProperty : 实体类的对应属性-->
                    <!--keyColumn : 数据库表中对应的字段-->
                    <!--order : 执行的先后顺序-->
                    select last_insert_id();
                </selectKey>
                insert into user(username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address});
            </insert>
            <!--更新-->
            <update id="update" parameterType="user">
                update user set username=#{username}, birthday=#{birthday}, sex=#{sex}, address=#{address} where id=#{id}
            </update>
            <!--删除-->
            <delete id="delById" parameterType="int">
                <!--因为传过来的参数只有一个, 所以参数名字可以随便写-->
                delete from user where id = #{uid}
            </delete>
            <!--根据id查询-->
            <select id="findById" parameterType="int" resultType="user">
                select * from user where id=#{id}
            </select>
            <!--模糊查询-->
            <select id="findByUsername" parameterType="string" resultType="user">
                select * from user where username like #{username}
            </select>
            <!--查询总记录数-->
            <select id="findTotalCount" resultType="int">
                select count(*) from user
            </select>
            <!--模糊查询-->
            <select id="findByQueryCondition" parameterType="cn.lq.domain.QueryCondition" resultType="user">
                select * from user where username like #{user.username}
            </select>
        </mapper>

         

  2. 保存操作的细节

    1. 我们再添加一个记录时, 会创建一个对应的实体类对象(user), 但是我们并不会去指定这个实体类对象的id, 因为这个id是在添加数据库的时候自动产生的. 比如说, 此时的user里面的属性是这样的:user={id=null, username="lq", age=22}, 在你执行完插入语句之后, user的id值仍然 是null. 如果说你想在执行完插入语句之后, 能够将自动生成的id值赋值给user里面的id值, 那么你就需要在映射配置文件里面添加一些语句, 代码如下:
      1. <!--添加-->
        <insert id="add" parameterType="user">
            <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
                <!--keyProperty : 实体类的对应属性-->
                <!--keyColumn : 数据库表中对应的字段-->
                <!--order : 执行的先后顺序-->
                select last_insert_id();
            </selectKey>
            insert into user(username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address});
        </insert>

         

  3. OGNL表达式

    1. 概念

      1. Object Graphic Navigation Language: 对象图导航语言
      2. 它是通过对象取值的方法, 在写法上把get给省略了
    2. 用处

      1. 多条件查询

        1. 我们在查询的过程中可能会用多个实体类来作为查询的条件, 这个时候就可以用到上面的那个ognl表达式了
        2. 做法:
          1. 把多个实体类再封装到一个对象中去, 通过对象.的方式调用属性即可
  4. resultMap

    1. 概念

      1. 当你的实体类的属性名和数据库表的字段名对应不上的时候, 你就可以在映射配置文件中定义一个这样的resultMap, 自己定义二者的对应关系, 然后, 如果哪一个sql语句需要用的这个自定义映射关系的话, 只需要把他的parameterType改成resultMap即可.
    2. <resultMap id="userMap" type="user">
          <!--必须先配置主键的对应关系-->
          <id property="uid" column="id"></id>
          <!--配置剩余非主键的对应关系-->
          <result property="userName" column="username"></result>
      </resultMap>

       

  5. properties标签

    1. 作用

      1. 可以将配置数据库的信息单独独立出来成为一个properties文件
      2. 引用外部的数据库配置文件
  6. url

    1. 概念

      1. 统一资源定位符, 可以再全网使用
      2. url包含: 协议 主机名 端口号 uri
        1. uri: 统一资源标识符
          1. 只可以在本机内使用
    2. 获取本地资源的url

      1. 直接将文件拖进浏览器中, 在地址栏里面就可以复制到文件的url
  7. typeAlias package

    1. typeAlias

      1. 用来给实体类起别名
        1. 之前在指定参数是int类型时, 之所以可以仅仅写一个int, 而不用写int的全类名, 就是因为int已经被起了别名
    2. package

      1. 可以直接给整个包下面的类起别名, 直接使用类名, 不区分大小写
    3. <typeAliases>
          <!--给实体类起别名, type:实体类的全类名 alias:实体类的别名,并且在使用时可以不用区分大小写 -->
          <!--<typeAlias type="cn.lq.domain.User" alias="user"></typeAlias>-->
          <!--可以直接给整个包下面的类起别名, 直接使用类名, 不区分大小写-->
          <package name="cn.lq.domain"></package>
      </typeAliases>

       

    4. <!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的文件 -->
      <mappers>
          <!--注意 路径是文件夹, 不是包, 所以间隔是 / 不是 . -->
          <!--<mapper resource="cn/lq/dao/DaoUser.xml"></mapper>-->
          <!--可以直接指定dao所在的包, 这样就不用再写mapper了, 也不用区分什么时候用class或resource了 -->
          <package name="cn.lq.dao"></package>
      </mappers>

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值