MyBatis 呼叫儲存過程(詳解)
專案結構
資料表t_user
建立User
package com.po; public class User { private Integer id; private String name; private String sex; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + "]"; } }
建立UserMapper
package com.mapper;
import com.po.User;
public interface UserMapper {
//增加使用者
void addUser(User user);
//刪除使用者
void deleteUser(Integer id);
//根據id查詢使用者
User getUserById(Integer id);
//更新使用者
void updateUser(User user);
}
建立insert_user儲存過程
CREATE PROCEDURE insert_user(OUT u_id INTEGER,IN u_name VARCHAR(20),IN u_sex VARCHAR(20),IN u_age INTEGER)
BEGIN
INSERT INTO t_user (name,sex,age) VALUES (u_name,u_sex,u_age);
SET u_id=LAST_INSERT_ID();
END
在UserMapper.xml中呼叫insert_user儲存過程
<!-- 新增使用者 -->
<insert id="addUser" parameterType="com.po.User" statementType="CALLABLE">
{call insert_user(
#{id,mode=OUT,jdbcType=INTEGER},#{name,mode=IN},#{sex,mode=IN},#{age,mode=IN})}
</insert>
建立deleteUser儲存過程
CREATE PROCEDURE deleteUser(IN u_id INTEGER)
BEGIN
DELETE FROM t_user WHERE id=u_id;
END
在UserMapper.xml中呼叫deleteUser儲存過程
<!-- 刪除使用者 -->
<delete id="deleteUser" parameterType="Integer" statementType="CALLABLE">
{call deleteUser(#{id,mode=IN})}
</delete>
建立updateUser儲存過程
CREATE PROCEDURE updateUser(IN u_id INTEGER,IN u_name VARCHAR(20),IN u_sex VARCHAR(20),IN u_age INTEGER)
BEGIN
UPDATE t_user SET name=u_name,sex=u_sex,age=u_age WHERE id=u_id;
END
在UserMapper.xml中呼叫updateUser儲存過程
<!-- 更新使用者 -->
<update id="updateUser" parameterType="user" statementType="CALLABLE">
{call updateUser(#{id,mode=IN},#{name,mode=IN},#{sex,mode=IN},#{age,mode=IN})}
</update>
建立getUserById儲存過程
CREATE PROCEDURE getUserById(IN u_id INTEGER)
BEGIN
SELECT id,name,sex,age FROM t_user WHERE id=u_id;
END
在UserMapper.xml中呼叫getUserById儲存過程
<!-- 根據id查詢使用者 -->
<select id="getUserById" parameterType="Integer" resultType="user" statementType="CALLABLE">
{call getUserById(#{id,mode=IN})}
</select>
建立UserDao
package com.dao;
import java.io.IOException;
import java.io.InputStream;
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.mapper.UserMapper;
import com.po.User;
public class UserDao {
private SqlSession session=null;
//獲取SqlSession物件
public SqlSession getSqlSession() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(is);
return sessionFactory.openSession();
}
@Test
public void addUser() throws IOException {
session=getSqlSession();
UserMapper um=session.getMapper(UserMapper.class);
User user=new User();
user.setName("jack");
user.setSex("男");
user.setAge(20);
um.addUser(user);
System.out.println("新增成功,增加的id="+user.getId());
session.commit();
session.close();
}
@Test
public void getUserById() throws IOException {
session=getSqlSession();
UserMapper um=session.getMapper(UserMapper.class);
User user=um.getUserById(2);
session.close();
System.out.println(user);
}
@Test
public void updateUser() throws IOException {
session=getSqlSession();
UserMapper um=session.getMapper(UserMapper.class);
User user=um.getUserById(2);
user.setName("john");
user.setSex("男");
user.setAge(30);
um.updateUser(user);
session.commit();
session.close();
}
@Test
public void deleteUser() throws IOException {
session=getSqlSession();
UserMapper um=session.getMapper(UserMapper.class);
um.deleteUser(3);
session.commit();
session.close();
}
}
執行UserDao的addUser()方法:
執行UserDao的deleteUser()方法:
執行UserDao的updateUser()方法:
執行UserDao的getUserById()方法: