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());

    }

}

 

posted @ 2015-10-11 14:52  无天666  阅读(269)  评论(0编辑  收藏  举报