mybatis动态代理
mybatis架构图:
使用mybatis查询数据的执行过程:
创建SQLSessionFactoryBuilder对象
2.加载Mybatis核心配置文件,因为创建SQLSessionFactory对象需要获取配置信息。
3.创建SQLSessionFactory对象
4.创建SQLSession对象
5.SQLSession执行查询得到User对象
6.打印结果
7.释放资源(关闭SQLSession对象)
1.1 Mapper动态代理方式
1.配置db.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
2.配置.SqlMapConfig.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="db.properties"/>
<!-- 别名 -->
<typeAliases>
<package name="com.itheima.mybatis.domain"/>
</typeAliases>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接池-->
<dataSource type="POOLED">
<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>
<!-- 加载该包下的所有的mapper文件-->
<package name="com.itheima.mybatis"/>
</mappers>
</configuration>
3.编写.UserMapper接口文件
package com.itheima.mybatis.mapper;
import java.util.List;
import com.itheima.mybatis.domain.User;
public interface UserMapper {
User getUserById(int id);
List<User> findByUserName(String username);
void insertUser(User user);
}
4.配置.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">
<!-- namespace是命名空间,作用sql语句的隔离,后面还有重要作用
#{}作用就是占位符,相当于jdbc的“?”
parameterType:查询的参数类型
resultType:查询结果的数据类型,如果时候pojo应该给全路径。
-->
<!--
Mapper接口开发需要遵循以下规范:
1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
-->
<mapper namespace="com.itheima.mybatis.mapper.UserMapper">
<select id="getUserById" parameterType="int" resultType="user">
SELECT * FROM `user` WHERE id = #{id};
</select>
<select id="findByUserName" parameterType="String" resultType="user">
SELECT * FROM `user` WHERE username like #{username};
</select>
<insert id="insertUser" parameterType="user">
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID();
</selectKey>
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address});
</insert>
</mapper>
5.编写测试类,我们要实现UserMapper里面的方法,不再需要编写它的实现类,只需要获得UserMapper的代理对象,然后通过它的代理对象直接调用相应的方法就行了
如:
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory=null;
@Before
public void init() throws IOException{
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
}
@Test
public void testGetUserById() {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(30);
System.out.println(user);
}
}