前面的小节我们已经讲到用接口的方式编程。使用这种方式,需要注意的一个地方就是,在user.xml
配置文件中,mapper namespace="com.h3.mybatis.inter.iuser"
,命名空间对应非常重要,名称不能有错,必须与我们定义的 package
和 接口一致。如果不一致就会出错,这一章主要在上一讲基于接口编程的基础上完成如下操作:
查询数据,前面已经讲过简单的查询单个用户数据,在这里将查询出用户列表,
要查询出列表,也就是返回 list
, 在我们这个例子中也就是list<user>
, 要以这种方式返回数据,需要在user.xml
里面配置返回的类型 resultmap
, 注意不是 resulttype
, 而这个resultmap
所对应的应该是我们自己配置。
在此示例中,我们需要使用到以下表:
接下我们创建一个表:user,并插入一条记录信息,其结构如下所示:
create table `user` (
`id` int(10) unsigned not null auto_increment,
`name` varchar(64) not null default '',
`dept` varchar(254) not null default '',
`website` varchar(254) default '',
`phone` varchar(16) not null default '',
primary key (`id`)
) engine=innodb auto_increment=2 default charset=latin1;
-- ----------------------------
-- records of user
-- ----------------------------
insert into `user` values ('1', 'h3', 'tech', 'http://www.h3.com', '13800009988');
我们首先来创建一个工程:mybatis-curd-03,与第一节中介绍的环境配置一样,加入所需的 jar
包:mysql-connector
和 mybatis3.jar
。配置 src/config/configure.xml
,其文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<!doctype configuration public "-//mybatis.org//dtd config 3.0//en"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typealiases>
<typealias alias="user" type="com.h3.mybatis.models.user" />
</typealiases>
<environments default="development">
<environment id="development">
<transactionmanager type="jdbc" />
<datasource type="pooled">
<property name="driver" value="com.mysql.jdbc.driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/testdb" />
<property name="username" value="root" />
<property name="password" value="123456" />
</datasource>
</environment>
</environments>
<mappers>
<!-- // power by http://www.h3.com -->
<mapper resource="com/h3/mybatis/models/user.xml" />
</mappers>
</configuration>
在这里需要创建一个类和一个接口:user.java
类和iuser.java
接口,user.java
类位于包 com.h3.mybatis.models
下,user.java
类代码内容如下:
package com.h3.mybatis.models;
public class user {
private int id;
private string name;
private string dept;
private string phone;
private string website;
public string getwebsite() {
return website;
}
public void setwebsite(string website) {
this.website = website;
}
public int getid() {
return id;
}
public void setid(int id) {
this.id = id;
}
public string getname() {
return name;
}
public void setname(string name) {
this.name = name;
}
public string getdept() {
return dept;
}
public void setdept(string dept) {
this.dept = dept;
}
public string getphone() {
return phone;
}
public void setphone(string phone) {
this.phone = phone;
}
}
iuser.java
接口位于包com.h3.mybatis.dao
下,iuser.java
接口代码内容如下:
package com.h3.mybatis.dao;
import java.util.list;
import org.apache.ibatis.annotations.select;
import com.h3.mybatis.models.user;
/**
*
* @author h3
*
*/
public interface iuser {
//@select("select * from user where id= #{id}")
//public user getuserbyid(int id);
public list<user> getuserlist();
public void insertuser(user user);
public void updateuser(user user);
public void deleteuser(int userid);
public user getuser(int id);
}
这里还需要一个xml文件,与前一小节中一样,使用的是 user.xml
,在这我们分别对应了增删改查的操作(每一个操作的 id
对应于iuser
接口的方法),其内容如下:
user.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">
<mapper namespace="com.h3.mybatis.dao.iuser">
<select id="getuser" parametertype="int"
resulttype="com.h3.mybatis.models.user">
select *
from user
where id = #{userid}
</select>
<insert id="insertuser" parametertype="user">
insert into user(name,
dept, website,phone)
values(#{name}, #{dept}, #{website}, #{phone})
</insert>
<select id="getuserlist" resulttype="com.h3.mybatis.models.user">
select * from user
</select>
<update id="updateuser" parametertype="user">
update user
set
name=
#{name},
dept = #{dept},
website = #{website},
phone = #{phone}
where
id =
#{id}
</update>
<delete id="deleteuser" parametertype="int">
delete from user where id = #{id}
</delete>
</mapper>
测试程序主类:
import java.io.reader;
import java.text.messageformat;
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 com.h3.mybatis.dao.iuser;
import com.h3.mybatis.models.user;
public class main {
private static sqlsessionfactory sqlsessionfactory;
private static reader reader;
static {
try {
reader = resources.getresourceasreader("config/configure.xml");
sqlsessionfactory = new sqlsessionfactorybuilder().build(reader);
} catch (exception e) {
e.printstacktrace();
}
}
public static sqlsessionfactory getsession() {
return sqlsessionfactory;
}
/**
* @param args
*/
public static void main(string[] args) {
// todo auto-generated method stub
sqlsession session = sqlsessionfactory.opensession();
try {
//sqlsessionfactory.getconfiguration().addmapper(iuser.class);
//user user = (user) session.selectone( "com.h3.mybatis.models.usermapper.getuserbyid", 1);
// 用户数据列表
getuserlist();
// 插入数据
// testinsert();
// 更新用户
//testupdate();
// 删除数据
//testdelete();
} finally {
session.close();
}
}
//
public static void testinsert()
{
try
{
// 获取session连接
sqlsession session = sqlsessionfactory.opensession();
// 获取mapper
iuser usermapper = session.getmapper(iuser.class);
system.out.println("test insert start...");
// 执行插入
user user = new user();
user.setid(0);
user.setname("google");
user.setdept("tech");
user.setwebsite("http://www.google.com");
user.setphone("120");
usermapper.insertuser(user);
// 提交事务
session.commit();
// 显示插入之后user信息
system.out.println("after insert");
getuserlist();
system.out.println("test insert finished...");
}
catch (exception e)
{
e.printstacktrace();
}
}
// 获取用户列表
public static void getuserlist() {
try {
sqlsession session = sqlsessionfactory.opensession();
iuser iuser = session.getmapper(iuser.class);
// 显示user信息
system.out.println("test get start...");
printusers(iuser.getuserlist());
system.out.println("test get finished...");
} catch (exception e) {
e.printstacktrace();
}
}
public static void testupdate()
{
try
{
sqlsession session = sqlsessionfactory.opensession();
iuser iuser = session.getmapper(iuser.class);
system.out.println("test update start...");
printusers(iuser.getuserlist());
// 执行更新
user user = iuser.getuser(1);
user.setname("new name");
iuser.updateuser(user);
// 提交事务
session.commit();
// 显示更新之后user信息
system.out.println("after update");
printusers(iuser.getuserlist());
system.out.println("test update finished...");
}catch (exception e)
{
e.printstacktrace();
}
}
// 删除用户信息
public static void testdelete()
{
try
{
sqlsession session = sqlsessionfactory.opensession();
iuser iuser = session.getmapper(iuser.class);
system.out.println("test delete start...");
// 显示删除之前user信息
system.out.println("before delete");
printusers(iuser.getuserlist());
// 执行删除
iuser.deleteuser(2);
// 提交事务
session.commit();
// 显示删除之后user信息
system.out.println("after delete");
printusers(iuser.getuserlist());
system.out.println("test delete finished...");
}catch (exception e)
{
e.printstacktrace();
}
}
/**
*
* 打印用户信息到控制台
*
* @param users
*/
private static void printusers(final list<user> users) {
int count = 0;
for (user user : users) {
system.out.println(messageformat.format(
"============= user[{0}]=================", ++count));
system.out.println("user id: " + user.getid());
system.out.println("user name: " + user.getname());
system.out.println("user dept: " + user.getdept());
system.out.println("user website: " + user.getwebsite());
}
}
}
执行以上程序,如果没有问题,应该能正确输出。那么这里所有增删改查都完成了,需要注意的是在增加,更改,删除的时候需要调用 session.commit()
来提交事务,这样才会真正对数据库进行操作提交保存,否则操作没有提交到数据中。
到此为止,简单的单表操作已经完成了,接下来在下一节中将会讲解多表联合查询,以及结果集的选取。如遇到不明白的问题,请留言评论。
最后,附上项目结构图,如下:
getuserint id的方法执行时 user.xml文件中是#{id}而不是#{userid} 提交时间:2019-08-30