mybatis中插入数据(id为主键的情况)以及查询数据
- 上篇写的插入是表中没有设定主键,因此可以直接传入数据完成插入操作。当表中将字段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.在userDataDao中新添加查询方法
- 2.在userDataDaoImp.xml中写查询语句
- resultType指定返回值类型,要写全类名。 parameterTyp指定传入的参数类型,where id=#{id}中是
#{方法中的参数名}
- 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();
}
}