Mybatis的SQL动态代理方式:
使用流程
1.在Mybatis.xml文件中配置Mapper文件扫描
<!-- 配置mapper路径 -->
<mappers>
<!-- mapper配置文件的相对路径 ,便于统一加载解析 -->
<mapper resource="com/sxt/dao/IUserDao.xml"/>
</mappers>
2.定义接口文件和SQL语句配置文件
注意:接口名和SQL语句的配置文件名字必须相同,
方法名和SQL配置文件的标签 ID 名必须相同
目的:在将Mapper接口翻译成对应的实例化对象时,根据此规则可以找到对应的SQL语句
public interface IUserDao {
//Mapper接口中,只需要声明方法名,方法参数、方法返回等信息
public List<User> query();
public Integer add(User user);
public Integer update(User user);
public Integer delete(Integer id);
}
<?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.sxt.dao.IUserDao">
<!-- 结果多条 -->
<select id="query" resultType="com.sxt.pojo.User">
SELECT * FROM mybatis
</select>
<!-- 删除 -->
<delete id="delete" parameterType="int">
DELETE FROM mybatis WHERE userid=#{0}
</delete>
<!-- 增加 -->
<insert id="add" parameterType="com.sxt.pojo.User">
INSERT INTO mybatis(username,userage) VALUE(#{username},#{userage})
</insert>
<!-- 修改 -->
<update id="update" parameterType="User">
UPDATE mybatis SET username=#{username},userage=#{userage} WHERE userid=#{userid}
</update>
</mapper>
3.获取SqlSession对象,来获取Mapper对象的实例化对象
public class UserTest {
private SqlSession session;
private IUserDao dao;
@Before //在所有@Test注解执行之前 执行
public void before() throws IOException{
InputStream in = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
session = factory.openSession();
//getMapper():动态代理 传过去一个接口,返回一个代理对象
dao = session.getMapper(IUserDao.class);
}
@After //在所有@Test注解执行之后 执行
public void After(){
session.commit();
session.close();
}
//查询
@Test
public void test() throws IOException {
List<User> list = dao.query();
for(User users:list){
System.out.println(users);
}
}
//增加
@Test
public void test2() throws IOException{
//使用SqlSession对象完成对数据库的操作
User user = new User();
user.setUsername("张三");
user.setUserage(13);
int count = dao.add(user);
System.out.println("增加的行数"+count);
}
//删除
@Test
public void test3() throws IOException{
//使用SqlSession对象完成CRUD
int count = dao.delete(15);
System.out.println("删除行数"+count);
}
//更新
@Test
public void test4() throws IOException{
//使用SqlSession对象完成CRUD操作
User u = new User();
u.setUserid(16);
u.setUsername("李四");
u.setUserage(88);
int count = dao.update(u);
System.out.println("修改的行数"+count);
}
}
注意:使用mapper接口方式必须满足:
1.映射文件的namespace的值必须是接口的全路径名称
比如:com.sxt.dao.UserMapper
2.接口中的方法名在映射文件中必须有一个和id值对应
3.映射文件的名称必须与接口的名称一致
Mapper接口方法的参数类型以及SQL语句占用
- 无参
- 单参数
基本类型:在SQL语句中使用#{0}
对象类型:在SQL语句中用#{属性名|键名} - 多参数
基本类型:在SQL语句中用#{角标}
基本类型和对象类型混用:在SQL语句中用#{param1}
使用Mybatis的参数注解
- 在Mapper接口中,方法的形参声明中使用注解 @Param(“键名”) ,给形参添加别名
- 在Mapper配置文件中的SQL语句中使用#{注解键名}进行占位
面试题:
问:Mybatis中SQL占位中的 #{ } 和 $ { } 有什么区别?
答:
#{ } 占位的底层用的时PreparedStatement对象进行数据库操作,#{ }占位会翻译成 ? 占位
${ } 占位的底层用的时Statementdx进行数据库操作,会将数据直接拼接在SQL语句中,有SQL注入风险