前面的小節(jié)我們已經(jīng)講到用接口的方式編程。使用這種方式,需要注意的一個(gè)地方就是,在User.xml 配置文件中,mapper namespace="com.yiibai.mybatis.inter.IUser" ,命名空間對(duì)應(yīng)非常重要,名稱不能有錯(cuò),必須與我們定義的 package 和 接口一致。如果不一致就會(huì)出錯(cuò),這一章主要在上一講基于接口編程的基礎(chǔ)上完成如下操作:
查詢數(shù)據(jù),前面已經(jīng)講過(guò)簡(jiǎn)單的查詢單個(gè)用戶數(shù)據(jù),在這里將查詢出用戶列表,
要查詢出列表,也就是返回 List, 在我們這個(gè)例子中也就是List<User> , 要以這種方式返回?cái)?shù)據(jù),需要在User.xml里面配置返回的類型 resultMap, 注意不是 resultType, 而這個(gè)resultMap 所對(duì)應(yīng)的應(yīng)該是我們自己配置。
在此示例中,我們需要使用到以下表:
接下我們創(chuàng)建一個(gè)表:user,并插入一條記錄信息,其結(jié)構(gòu)如下所示:
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', 'yiibai', 'Tech', 'http://www.yiibai.com', '13800009988');
我們首先來(lái)創(chuàng)建一個(gè)工程:mybatis-curd-03,與第一節(jié)中介紹的環(huán)境配置一樣,加入所需的 jar 包:mysql-connector 和 mybatis3.jar。配置 src/config/Configure.xml,其文件內(nèi)容如下:
<?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.yiibai.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.yiibai.com -->
<mapper resource="com/yiibai/mybatis/models/User.xml" />
</mappers>
</configuration>
在這里需要?jiǎng)?chuàng)建一個(gè)類和一個(gè)接口:User.java類和IUser.java接口,User.java類位于包 com.yiibai.mybatis.models 下,User.java類代碼內(nèi)容如下:
package com.yiibai.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.yiibai.mybatis.dao 下,IUser.java接口代碼內(nèi)容如下:
package com.yiibai.mybatis.dao;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import com.yiibai.mybatis.models.User;
/**
*
* @author yiibai
*
*/
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);
}
這里還需要一個(gè)XML文件,與前一小節(jié)中一樣,使用的是 User.xml,在這我們分別對(duì)應(yīng)了增刪改查的操作(每一個(gè)操作的 ID 對(duì)應(yīng)于IUser接口的方法),其內(nèi)容如下:
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.yiibai.mybatis.dao.IUser">
<select id="getUser" parameterType="int"
resultType="com.yiibai.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.yiibai.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>
測(cè)試程序主類:
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.yiibai.mybatis.dao.IUser;
import com.yiibai.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.yiibai.mybatis.models.UserMapper.getUserByID", 1);
// 用戶數(shù)據(jù)列表
getUserList();
// 插入數(shù)據(jù)
// testInsert();
// 更新用戶
//testUpdate();
// 刪除數(shù)據(jù)
//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...");
// 執(zhí)行插入
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);
// 提交事務(wù)
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());
// 執(zhí)行更新
User user = iuser.getUser(1);
user.setName("New name");
iuser.updateUser(user);
// 提交事務(wù)
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());
// 執(zhí)行刪除
iuser.deleteUser(2);
// 提交事務(wù)
session.commit();
// 顯示刪除之后User信息
System.out.println("After delete");
printUsers(iuser.getUserList());
System.out.println("Test delete finished...");
}catch (Exception e)
{
e.printStackTrace();
}
}
/**
*
* 打印用戶信息到控制臺(tái)
*
* @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());
}
}
}
執(zhí)行以上程序,如果沒(méi)有問(wèn)題,應(yīng)該能正確輸出。那么這里所有增刪改查都完成了,需要注意的是在增加,更改,刪除的時(shí)候需要調(diào)用 session.commit() 來(lái)提交事務(wù),這樣才會(huì)真正對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作提交保存,否則操作沒(méi)有提交到數(shù)據(jù)中。
到此為止,簡(jiǎn)單的單表操作已經(jīng)完成了,接下來(lái)在下一節(jié)中將會(huì)講解多表聯(lián)合查詢,以及結(jié)果集的選取。 如遇到不明白的問(wèn)題,請(qǐng)留言評(píng)論。
最后,附上項(xiàng)目結(jié)構(gòu)圖,如下:
