• mybatis06 增删改差 源码


    user.java

    package cn.itcast.mybatis.po;
    
    import java.util.Date;
    
    public class User {
        private int id;
        private String username;// 用户姓名
        private String sex;// 性别
        private Date birthday;// 生日
        private String address;// 地址
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        public Date getBirthday() {
            return birthday;
        }
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
        public String getAddress() {
            return address;
        }
        public void setAddress(String address) {
            this.address = address;
        }
        @Override
        public String toString() {
            return "User [id=" + id + ", username=" + username + ", sex=" + sex
                    + ", birthday=" + birthday + ", address=" + address + "]";
        }
        
        
    }

    uese.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语句,对sql语句进行隔离,方便管理 ,在后面采用mapper开发dao这种方式时使用namespace有特殊作用...
    mapper代理开发时将namespace指定为mapper接口的全限定名
     -->
    <mapper namespace="test">
    <!-- 在mapper.xml文件中配置很多的sql语句,每个sql语句封装为一个MappedStatement对象
    mapper.xml(就是这里的User.xml)
     -->
    
        <!-- 根据id查询用户信息 -->
        <!-- 
            id:唯一标识 一个statement
            #{}:表示 一个占位符(?也表示一个占位符),如果#{}中传入简单类型的参数,#{}中的名称随意
            parameterType:输入 参数的类型,通过#{}接收parameterType输入 的参数
            resultType:输出结果 类型,不管返回是多条还是单条,指定单条的pojo类型
         -->
        <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
            SELECT * FROM USER WHERE id= #{id}
        
        </select>
        
        <!-- 根据用户名称查询用户信息,可能返回多条,模糊查询,
        ${}:表示sql的拼接,通过${}接收参数,将参数的内容不加任何修饰拼接在sql中。
        
         -->
        <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
            select * from user where username like '%${value}%'
        </select>
        
        <!-- 添加用户
        parameterType:输入 参数的类型,User对象 包括 username,birthday,sex,address
        #{}是占位符可以把字符串的日期类型自动转换为Date类型
        #{}接收pojo数据,可以使用OGNL解析出pojo的属性值(OGNL对象导航语言,struts2可以使用OGNL,如果username是一个对象,则可以用#{username.name})
        #{username}表示从parameterType中获取pojo的属性值
        
        需求:user对象插入到数据库后,新记录的主键要通过user对象返回,这样就可以通过user获取主键值。
        解决思路:
        通过LAST_INSERT_ID()函数获取刚插入记录的自增主键值,
        
        selectKey:用于进行主键返回,里面定义了获取主键值的sql,在insert语句执行后,执行select LAST_INSERT_ID()就可以获取自增主键。
        order:设置selectKey中sql执行的顺序,相对于insert语句来说,AFTER就是在insert语句执行后执行select LAST_INSERT_ID()
        keyProperty:将主键值设置到User对象的哪个属性,
        resultType:select LAST_INSERT_ID()的结果 类型,就是要插入User对象的id属性的类型,如果User对象的id属性是string则这里就是String。
        
         -->
        <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
            <selectKey keyProperty="id" order="AFTER" resultType="int">
                select LAST_INSERT_ID()    <!-- 这条语句可以直接在sqldevelop运行 -->
            </selectKey>
            
            INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address})
        </insert>
        
        <!-- mysql的uuid生成主键 -->
        <!-- <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
            <selectKey keyProperty="id" order="BEFORE" resultType="string">
                select uuid()               <!-- 这条语句可以直接在sqldevelop运行
            </selectKey>
            
            INSERT INTO USER(id,username,birthday,sex,address) VALUES(#{id},#{username},#{birthday},#{sex},#{address})
        </insert> -->
        
        <!-- oracle
        在执行insert之前执行select 序列.nextval() from dual取出序列最大值((select 序列.nextval()得到oracle的序列值),将值设置到user对象 的id属性
         -->
        <!-- <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
            <selectKey keyProperty="id" order="BEFORE" resultType="int">
                select 序列.nextval() from dual        <!-- 这条语句可以直接在sqldevelop运行 -->
            </selectKey>
            
            INSERT INTO USER(id,username,birthday,sex,address) VALUES(#{id},#{username},#{birthday},#{sex},#{address})
        </insert> -->
        
        <!-- 用户删除  -->
        <delete id="deleteUser" parameterType="int">
         delete from user where id=#{id}
        </delete>
        <!-- 用户更新 
        要求:传入的user对象中包括 id属性值
        -->
        <update id="updateUser" parameterType="cn.itcast.mybatis.po.User">
            update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
        </update>
    
    </mapper>

    SqlMapConfig.xml

    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    
        <!-- 属性定义
        加载一个properties文件
        在 properties标签 中配置属性值
         -->
        <properties resource="db.properties">
            <!-- <property name="" value=""/> -->
        </properties>
        
        <!-- 定义 别名 -->
        <typeAliases>
            <!--
            单个别名的定义
            alias:别名,type:别名映射的类型  -->
            <!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> -->
            <!-- 批量别名定义
            指定包路径,自动扫描包下边的pojo,定义别名,别名默认为类名(首字母小写或大写)
             -->
            <package name="cn.itcast.mybatis.po"/>
            
        </typeAliases>
        
        <!-- 和spring整合后 environments配置将废除-->
        <environments default="development">
            <environment id="development">
            <!-- 使用jdbc事务管理-->
                <transactionManager type="JDBC" />
            <!-- 数据库连接池-->
                <dataSource type="POOLED">
                    <!-- 数据库连接参数 -->
                    <property name="driver" value="${jdbc.driver}"/>
                    <property name="url" value="${jdbc.url}"/>
                    <property name="username" value="${jdbc.username}"/>
                    <property name="password" value="${jdbc.password}"/>
                </dataSource>
            </environment>
        </environments>
        
        <!--加载mapper映射
        如果将和spring整合后,可以使用整合包中提供的mapper扫描器,此处的mappers不用配置了。
         -->
        <mappers>
            <!-- resource是classpath,通过resource加载mapper的映射文件 -->
            <mapper resource="sqlmap/User.xml" />
            <!-- <mapper resource="mapper/UserMapper.xml" /> -->
            <!-- 通过class引用mapper接口 
            class:配置mapper接口全限定名
            要求:需要mapper.xml和mapper.java同名并且在一个目录 中
            -->
            <!-- <mapper class="cn.itcast.mybatis.mapper.UserMapper"/> -->
            <!-- 批量mapper配置 
            通过package进行自动扫描包下边的mapper接口,
            要求:需要mapper.xml和mapper.java同名并且在一个目录 中
            
            -->
            <package name="cn.itcast.mybatis.mapper"/>
            
            
        </mappers>
        
        
    </configuration>

    Test.java

    package cn.itcast.mybatis.first;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Date;
    import java.util.List;
    
    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 cn.itcast.mybatis.po.User;
    
    public class MybatisFirst {
    
        // 会话工厂
        private SqlSessionFactory sqlSessionFactory;
    
    
        // 创建工厂
        @Before        //before注解
        public void init() throws IOException {
    
            // 配置文件(SqlMapConfig.xml)
            String resource = "SqlMapConfig.xml";
    
            // 加载配置文件到输入 流
            InputStream inputStream = Resources.getResourceAsStream(resource);
    
            // 创建会话工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
        }
    
        // 测试根据id查询用户(得到单条记录)
        @Test
        public void testFindUserById() {
    
            // 通过sqlSessionFactory创建sqlSession
    
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            // 通过sqlSession操作数据库
            // 第一个参数:statement的位置,等于namespace+statement的id
            // 第二个参数:传入的参数
            //返回user
            User user = null;
            try {
                user = sqlSession.selectOne("test.findUserById", 2);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // 关闭sqlSession
                sqlSession.close();
            }
    
            System.out.println(user);
    
        }
    
        // 测试根据id查询用户(得到单条记录)
        @Test
        public void testFindUserByName() {
    
            // 通过sqlSessionFactory创建sqlSession
    
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            // 通过sqlSession操作数据库
            // 第一个参数:statement的位置,等于namespace+statement的id
            // 第二个参数:传入的参数
            List<User> list = null;
            try {
                list = sqlSession.selectList("test.findUserByName", "小明");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // 关闭sqlSession
                sqlSession.close();
            }
    
            System.out.println(list.get(0).getUsername());
    
        }
    
        // 测试根据id查询用户(得到单条记录)
        @Test
        public void testInsertUser() {
    
            // 通过sqlSessionFactory创建sqlSession
    
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            // 通过sqlSession操作数据库
            // 创建插入数据对象
            User user = new User();
            user.setUsername("浪子燕青");
            user.setAddress("河南郑州");
            user.setBirthday(new Date());
            user.setSex("1");
    
            try {
                sqlSession.insert("test.insertUser", user);
                // 因为没有设置成自动提交,所以需要提交事务,以后与spring 自动整合之后通过spring管理这些类就自动提交了。
                //调试的时候把myeclips编译好的控制台打印的sql语句放入sqlserver软件中进行手动调试
                sqlSession.commit();
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // 关闭sqlSession
                sqlSession.close();
            }
            //打印主键,比如2个表关联,把副表插入数据库之后把外键插入主表中
            //不用<selectKey/>就没有主键id返回(此时id为null),
            //需求:user对象插入到数据库后,新记录的主键要通过user对象返回,这样就可以通过user获取主键值。
            System.out.println("用户的id=" + user.getId());
    
        }
    
        // 测试根据id删除用户(得到单条记录)
        @Test
        public void testDeleteUser() {
    
            // 通过sqlSessionFactory创建sqlSession
    
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            // 通过sqlSession操作数据库
            try {
                sqlSession.delete("test.deleteUser", 35);
                // 需要提交事务
                sqlSession.commit();
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // 关闭sqlSession
                sqlSession.close();
            }
    
    
        }
    
        // 测试根据id更新用户(得到单条记录)
        @Test
        public void testUpdateUser() {
    
            // 通过sqlSessionFactory创建sqlSession
    
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            // 通过sqlSession操作数据库
            // 创建更新数据对象,要求必须包括 id
            User user = new User();
            user.setId(35);
            user.setUsername("燕青");
            user.setAddress("河南郑州");
    //        user.setBirthday(new Date());
            user.setSex("1");
    
            try {
                sqlSession.update("test.updateUser", user);
                // 需要提交事务
                sqlSession.commit();
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // 关闭sqlSession
                sqlSession.close();
            }
    
            System.out.println("用户的id=" + user.getId());
    
        }
    
    }
  • 相关阅读:
    .NET Core微服务之基于Consul实现服务治理
    在 .NET 4.5 中反射机制的变更
    C#使用Emit构造拦截器动态代理类
    C#使用Emit生成构造函数和属性
    秒懂C#通过Emit动态生成代码
    C# 高性能 TCP 服务的多种实现方式
    Zookeeper的功能以及工作原理
    Eclipse智能提示及快捷键
    【Maven】Select Dependency 无法检索
    springboot的三种启动方式
  • 原文地址:https://www.cnblogs.com/yaowen/p/4869265.html
Copyright © 2020-2023  润新知