一、使用注解CRUD
(1)创建接口类
注解使用方法如下
Mybatis提供了Select,Insert,Update,Delete四个主要注解
package com.itheima.dao;
import com.itheima.domain.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface IUserDao {
@Select("select * from user")
List<User> findAll();
@Select("select * from user where id = #{id}")
User findById(Integer id);
@Insert("insert into user(username,birthday,address,sex) values (#{username},#{birthday},#{address},#{sex})")
@SelectKey(keyProperty = "id",keyColumn = "id",resultType = Integer.class,before = false,statement = "select last_insert_id()")
int insertUser(User user);
@Update("update user set username=#{username},address=#{address},birthday=#{birthday},sex=#{sex} where id=#{id}")
int updateUser(User user);
@Delete("delete from user where id = #{id}")
int deleteUser(Integer id);
@Select("select count(*) from user")
int countTotal();
@Select("select * from user where username like #{username}")
List<User> findByName(String username);
}
(2)创建实体类
生成对应的get&set&toString
(3)编写测试类
package com.itheima.test;
import com.itheima.dao.IUserDao;
import com.itheima.domain.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class annotationsTest {
private InputStream in;
private SqlSessionFactory factory;
private SqlSession session;
private IUserDao userDao;
@Before
public void init() throws Exception{
in = Resources.getResourceAsStream("SqlMapConfig.xml");
factory = new SqlSessionFactoryBuilder().build(in);
session = factory.openSession();
userDao = session.getMapper(IUserDao.class);
}
@After
public void destroy() throws Exception{
session.commit();
in.close();
}
@Test
public void testFindAll(){
List<User> users = userDao.findAll();
for (User u:users){
System.out.println(u);
}
}
@Test
public void testFindById(){
User user = userDao.findById(76);
System.out.println(user);
}
@Test
public void testInsertUser(){
User user = new User();
user.setUsername("Annotation insert ");
user.setAddress("金华市(注解插入)");
user.setSex("女");
user.setBirthday(new Date());
//res为查询出来的行结果
int res = userDao.insertUser(user);
System.out.println("插入条数为:"+ res);
System.out.println("新插入的id为:"+ user.getId());
System.out.println(userDao.findById(user.getId()));
}
@Test
public void testUpdateUser(){
User user = userDao.findById(74);
user.setUsername("update 老新新");
int res = userDao.updateUser(user);
System.out.println("更新条数为:"+ res);
System.out.println("更新后的数据为"+ userDao.findById(74));
}
@Test
public void testDeleteUser(){
int res =userDao.deleteUser(77);
System.out.println("删除条数为:"+ res);
System.out.println("删除老mybatis 02");
}
@Test
public void testCountTotal(){
int res = userDao.countTotal();
System.out.println("总数为 : " + res);
}
@Test
public void testFindByName(){
List<User> users = userDao.findByName("%老新%");
for (User u:users){
System.out.println(u);
}
}
}
testFindAll测试如下:
testFindByName测试结果如下:
testFindById测试结果如下:
testInsertUser测试结果如下:
testUpdateUser测试结果如下:
testDeleteUser测试结果如下:
testCountTotal测试结果如下:
二、复杂关系映射
@Results 注解 代替的是标签<resultMap>
该注解中可以使用单个@Result 注解,也可以使用@Result 集合
即:@Results({@Result(),@Result()})或@Results(@Result())
@Resutl 注解 代替了 <id>
标签和<result>
标签
@Result 中 属性介绍:
id 是否是主键字段
column 数据库的列名
property 需要装配的属性名
one 需要使用的@One 注解(@Result(one=@One)()))
many 需要使用的@Many 注解(@Result(many=@many)()))
@One 注解(一对一) 代替了<assocation>
标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
@One 注解属性介绍:
select 指定用来多表查询的 sqlmapper
fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。。
使用格式:@Result(column="",property="",one=@One(select=""))
@Many 注解(多对一) 代替了<Collection>
标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。
注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType (一般为 ArrayList)但是注解中可以不定义;
使用格式: @Result(property="",column="",many=@Many(select=""))
1、一对一关系映射
(1)新建Account实体类
并生成与数据库列名对应的字段,以及user对象,以及对应的set&get&tostrng
(2)新建IAccountDao接口
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;
import java.util.List;
public interface IAccountDao {
/**
* 查询所有账户,采用延迟加载的方式查询账户的所属用户
* * @return */
@Select("select * from account")
@Results(id="accountMap",
value= {
//id = true为表示id为主键
@Result(id=true,column="id",property="id"),
@Result(column="uid",property="uid"),
@Result(column="money",property="money"),
@Result(column="uid",property="user",
//select表示指定多表查询的映射sqlmapper,fatchType表示取得的方式,这里使用懒加载
one=@One(select="com.itheima.dao.IUserDao.findById",
fetchType= FetchType.LAZY))})
List<Account> findAll();
}
(3)编写测试类
测试延迟加载
只查询了一个account表
补全后,查询成功,查出了该账户对应的用户信息,并且是懒加载的形式
2、一对多关系映射
(1)编写IAccountDao文件
加入这一段,表示查对应uid的所有账户,返回一个集合
(2)编写IUserDao文件
(3)修改实体类
修改user实体类
添加接收的一个Account集合,并生成get&set,并重新生成toString
修改Account实体类
由于在上面一对一的时候我们在Account类中添加了User对象,现在去掉,并重新生成toString
(4)编写测试类
package com.itheima.test;
import com.itheima.dao.IUserDao;
import com.itheima.domain.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.List;
public class annotationOne2Many {
private InputStream in;
private SqlSessionFactory factory;
private SqlSession session;
private IUserDao userDao;
@Before
public void init() throws Exception{
in = Resources.getResourceAsStream("SqlMapConfig.xml");
factory = new SqlSessionFactoryBuilder().build(in);
session = factory.openSession();
userDao = session.getMapper(IUserDao.class);
}
@After
public void destroy() throws Exception{
session.commit();
in.close();
}
@Test
public void testOne2Many(){
List<User> users = userDao.findAll();
for (User user:users){
if (user.getAccounts().size() > 0){
System.out.println("-----one data------");
System.out.println(user);
System.out.println(user.getAccounts());
}
}
}
}
运行结果:
结果正确,并使用了延迟加载
可以发现,使用注解确实比使用XML简便很多!因为少了编写复杂的xml文件,但是为什么xml文件这么多东西,一个简单的注解就可以解决呢?
拿IUserDao.xml和使用注解的IUserDao接口来说,对应的颜色为对应的属性,注解里面的字符串 对应xml的sql语句
1、xml的全限定类名namespace
由注解所在接口的包名+类名
找到
2、xml中绿色线条的唯一标志id
,对应注解所在接口的方法名
。
3、返回值类型resultType
对应 注解所在接口的那个方法的返回值
二、使用二级缓存
注解使用二级缓存并没有什么其他的,测试类和其他都和上一篇SSM学习之路——Mybatis第四天_一级缓存和二级缓存
没什么区别,只是使用了注解而不是使用XML,开启注解只需要加上第一个红框框的@CacheNamespace(bloking = true)
即可
注解到此结束,我的Mybatis学习也告一段落
用了超级久学Myabatis,每次都是零碎的学一点,并且时间大多花在编写调试之后 写的学习笔记blog,以往我学习东西,都是学了之后很久不用,后来就直接忘记了,又要重新查找资料,这次想好好的学习并且记录下属于自己的笔记,虽然编写记录blog确实非常费时间,都能够让我再看多一些内容,但是考虑到长远的回顾,觉得还是有必要花这一些时间,并且在学习之后可以巩固,因为在编写blog的过程中,有时候忘记了一个知识点,可以及时的再看一遍视频加深印象,看的视频是bilibili的黑马程序员的Mybatis教程,老师讲的很好,受益匪浅。加快学习SSM框架,完成进度1/3。