创建接口
public interface CustomerMapper {
Customer getCustomerById(int id);
List<Customer> selectAll();
}
配置文件中添加sql语句
<select id="getCustomerById" resultType="customer">
select * from customer where id=#{id}
</select>
<select id="selectAll" resultType="customer">
select * from customer
</select>
2.新增
接口中写一个方法
int saveCustomer(Customer customer);
配置文件中编写sql
<insert id="saveCustomer" parameterType="customer">
insert into customer(name,phone,email,level) values(#{name},#{phone},#{email},#{level})
</insert>
3.修改接口中返回值是int类型,我们无需在xml中管这个返回值,默认就有的,修改和删除也是一样的。
接口中创建方法
int updateCustomerById(Customer customer);
配置文件中编写sql
<update id="updateCustomerById" parameterType="customer">
update customer set name=#{name},phone=#{phone},email=#{email},level=#{level}
where id=#{id}
</update>
4.删除
接口中创建方法
int deleteById(int id);
配置文件中编写sql
<delete id="deleteById" parameterType="int">
delete from customer where id=#{id}
</delete>
5.如何获取自增的id值总结:
1、新增 insert , 修改 update , 删除 delete , 查询使用 select 标签
2、新增,修改,删除都需要进行事务的提交才能更新数据。
3、新增,修改,删除 都默认会有一个int类型的返回值,如果想使用这个返回值只需要接口中返回值是int即可。
4、parameterType 就是接口中的参数,类型一定要一致
5、resultType 就是接口中的返回值类型,如果接口的返回值是List集合,此处不需要写成List,而是写list集合中泛型的类型
如果主键是自增的,我如何保存完数据之后就知道该数据在数据库中的id是多少呢?
如何在新增完数据之后,就能拿到新数据在数据库中的id值呢,需要在配置文件中多如下配置:
<selectKey keyColumn="id" keyProperty="id" resultType="int" order="AFTER">
select last_insert_id()
</selectKey>
原理是通过执行mysql 中的一个内置函数 last_insert_id() 查询到最后一个数据的id.
keyColumn 指的是数据库中的字段 id
keyProperty 指的是实体中的字段 id
resultType 返回值类型 int
order 只有两个值 BEFORE AFTER 因为id是数据保存之后才会得出一个的id,所有类型是After
代码演示
<insert id="insertCustomer" parameterType="customer">
<selectKey keyColumn="id" keyProperty="id" resultType="int" order="AFTER">
select last_insert_id()
</selectKey>
insert into customer(name,phone,email,level) values(#{name},#{phone},#{email},#{level})
</insert>
测试代码:
@Test
public void testInsert2() throws IOException {
SqlSession sqlSession = sessionFactory.openSession();
CustomerMapper customerMapper = sqlSession.getMapper(CustomerMapper.class);
Customer customer = new Customer();
customer.setName("老闫");
customer.setPhone("18137884406");
customer.setEmail("838700991@qq.com");
customer.setLevel("年卡会员");
int result = customerMapper.insertCustomer(customer);
System.out.println(result);
System.out.println("保存数据之后,新数据在数据库中的id="+customer.getId());
//记得提交事务,否则数据不保存
sqlSession.commit();
sqlSession.close();
}
6.查询数据时数据库中的字段和实体中的字段不一致,查询不出来,怎么解决?
Customer{id=14, name='刘晓磊', phone='18634455554', email='343223ddddd2@qq.com', level='年卡用户', createTime=null, endTime=null}
需要使用resultMap == 专门解决实体中的属性和数据库中的字段不一致的问题
<resultMap id="customerMap" type="customer">
<!--id 表示该列是一个主键-->
<id property="id" column="id"></id>
<result property="createTime" column="create_time"/>
<result property="endTime" column="end_time"/>
</resultMap>
1、resultMap中的id一般随便写,type就是实体的全路径,可以使用别名。
2、里面的标签 主键使用id标签,普通字段使用 result标签
3、标签里面的property 指的是实体中的属性,column指的是数据库中的字段。
4、只需要编写属性和列不一致的字段即可,无需都写出来
使用的时候,记得resultType 换成 resultMap即可