接下来讲解映射器代理开发,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);
}
}
打印结果: