mybatis(4)--完成基本的增删改查操作

上一个小demo只是演示了mybatis的执行过程是怎样的,我们先来回顾一下:
首先是写配置文件:
sqlMapConfig.xml中定义数据源连接池的属性,用来与数据库获取连接;
接下来写usermapper.xml,来替换之前jdbc中写死的sql,其中有输入映射与输出映射;
这时候我们需要一个pojo来作为其中的输入或输出等,其属性与数据库中保持一致;
最后在test中要首先获取配置文件的输入流,根据它获取一个sqlSessionFactory,再用sqlSessionFactory创建sqlSession来操作数据库

那么这次我们来完成基本的增删改查操作,其中的一些知识点我都在代码注释中写了,我习惯这样写,这样能帮助我理清思路,知道程序的流程以及需要注意的点
sqlMapConfig.xml不变
mybatis主要就是对于这个sql配置文件的编写:




<mapper namespace="test">
    

    

    
    <select id="findUserById" parameterType="int"
        resultType="com.ddd.mybatis.pojo.User">
        SELECT * FROM USER WHERE id=#{id}
    select>

    
    <select id="findUserByName" parameterType="java.lang.String"
        resultType="com.ddd.mybatis.pojo.User">
        SELECT * FROM USER WHERE username LIKE '%${value}%'
    select>

    
    <insert id="insertUser" parameterType="com.ddd.mybatis.pojo.User">
        
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            SELECT LAST_INSERT_ID()
        selectKey>
        

        INSERT INTO USER(username,sex,birthday,address)
        VALUES(#{username},#{sex},#{birthday},#{address})
    insert>


    
    <delete id="deleteUserById" parameterType="java.lang.Integer">
        DELETE FROM USER WHERE id=#{id}
    delete>

    
    <update id="updateUser" parameterType="com.ddd.mybatis.pojo.User">
        UPDATE USER SET
        username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
        WHERE id=#{id}
    update>
mapper>

我们再看看测试代码是怎样的:

package com.ddd.mybatis.first;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
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.Test;

import com.ddd.mybatis.pojo.User;
/**
 * 测试mybatisdemo
 * @author Dan
 *
 */
public class MybatisFirst {
    //根据id查询用户信息得到一条结果记录
    @Test
    public void findUserByIdTest() throws IOException{
        //加载mybatis文件
        String fileSource="SqlMapConfig.xml";
        //获取文件流
        InputStream inputStream=Resources.getResourceAsStream(fileSource);
        //根据加载的配置文件信息创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //得到sqlsession
        SqlSession sqlSession=sqlSessionFactory.openSession();

        //sqlSession操作数据库
        //第一个参数:映射文件中的statement的id:也就是namespace+"."+statement的id
        //第二个参数:指定和映射文件中所匹配的parameterType类型的参数
        //接受参数就是resultType中指定的对象类型
        User u=sqlSession.selectOne("test.findUserById", 1);
        System.out.println(u);
        sqlSession.close();
    }

    @Test
    public void findUserByNameTest() throws IOException{
        //加载mybatis文件
        String fileSource="SqlMapConfig.xml";
        //获取文件流
        InputStream inputStream=Resources.getResourceAsStream(fileSource);
        //根据加载的配置文件信息创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //得到sqlsession
        SqlSession sqlSession=sqlSessionFactory.openSession();

        //sqlSession操作数据库
        //这里list中的要指定是user,和resultType指定的类型保持一致,selectList表示查询多条记录
        List list=sqlSession.selectList("test.findUserByName", "小明");
        for (User u:list) {
            System.out.println(u);
        }
        sqlSession.close();
    }


    @Test
    public void insertUserTest() throws IOException{
        //加载mybatis文件
        String fileSource="SqlMapConfig.xml";
        //获取文件流
        InputStream inputStream=Resources.getResourceAsStream(fileSource);
        //根据加载的配置文件信息创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //得到sqlsession
        SqlSession sqlSession=sqlSessionFactory.openSession();

        User u=new User();
        u.setUsername("大张伟");
        u.setSex("男");
        u.setBirthday(new Date());
        u.setAddress("广州佛山");
        sqlSession.insert("test.insertUser", u);
        //这里需要提交,在使用spring后就不用提交了
        sqlSession.commit();


        /**1.
         * 获取用户主键(自增主键的返回)
         * mysql自增主键,执行insert提交之前会自动生成一个自增主键
         * 自增主键可以通过mysql函数获取到:SELECT LAST_INSERT_ID(),但是这里是0
         * System.out.println(u.getId());结果是0
         * 所以应该在insert之后执行,所以要在mapper中设置返回主键
         * 2.
         * 获取用户主键(非自增的主键的返回)
         * mysql的uuid()函数生成主键,需要修改表中id字段类型为String,长度35
         * 先通过uuid()查询到主键,将主键输入到sql中
         * 执行uuid()在insert语句之前执行
         */
        //关闭会话
        sqlSession.close();
    }
    //根据id删除一条用户记录
    @Test
    public void deleteUserByIdTest() throws IOException{
        //加载mybatis文件
        String fileSource="SqlMapConfig.xml";
        //获取文件流
        InputStream inputStream=Resources.getResourceAsStream(fileSource);
        //根据加载的配置文件信息创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //得到sqlsession
        SqlSession sqlSession=sqlSessionFactory.openSession();

        //sqlSession操作数据库
        sqlSession.delete("test.deleteUserById", 2);
        sqlSession.commit();
        sqlSession.close();
    }
    //更新用户
    @Test
    public void updateUserTest() throws IOException{
        //加载mybatis文件
        String fileSource="SqlMapConfig.xml";
        //获取文件流
        InputStream inputStream=Resources.getResourceAsStream(fileSource);
        //根据加载的配置文件信息创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //得到sqlsession
        SqlSession sqlSession=sqlSessionFactory.openSession();

        //sqlSession操作数据库
        User u=new User();
        u.setId(3);
        u.setUsername("huauhua");
        u.setSex("女");
        u.setBirthday(new Date());
        u.setAddress("河南郑州");
        sqlSession.update("test.updateUser", u);
        sqlSession.commit();
        sqlSession.close();
    }

}

看看运行结果:

mybatis(4)--完成基本的增删改查操作_第1张图片

基本的增删改查就是这样啦,那么这里的parameterType中设置的user属性都是简单属性,那如果user中有了一个类属性又要怎么通过OGNL获取呢?

这里的SQLSession每次都一样,有什么办法可以解决呢?
事务每次都要提交,这未免也太麻烦!
别担心,spring会帮我们解决很多问题!
嗯!我要去学习!

你可能感兴趣的:(mybatis)