MyBatis知识点复习-13Mybatis注解开发
在开始讲解之前,如果你对注解不太熟悉,可以先看看这篇Java基础复习——注解对注解的讲解。由于注解其实与xml本质上是一样的,因此我们注解不会像前面那样还很多篇幅来讲解。
上一篇:MyBatis知识点复习-12mybatis逆向工程
在开始本章的讲解前,我们需要说明一下,现在我们的那些映射配置文件就不再有用了,而是依靠全局配置文件。其内容为:
<?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"></properties>
<typeAliases>
<package name="domain"/>
</typeAliases>
<environments default="development">
<environment id="development">
<!-- 配置JDBC事务控制,由mybatis进行管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源,采用dbcp连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis复习"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="mapper"/>
</mappers>
</configuration>
除了配置数据库连接外,要想使用注解,上面的
<mappers>
<package name="mapper"/>
</mappers>
<typeAliases>
<package name="domain"/>
</typeAliases>
是必要的,第一个指明返回值类所在位置,第二个指明接口所在包。还有一点就是使用注解开发时在接口同一目录下是不允许有他的xml配置文件的。
一.单表操作
1.CRUD操作
在mybatis中CRUD一共有四个注解
@Select
@Insert
@Update
@Delete
我们用UserMapper这个接口来演示,首先把它里面的方法全部删掉,我们重新来。
下面只演示前两个演示:
1.@Select
在UserMapper下面添加如下方法:
@Select("select * from user")
public List<User> findById(int user_id);
执行下面代码:
SqlSession sqlSession1 = build.openSession();
UserMapper mapper = sqlSession1.getMapper(UserMapper.class);
List<User> byId = mapper.findById(1);
for (User user : byId) {
System.out.println(user);
}
sqlSession1.commit();//提交事务,否则会事务回滚
我们发现由于字段名是name,而属性名是username,他们并不对应导致查询到的结果username为null。后面我会讲注解来解决。
那么他是如何实现的呢?我们先来看看如果不用注解,用xml文件配置应该是这样的:
<mapper namespace="mapper.UserMapper">
<select id="findById" resultType="user" parameterType="int">
select * from user
<\select>
<\mapper>
从上面我们可以看得到我们需要的信息为:namespace,id,resultType,parameterType
那么我们看这些信息在UserMapper里面都是有的。
2.>@Insert
在UserMapper下面添加如下方法:
@Insert("insert into user (name,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})")
public int saveUser(User user);
执行下面代码:
SqlSession sqlSession1 = build.openSession();
UserMapper mapper = sqlSession1.getMapper(UserMapper.class);
User user = new User();
user.setUsername("jack");
user.setSex("1");
user.setAddress("湖北");
user.setBirthday(new Date());
int byId = mapper.saveUser(user);
sqlSession1.commit();//提交事务,否则会事务回滚
2.属性别名
前面我们说了username查询结果为空,现在我们来解决。
我们能做如下修改:
@Select("select * from user")
@Results(value={
@Result(id=true,column="id",property = "id"),
@Result(column="name",property = "username"),
@Result(column="sex",property = "sex"),
@Result(column="birthday",property = "birthday"),
@Result(column="address",property = "address")
})
public List<User> findById(int user_id);
再次查询:
成功查到了username。
那么问题来了,这个@Results注解只是作用于findById一个方法,难道以后其他的方法也要再把上面的内容再写一遍?这显然是不合理的,于是我们可以给这个
Results起一个别名,操作如下:
关于上个图中报红错是因为我的mybatis版本是低于3.5.0的,他不支持这功能,但在高版本的情况下是可以使用的,这里我就不去做这些麻烦事了。
二.多表操作
1.一对一
在前面查询user的时候我们没有把orders也查到。现在我们来为大家操作一下。
执行之前的查询代码有:
2.多对多
为方便演示,对orders表数据修改如下:
红框处是对一对一的修改。
我们发现张小明的结果确实查到了两个
User{id=16, username='张小明', sex='1', birthday=null, address='河南郑州', orders=[Orders
[id=3, userId=null, number=1000010, createtime=Wed Feb 04 13:22:35 CST 2015, note=null,
user=null, orderdetails=null], Orders [id=4, userId=null, number=1000011, createtime=Tue
Feb 03 13:22:41 CST 2015, note=null, user=null, orderdetails=null]]}
其实如果用一对多的方式查询也可以查到,不过效率会差一些。
三.缓存配置
由于一级缓存是默认开启的,我们就直接讲二级缓存。如果缓存忘记了可以再复习一下:MyBatis知识点复习-11一级缓存与二级缓存以及ehcache缓存。
第一步当然是先在全局配置文件里开启二级缓存,步骤忘记的可以在复习一下上面这篇文章,这里我跳过。
在接口上面加上注解即可
关于上个图中报红错是因为我的mybatis版本是低于3.5.0的,他不支持这功能,但在高版本的情况下是可以使用的,这里我就不去做这些麻烦事了。
剩下的演示还是参考上面的文章复习即可。
四.方法有多个参数
这种情况下我们需要使用@Param参数来指定参数名字
总结:终于把mybatis讲完了,不过我要说明的是,这些都只是一些浅层的CRUD,简单说,你会,别人也会,因此后面我会在抽空出一个mybatis的源码解读的的系列文章,来一个质的提升。敬请期待吧!