原始模式开发的弊端
在原始Dao开发中,我们一般需要写接口、实现类和sqlmap
配置文件。但是在实现类中,我们发现其实有很多都是重复代码,比如虽然工厂是单例,可以提取到属性,但是sqlSession
之后都是大同小异,所以Mybatis
提供了动态代理开发技术让我们能只写接口,不写实现类而产生动态生成实现对象。
动态代理开发
动态代理开发有四个需要遵循的原则:
- 接口方法名 ==
sqlMap.xml
中的id名; - 返回值类型与
sqlMap.xml
文件中返回值一致; - 方法的参数与
sqlMap.xml
文件中参数一致; sqlMap.xml
命名空间是接口的全包名。
import java.util.List;
import com.pojo.User;
public interface UserDao {
public User findUserById(Integer i);
public List<User>findUsersByName(String name);
public Long insert(User user);
public Long updateUser(User user);
public Long delete(Integer i);
}
<!-- 命名空间,当不同的sqlMap文件中存在id相同的sql语句时,使用命名空间能给他们区分开来
设置和接口一致,让Mybatis帮我们动态生成对象 -->
<mapper namespace="com.firstday.UserDao">
<!-- 通过ID查询一个用户 -->
<!-- 自动映射的前提是pojo中的属性名和表的字段名完全一致 -->
<select id="findUserById" parameterType="Integer" resultType="com.pojo.User">
select * from user where id = #{a}
</select>
<!-- 占位符
#{} 类似于JBDC的占位符,比如上面的sql语句,传入Integer10时,它就是把Integer10填在占位符的位置
如果是String10,就是把String10填在里面。里面的参数可以随便填,但不能为空。
${} 字符串拼接,如下面的sql语句,传入"五",最终注入数据库的是"%五%"。里面的参数只能写value
#{} 占位符实现字符串拼接,"%${value}%" <==> "%"#{v}"%"
-->
<select id="findUsersByName" parameterType="String" resultType="com.pojo.User">
select * from user where username like "%${value}%"
</select>
<!-- 这里的 #{} 参数不能再随便写了,需要取出来User里的属性-->
<insert id="insert" parameterType="com.pojo.User">
<!-- 返回最新插入的id,底层是mysql提供 -->
<!-- Integer类型,自增长是先保存数据再生成ID,比如uuid,会先生成ID,再保存数据 -->
<selectKey keyProperty="id" resultType="Integer" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
insert into user(username, sex, birthday, address)
values(#{username}, #{sex}, #{birthday}, #{address});
</insert>
<update id="updateUser" parameterType="com.pojo.User">
update user
set username = #{username}, sex = #{sex}, birthday = #{birthday}, address = #{address}
where id = #{id}
</update>
<update id="delete" parameterType="Integer">
delete from user where id = #{aaa}
</update>
</mapper>
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 com.pojo.User;
public class TestAdvanced {
public static void main(String[] args) throws Exception {
//1、加载核心配置文件
String coreXml = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(coreXml);
//2、创建工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//3、获得sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//4、获取sqlSession对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//查询:返回单个对象
User user = userDao.findUserById(1);
System.out.println(user);
//查询:返回集合
List<User> list = userDao.findUsersByName("五");
System.out.println(list);
//删除
// Long delete = userDao.delete(26);
// sqlSession.commit();
//插入
// User newUser = new User("helloworld", "2", new Date(), "aaaaaa");
// Long insert = userDao.insert(newUser);
// sqlSession.commit();
//更新
User newUser = new User("helloworld", "2", new Date(), "aaaaaa");
newUser.setId(16);
Long updateUser = userDao.updateUser(newUser);
sqlSession.commit();
}
}