mybatis中插入数据(id为主键的情况)以及查询数据

  1. 上篇写的插入是表中没有设定主键,因此可以直接传入数据完成插入操作。当表中将字段id设为主键并自动增加的情况下该如何插入数据并没有说明。下面还是以mysql为例进行说明:
    • 插入操作,在上篇的基础上,把写的userDataDaoImp.xml略作修改即可:
    • 1)采用useGeneratedKeys=“true” keyProperty=”id”(id是主键的字段名称)来指定插入的数据所对应的id是自动生成的,代码如下.
<!--  这里是用useGeneratedKeys=“true"  keyProperty="id"(id是主键的字段名称)来指定,插入的id的值是自动生成的主键;-->
<insert id="insert_userData" parameterType="userData" useGeneratedKeys="true" keyProperty="id" >
        insert into mytest(name) values(#{name})
</insert>
 *  2) 采用selectKey指定主键id的值,代码如下:
<insert id="insert_userData" parameterType="userData" >
        <!-- 这里使用selectKey来获取主键值 -->
        <!--  keyProperty="id"这里写的是对应的主键的字段名称,resultType="int"这里对应的是主键的类型-->
        <selectKey keyProperty="id" resultType="int">
            select LAST_INSERT_ID()
        </selectKey>
        insert into mytest(name) values(#{name})
    </insert>

以上两种方法都可以实现,只需将上篇中的对应部分替换掉即可。
userDataDaoImp.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">
<!--等价于dao接口的实现 namespace必须和接口的类路径一样 -->
<mapper namespace="userDataDao">
    <!--  这里是用useGeneratedKeys=“true"  keyProperty="id"(id是主键的字段名称)来指定,插入的id的值是自动生成的主键;
    <insert id="insert_userData" parameterType="userData" useGeneratedKeys="true" keyProperty="id" >
        insert into mytest(name) values(#{name})
    </insert>
    -->
    <insert id="insert_userData" parameterType="userData" >
        <!-- 这里使用selectKey来获取主键值 -->
        <!--  keyProperty="id"这里写的是对应的主键的字段名称,resultType="int"这里对应的是主键的类型-->
        <selectKey keyProperty="id" resultType="int">
            select LAST_INSERT_ID()
        </selectKey>
        insert into mytest(name) values(#{name})
    </insert>

</mapper>

下面简单记录一下查询select操作:

  1. 还是在上篇的基础上进行修改
    • 1.在userDataDao中新添加查询方法

这里写图片描述

  • 2.在userDataDaoImp.xml中写查询语句
    • resultType指定返回值类型,要写全类名。 parameterTyp指定传入的参数类型,where id=#{id}中是
      #{方法中的参数名}
      这里写图片描述
  • 3.在test_userDataDao中添加java语句进行查询
    这里写图片描述

userData中也要添加toString方法;
查询结果如下:
这里写图片描述

userDataDao代码:

/**
 *@author xpengfei
 *@creat  4:27:28 PM   May 25, 2017
 */
public interface userDataDao {
    //插入方法
    public void insert_userData(userData userdata);

    //查询方法
    public userData query_by_id_Re_All(int id);

}

userDataDaoImp.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">
<!--等价于dao接口的实现 namespace必须和接口的类路径一样 -->
<mapper namespace="userDataDao">
    <!--  这里是用useGeneratedKeys=“true"  keyProperty="id"(id是主键的字段名称)来指定,插入的id的值是自动生成的主键;
    <insert id="insert_userData" parameterType="userData" useGeneratedKeys="true" keyProperty="id" >
        insert into mytest(name) values(#{name})
    </insert>
    -->
    <insert id="insert_userData" parameterType="userData" >
        <!-- 这里使用selectKey来获取主键值 -->
        <!--  keyProperty="id"这里写的是对应的主键的字段名称,resultType="int"这里对应的是主键的类型-->
        <selectKey keyProperty="id" resultType="int">
            select LAST_INSERT_ID()
        </selectKey>
        insert into mytest(name) values(#{name})
    </insert>
    <!-- resultType指定返回值类型,要写全类名。 parameterTyp指定传入的参数类型,where id=#{id}中是
            #{方法中的参数名}-->
    <select id="query_by_id_Re_All" parameterType="java.lang.Integer" resultType="userData">
        select * from mytest where id=#{id}
    </select>

</mapper>

test_userDataDao代码:

import java.io.Reader;
import java.util.Date;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/**
 * @author xpengfei
 * @creat 4:42:30 PM May 25, 2017
 */
public class test_userDataDao {
    public static void main(String[] args) throws Exception {
        // 得到SQLSession

        // 加载mybatis配置文件启动
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        // 读取mybatis的配置文件
        Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
        // 负责构造SQLSession
        SqlSessionFactory factory = builder.build(reader);
        // 一次数据库会话,包含多次数据库访问操作,相当于JDBC中的Connection
        SqlSession session = factory.openSession();
        // 得到DAO的实现类
        userDataDao dao = session.getMapper(userDataDao.class);

        // 调用insert方法完成插入操作
        /*userData user_data = new userData("xpeng");
        System.out.println(user_data);
        dao.insert_userData(user_data);
        System.out.println("dhkjahkdjaksndlasndlskand--------------");

        session.commit();
         */
        userData result=dao.query_by_id_Re_All(8);
        System.out.println(result);
        session.close();

    }

}
  • update方法:
    userDataDaoImp.xml中写标签
<update id="方法名"  parameterType="参数类型,如果是对象,要写对象所在类的全类名">
 update 表名 set 表中字段名=#{参数名或对象中包含的与表中字段一致的变量的名称}  where 字段名=#{更新所依据的参数eg:id}

</update>
  • delete方法:
    userDataDaoImp.xml中写标签
<delete id="方法名"  parameterType="参数类型,如果是对象,要写对象所在类的全类名">
 delete  from 表名 where 字段名=#{删除所依据的参数eg:id}

</delete>

增、删、改操作一定要有commit,查询则不需要;

这里可以对读取mybatis配置文件的代码进行封装,以免反复去写使代码冗余;

编写mybatisUtil工具类对上述进行封装:

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/**
 * @author xpengfei
 * @creat 6:09:46 PM May 26, 2017
 */
public class mybatisUtil {
    private static SqlSessionFactory factory=null;
    static {
        try {
            // 加载mybatis配置文件启动
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            // 读取mybatis的配置文件
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            // 负责构造SQLSession
            factory = builder.build(reader);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSession() {
        SqlSession session = factory.openSession();
        return session;
    }

    public static void close(SqlSession session) {
        if (session != null)
            session.close();
    }
}
原文地址:https://www.cnblogs.com/xpfei/p/7450806.html