一、准备工作
1、创建数据库中对应的 JavaBean
public class Employee {
private Integer id;
private String lastName;
private String gender;
private String email;
public Employee() {
}
public Employee(Integer id, String lastName, String gender, String email) {
this.id = id;
this.lastName = lastName;
this.gender = gender;
this.email = email;
}
}
2、创建对应的 mapper 接口
public interface EmployeeMapper {
public Employee getEmpById(Integer id);
public void addEmp(Employee employee);
public void updateEmp(Employee employee);
public void deleteEmpById(Integer id);
}
二、实现CRUD(单表)
使用 EmployeeMapper.xml 完成对 tbl_employee 表的增删改查
1、查询select
<!--
public Employee getEmpById(Integer id);
-->
<select id="getEmpById" resultType="com.njf.mybatis.bean.Employee">
select id, last_name lastName, email, gender from tbl_employee where id = #{id}
</select>
2、插入insert
<!--
public void addEmp(Employee employee);
-->
<insert id="addEmp" parameterType="com.njf.mybatis.bean.Employee">
insert into tbl_employee(`last_name`, `email`, `gender`)
values(#{lastName}, #{email}, #{gender})
</insert>
3、更新 update
<!--
public void updateEmp(Employee employee);
-->
<update id="updateEmp">
update tbl_employee set
`last_name` = #{lastName},
`email` = #{email},
`gender` = #{gender}
where id = #{id}
</update>
4、删除 delete
<!--
public void deleteEmpById(Integer id);
-->
<delete id="deleteEmpById">
delete from tbl_employee where id = #{id}
</delete>
5、测试
public SqlSessionFactory getsqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}
@Test
public void testQuery() throws IOException {
//1、获取 sqlSessionFactory
SqlSessionFactory sqlSessionFactory = getsqlSessionFactory();
//2、获取 sqlSession 实例,能直接执行已经映射的 SQL 语句
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//3、获取接口的实现类对象
/**
* 推荐使用
* 会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
*/
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
Employee emp = employeeMapper.getEmpById(1);
System.out.println(emp);
} finally {
sqlSession.close();
}
}
@Test
public void testAdd() throws IOException {
//1、获取 sqlSessionFactory
SqlSessionFactory sqlSessionFactory = getsqlSessionFactory();
//2、获取 sqlSession 实例,能直接执行已经映射的 SQL 语句, 此时sqlSession不会自动提交数据
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//3、获取接口的实现类对象
/**
* 推荐使用
* 会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
*/
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
Employee employee = new Employee(2, "John", "1", "john@126.com");
employeeMapper.addEmp(employee);
System.out.println("employee = " + employee.getId());
sqlSession.commit();
} finally {
sqlSession.close();
}
}
@Test
public void testUpdate() throws IOException {
//1、获取 sqlSessionFactory
SqlSessionFactory sqlSessionFactory = getsqlSessionFactory();
//2、获取 sqlSession 实例,能直接执行已经映射的 SQL 语句
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//3、获取接口的实现类对象
/**
* 推荐使用
* 会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
*/
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
Employee employee = new Employee(2, "John", "1", "john@163.com");
employeeMapper.updateEmp(employee);
sqlSession.commit();
} finally {
sqlSession.close();
}
}
@Test
public void testDelete() throws IOException {
//1、获取 sqlSessionFactory
SqlSessionFactory sqlSessionFactory = getsqlSessionFactory();
//2、获取 sqlSession 实例,能直接执行已经映射的 SQL 语句
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//3、获取接口的实现类对象
/**
* 推荐使用
* 会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
*/
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
employeeMapper.deleteEmpById(2);
sqlSession.commit();
} finally {
sqlSession.close();
}
}
6、小结
(1)mapper 标签里面的 namespace 属性是名称空间,指定为接口的全类名;
(2)每个标签里面的 id 表示唯一表示,用于绑定方法名;
(3)resultType:返回值类型,mybatis 查询完数据要封装为什么类型;
(4)#{id}:从传递过来的参数中取出 id值;
三、CRUD 的返回值问题
1、原生JDBC返回值
在使用原生的 JDBC 时,可以使用 executeQuery 执行 SQL 查询语句,返回的是 ResultSet 一个集合;
使用 executeUpdate() 用于执行增删改语句,返回一个 int 类型的值,表示对数据库影响的行数;
使用 execute() 执行的 SQL 语句,返回的是一个 boolean 值,如果为 true,表示执行成功,如果为 false,表示执行失败。
2、MyBatis 中的返回值
Mybatis允许增删改直接定义以下类型返回值:Integer、Long、Boolean、void
如果在 mapper 接口中方法的返回值不是 void,而是 Integer、Long 或 Boolean ,在使用 Mybatis 执行时,会根据返回值类型自动返回值。
代码示例:
Mapper 接口方法(返回值不再为 void,而是 Integer或 boolean)
//修改员工信息
public int updateEmp(Employee employee);
//删除员工信息
public boolean deleteEmpById(Integer id);
Mapper 映射文件(不需要改动)
<!--
public int updateEmp(Employee employee);
-->
<update id="updateEmp">
update tbl_employee set
`last_name` = #{lastName},
`email` = #{email},
`gender` = #{gender}
where id = #{id}
</update>
<!--
public boolean deleteEmpById(Integer id);
-->
<delete id="deleteEmpById">
delete from tbl_employee where id = #{id}
</delete>
测试:
//测试:修改员工信息
int result = empMapper.updateEmp(new Emp(10,"张11",22,"男"));
System.out.println("result=" + result); //result = 1 表示操作成功,影响一行数据
//测试:删除员工信息
boolean i = empMapper.deleteEmp("11");
System.out.println("result=" + i); //result = true 表示操作成功,返回 true
四、注意
1、获取 SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();//需要手动处理事务
因为在 mybatis-config.xml 中的事务使用原生的 JDBC,所以当进行增删改操作后,还需要手动进行提交或回滚,sqlSession.commit() 或 sqlSession.rollback()。
<transactionManager type="JDBC" />
2、自动提交的 SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(true);//自动处理事务
这种获取 SqlSession 的方式会自动处理事务,不需要再手动提交了。