版权声明:版权归JansonLin所有,转载请标明出处。 https://blog.csdn.net/Janson_Lin/article/details/83824200
Mapper介绍
Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
Mapper接口开发需要遵循以下规范:
- Mapper.xml文件中的namespace与mapper接口的类路径相同。
- Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
- Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
- Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同、
Mapper编写
定义mapper映射文件UserMapper.xml和UserMapper接口
将UserMapper.xml放在mapper目录下,效果如下:
UserMapper.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.janson.mapper.UserMapper">
<!-- 查找用户 -->
<!--
属性:
id:声明的唯一标识
paramterType:传入参数类型
resultType:返回值的类型
-->
<select id="findById" parameterType="Integer" resultType="User">
select * from user where id=#{v}
</select>
<!-- 通过名字模糊搜索用户 -->
<select id="findUserByName" parameterType="String" resultType="User">
select * from user where username like "%"#{v}"%"
</select>
<!-- 添加用户 -->
<insert id="insertUser" parameterType="User">
<selectKey keyProperty="id" resultType="Integer" order="AFTER">
<!-- 这里是查找出最新插入数据库中的一ID值 -->
select LAST_INSERT_ID()
</selectKey>
insert into user(username,sex,birthday,address) values(#{username},#{sex},#{birthday},#{address})
</insert>
<!-- 修改用户 -->
<update id="updateUser" parameterType="User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="Integer">
delete from user where id = #{id}
</delete>
</mapper>
这里的xml文件使用了别名,在这里介绍一下别名的书写,在SqlMapConfig.xml中配置<typeAliases>属性,注意这个属性不能在<properties>属性之前(<properties>是配置jdbc这类文件的标签)
<!-- 配置别名 -->
<typeAliases>
<package name="com.janson.pojo"/>
</typeAliases>
package中可以配置类的路径,不过这里建议使用配用包名,这样在这个包下面的所有类就自动配上别名了,例如User.java这个类,我们的别可以使用user和User这两个都可以。
UserMapper.java
package com.janson.mapper;
import java.util.List;
import com.janson.pojo.User;
public interface UserMapper {
//1.名字与xml中的id相同
//2.返回值类型与xml中的resultType相同
//3.传入的参数类型与xml中的parameterType相同
//接口的名字要与xml的名字相同
public User findById(Integer id);
public List<User> findUserByName(String name);
public void insertUser(User user);
public void updateUser(User user);
public void deleteUser(Integer id);
}
测试代码
package com.janson.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
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 org.junit.Test;
import com.janson.mapper.UserMapper;
import com.janson.pojo.User;
public class MybatisMapperTest {
@Test
public void findById() throws IOException {
String resource = "sqlMapConfig.xml";
InputStream inputStream =
Resources.getResourceAsStream(resource);
//创建sqlsessoionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建sqlsession
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.findById(1);
System.out.println(user);
}
@Test
public void findByNameTest() throws Exception {
//加载配置文件
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建sqlsessoionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建sqlsession
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> list = mapper.findUserByName("janson");
for (User user : list) {
System.out.println(user);
}
}
//添加用户
@Test
public void insertUserTest() throws Exception {
//加载配置文件
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建sqlsessoionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建sqlsession
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User();
user.setAddress("111");
user.setUsername("linjanson");
user.setSex("男");
user.setBirthday(new Date());
mapper.insertUser(user);
session.commit();
System.out.println(user.getId());
}
//修改用户
@Test
public void updateUserTest() throws Exception {
//加载配置文件
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建sqlsessoionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建sqlsession
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User();
user.setId(29);
user.setAddress("22222");
user.setUsername("jansonlin");
user.setSex("男");
user.setBirthday(new Date());
mapper.updateUser(user);
session.commit();
System.out.println(user.getId());
}
//删除用户
@Test
public void deleteUserTest() throws Exception {
//加载配置文件
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建sqlsessoionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建sqlsession
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.deleteUser(29);
session.commit();
}
}
mapper动态代理编程比原始的Dao编程快捷,方便,建议使用mapper动态编程。