ssm之路(4)mapper代理

接下来讲解映射器代理开发,MyBatis的自动自动生成映射接口实现类的代理对象。

遵循规范:

1.namespace要等于映射器接口的地址

2.mapper.java接口中的方法名和mapper.xml中的ID一致

3.mapper.java接口方法输入参数类型和mapper.xml的参数类型一致

4.mapper.java接口方法返回值类型和mapper.xml的与resultType一致

遵循规范,只为能按照反射,动态代理生成

SqlSession sqlSession=sqlSessionFactory.openSession();
User book=sqlSession.selectOne("test.findBookById",id);
sqlSession.close();

中的用户书= sqlSession.selectOne(“test.findBookById”,id);这句代码,根据不同标签(sselect,insert,)就可以生成相应代理对象了test.findBookById变量对象的test与namespace空间一致了,findBookById与方法名一致了,故可以通过反射进行正确的动态调用。开发规范就是通过反射对用户book = sqlSession.selectOne(“test.findBookById”,id),insert,update等代码的生成,mappper代理就是对原始DAO开发的进一步封装而已:

代码案例:

数据库结构:

目录结构:

实体类:用户:(构建实体类时,除了吸气剂,设置器,还要把实体类的构造器方法写上,以及的toString方法写上,方法结果的返回处理)

public class User {
    private int id;

    private String name;

    private int age;

    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

}

usermapper接口类:

public interface UserMapper {
    public User findUserById(int id)throws Exception;
    public void insertUser(User user)throws Exception;

}

映射器映射文件:

<?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.lmj.ssm.mapper.UserMapper">
    <select id="findUserById" parameterType="int" resultType="com.lmj.ssm.pojo.User">
	select * from user where id=#{id}
	</select>

	<select id="findUserByName" parameterType="java.lang.String" resultType="com.lmj.ssm.pojo.User">
	select * from user where name like '%${value}%'
	</select>


	<insert id="insertUser" parameterType="com.lmj.ssm.pojo.User">
		<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
			select last_insert_id()
		</selectKey>
	insert into user(name,age) value(#{name},#{age})
	</insert>

</mapper>

MyBatis的-配置的全局配置文件:

<?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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/ssm?autoReconnect=true&useUnicode=true&characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

JUnit的测试文件:

public class Test {
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession sqlSession=sqlSessionFactory.openSession();

    public Test() throws IOException {
    }


    @org.junit.Test
    public void findUaerById() throws Exception {
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//对于findUserById而言,如果mapper方法返回单个pojo对象(非集合),代理对象内部通过selectOne查询
如果返回集合对象,代理对象内部通过selectList查询数据库。
mapper接口方法的参数只有一个,但它不影响系统的性能。可通过包装类型的pojo来满足业务需求,也可以用map,方法色参数可以使用包装类型,service不要用包装类型
        User user = userMapper.findUserById(1);
        System.out.println(user);
    }
}

打印结果:

猜你喜欢

转载自blog.csdn.net/qq_41063141/article/details/83782423