0.前言
使用MyBatis会节省很多代码,只需要写一个接口,并且在映射文件中写sql语句,就能很快速的完成需求。先来看一个简单的增删改查。
接口:
public interface AdminMapper {
void insert(Admin admin);
void delete(Integer id);
void update(Admin admin);
Admin getAdmin(Integer id);
}
程序:
public class TestMain {
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(resourceAsStream);
}
@Test
public void Test_1() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try {
AdminMapper mapper = openSession.getMapper(AdminMapper.class);
//增加一个admin
Admin admin = new Admin(null,"xiaoming","123456");
mapper.insert(admin);
//获取一个admin
Admin admin1 = mapper.getAdmin(1);
System.out.println(admin.toString());
//删除
mapper.delete(6);
//更新
Admin admin2 = new Admin(1,"jjjj","123456");
mapper.update(admin2);
openSession.commit();
} finally {
openSession.close();
}
}
}
映射配置文件:
<?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.liulu.mybatis.dao.AdminMapper">
<select id="getAdmin" resultType="com.liulu.mybatis.domain.Admin">
select * from admin where id = #{id}
</select>
<insert id="insert" >
insert into admin(username,password)
value (#{username},#{password})
</insert>
<delete id="delete">
delete from admin
where id = #{id}
</delete>
<update id="update">
update admin
set username = #{username},
password = #{password}
where id = #{id}
</update>
</mapper>
本文主要讲映射文件的使用,也算是一个复习的笔记,在官方文档中也有介绍:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html
1.insert获取主键的值
在jdbc中获取主键的值可以使用statement.getGenreatedKeys()方法来获取,在MyBatis中对映射文件进行相应的配置就可以自动的封装在javaBean中了。useGeneratedKeys=“true”:表示使用自增主键属性, keyProperty=“id”:将自增的主键赋值给id
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into admin(username,password)
value (#{username},#{password})
</insert>
执行这段代码将会得到自增的主键。
AdminMapper mapper = openSession.getMapper(AdminMapper.class);
//增加一个admin
Admin admin = new Admin(null,"alu4r","123456");
mapper.insert(admin);
System.out.println(admin.getId());
2.参数的处理
当接口中定义了多个方法时,将不能使用#{…}的方式:
<select id="getAdmin" resultType="com.liulu.mybatis.domain.Admin">
select * from admin where id = #{id} and username = #{username}
</select>
这样使用将会出现异常:
提示找不到参数id,在xml中只能写成paramx的形式。比如
需要这样使用才不会出错。
2.1 使用注解@Param(“…”)
**如果需要写成#{id}、#{usernaem}**的方式就需要在接口声明方法的时候这样做:
Admin getAdmin(@Param("id") Integer id,@Param("username") String username);
2.2 使用java Bean
新建一个类,数据成员写相应的属性
public class ParamBean {
Integer id;
String username;
public ParamBean(Integer id, String username) {
this.id = id;
this.username = username;
}
}
_____________________________________________________
@Test
public void Test_1() throws IOException {
String resource = "mybatis-config.xml";
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession openSession = sqlSessionFactory.openSession();
try {
AdminMapper mapper = openSession.getMapper(AdminMapper.class);
//增加一个admin
Admin admin = mapper.getAdmin(new ParamBean(7,"alu4rP"));
System.out.println(admin.toString());
openSession.commit();
} finally {
openSession.close();
}
}
这个java Bean被称作数据传输对象TO
此外当传入的参数是一个map的时候,在映射文件中写sql的时候可以使用 "#{map中的key} "就可以直接获取键对应的值。那么如果传的是一个List或者数组,那么我们需要通过#{list[0]}或者#{array[0]}来引用
3.#和$的区别
通过测试我们可以发现#是已占位符的方式来预编译sql语句的,而KaTeX parse error: Expected 'EOF', got '#' at position 7: 则不是,使用#̲可以防止sql注入。此外我们在…,比如有多个表2016_info、2017_info、2018_info,使用${year}_info来拼接表名,而且sql中不允许使用#的方式来为表名做占位符。
4.查询返回类型
当需要返回一个List的时候,resultType中设置list包装的类型,myBatis会自动把他转为list。
当返回Map<String,Admin>时,需要设置key由什么来充当:
5.reslutMap
他的作用就是定义映射规则、级联的更新。定义结果映射集的关系,也就是sql到javaBean的关系。通过官方文档有以下几个标签:
结果映射写在这里
6.结束语
主要把比较重要的列出来,具体使用的时候可以直接看文档。
不对之处!请多指教。