MyBatis-映射文件-增删改查的实现
数据库名:mybatis(mysql数据库)
表名:tbl_employee
id | last_name | gender | |
---|---|---|---|
1 | Tom | Tom.com | 1 |
2 | Tina | Tina.com | 0 |
目录结构:
JavaBean:Employee.java
package bean;
public class Employee {
private Integer id;
private String lastName; // 这里的lastName与数据库中的字段(last_name)不相同
private String email;
private String gender;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
// 无参构造器
public Employee() {
super();
}
// 有参构造器
public Employee(Integer id, String lastName, String email, String gender) {
super();
this.id = id;
this.lastName = lastName;
this.email = email;
this.gender = gender;
}
@Override
public String toString() {
return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + "]";
}
}
接口:EmployeeMapper.java
package dao;
import bean.Employee;
public interface EmployeeMapper {
public Employee getEmpById(Integer id);
// 增删改的返回值可以定义成Integer、Long、Boolean类型或者void
public Integer addEmp(Employee employee);
public Long updateEmp(Employee employee);
public void deleteEmp(Integer id);
}
sql映射文件:EmployeeMapper.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="dao.EmployeeMapper">
<!-- 查询 public Employee getEmpById(Integer id); -->
<select id="getEmpById" resultType="bean.Employee">
select id,last_name,email,gender from tbl_employee where id = #{id}
</select>
<!-- 插入 public void addEmp(Employee employee); -->
<!-- parameterType可以省略 -->
<!-- MySQL支持自增主键,自增主键值的获取,MyBatis是利用statement.getGeneratedKeys()方法 -->
<!-- useGeneratedKeys="true" 使用自增主键获取主键值策略 -->
<!-- keyProperty:指定对应的主键属性,也就是MyBatis获取到主键值后把这个值封装给JavaBean的哪个属性 -->
<insert id="addEmp" parameterType="bean.Employee"
useGeneratedKeys="true" keyProperty="id">
insert into
tbl_employee(last_name,email,gender)
values(#{lastName},#{email},#{gender})
</insert>
<!-- 更新 public void updateEmp(Employee employee); -->
<update id="updateEmp">
update tbl_employee set last_name =
#{lastName},email=#{email},gender=#{gender} where id = #{id}
</update>
<!-- 删除 public void deleteEmp(Integer id); -->
<delete id="deleteEmp">
delete from tbl_employee where id = #{id}
</delete>
</mapper>
全局配置文件:mybatis-config.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>
<properties resource="dbconfig.properties"></properties>
<settings>
<!-- 设置是否开启驼峰命名,默认是false -->
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
<environments default="development">
<!-- 配置MySQL数据库的连接信息 -->
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!-- 因为上面通过properties标签引入了数据库连接相关的properties文件, 所以这里不再直接写数据库连接的相关信息,而是引用dbconfig.properties文件中的值 -->
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 批量注册 -->
<package name="dao" />
</mappers>
</configuration>
该全局配置文件中引用到的dbconfig.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
测试文件:MyBatisTest.java
package test;
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 dao.EmployeeMapper;
public class MyBatisTest {
// 获取SqlSessionfactory对象的方法
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
// 1.获取到的SqlSession不会自动提交
SqlSession openSession = sqlSessionFactory.openSession();
try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
// 查询
/*
* Employee employee = mapper.getEmpById(1);
* System.out.println(employee);
*/
// 添加
/*
* Employee employee = new Employee(null,"david","david.com","1");
* mapper.addEmp(employee); System.out.println(employee.getId());
*/
// 修改
/*
* Employee employee = new Employee(3,"Tom","jerry.com","1"); Long
* updateEmp = mapper.updateEmp(employee);
* System.out.println(updateEmp);
*/
// 删除
mapper.deleteEmp(2);
// 2.手动提交数据
openSession.commit();
} finally {
openSession.close();
}
}
}
注:每次测试一种操作,将其余操作注释掉
总结:
1.使用接口式编程时,sql映射文件中的namespace要赋值为接口的全类名
2.sql映射文件一定要在全局配置文件中注册,可以采用批量注册的方式
3.对于增删改操作,在接口中定义方法时返回值可以是Integer、Long、Boolean或者void
如果定义成Integer,执行成功返回1,失败返回0
4.对于增删改操作,是否需要手动提交数据:取决于调用的openSession方法
sqlSessionFactory.openSession()====》需要手动提交数据 openSession.commit();
sqlSessionFactory.openSession(true)====》自动提交
5.在全局配置文件中开启驼峰命名后,即使数据库表中的字段名是last_name,而JavaBean的属性为lastName,也可以封装成功
6.对于增删改查操作,在sql映射文件的mapper标签内要使用对应的标签进行配置
7.对于插入操作,mysql数据库支持自增主键,只需要在映射文件的insert标签内加上useGeneratedKeys=“true” keyProperty=“id” ,表示使用自增主键策略并指定主键对应的JavaBean属性