MyBatis进阶
今天给大家分享以下几个内容
- 注解实现单表开发
- 注解实现多表操作
- MyBatis的SQL构建语句
先给大家介绍以下MyBatis注解开发的几个关键字
注解实现单表开发
在一个表中操作数据比较简单,这里我就直接把增删改查放到一起,步骤如下:
-
先导入MyBatis相关的jar包(因为要用到JDBC相关的类和日志文件所以导入了相应的包)
-
配置MyBatis核心配置文件
<settings>
<!--在控制台显示SQL语句-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<mappers>
<!--加载使用注解的接口所在的包-->
<package name="dao"/>
</mappers>
- 在接口中要实现的方法上面添加注解和要操作数据库的SQL语句(这个接口要写在上一步配置的包下面)
public interface OneToOneMapper {
@Select("select * from Card")
List<Card> findCard();
}
- 编写测试类测试结果
测试类:
public class Test {
private SqlSession sqlSession;
private OneToOneMapper mapper;
public Test() {
this.sqlSession = SqlSessionUtils.getSession();
mapper = sqlSession.getMapper(OneToOneMapper.class);
}
@org.junit.Test
public void test1() {
List<Card> cards = mapper.findCard();
for (Card card : cards) {
System.out.println(card.getId() + "," + card.getNumber());
}
}
}
测试结果:
增删改和上面的步骤差不多,这里我就不一一赘述了。
注解实现多表查询
这里还是分为三种情况来介绍,导包和配置文件和上面的一样。
- MyBatis注解实现一对一的查询
先在CardMapper接口中添加方法和注解:
public interface CardMapper {
@Select("select * from Card")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "number",property = "number"),
@Result(
property = "p",
javaType = Person.class,
column = "pid",
one = @One(select = "onetoone.PersonMapper.findById")
)
})
List<Card> findAll();
}
注意:这里要注意要在接口对应的实体类中添加一个属性对应另外一个实体类。
然后在另一个接口PersonMapper中定义一个方法对应CardMapper中的@One中的方法,
这个方法要传入的参数就是在CardMapper中的SQL语句查询出来的结果中的一个列。
public interface PersonMapper {
@Select("select * from person where id=#{id}")
Person findById(Integer id);
}
最后就是编写测试类来测试结果:
public class Test01 {
private SqlSession sqlSession;
private OneToOneMapper mapper;
private CardMapper cardMapper;
public Test01() {
this.sqlSession = SqlSessionUtils.getSession();
mapper = sqlSession.getMapper(OneToOneMapper.class);
cardMapper = sqlSession.getMapper(CardMapper.class);
}
@Test
public void test1() {
List<Card> cards = mapper.findCard();
for (Card card : cards) {
System.out.println(card);
}
}
@Test
public void test2() {
List<Card> all = cardMapper.findAll();
for (Card card : all) {
System.out.println(card);
}
}
}
查询结果:
2. MyBatis注解实现一对多的查询
定义一个接口ClassesMapper:
这里和一对一不同的是在注解最后使用的是 many = @Many(…)
public interface ClassesMapper {
@Select("select * from classes where id=2")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "name",property = "name"),
@Result(
column = "id",
javaType = List.class,
property = "students",
many = @Many(select = "onetomany.StudentMapper.findStudentByCid")
)
})
List<Classes> findClasses();
}
对应的接口:
public interface StudentMapper {
@Select("select * from student where cid=#{cid}")
List<Student> findStudentByCid(Integer cid);
}
测试类测试结果:
public class Test01 {
private static SqlSession sqlSession;
private static StudentMapper studentMapper;
private static ClassesMapper classesMapper;
static {
sqlSession = SqlSessionUtils.getSession();
classesMapper = sqlSession.getMapper(ClassesMapper.class);
studentMapper = sqlSession.getMapper(StudentMapper.class);
}
@Test
public void test1() {
List<Classes> classes = classesMapper.findClasses();
for (Classes aClass : classes) {
System.out.println(aClass.getId()+","+aClass.getName());
List<Student> students = aClass.getStudents();
for (Student student : students) {
System.out.println("\t"+student);
}
}
sqlSession.close();
}
}
测试结果:
3. MyBatis注解实现多对多的查询
因为多对多就是两个一对多,这里我就不赘述了。
MyBatis的SQL构建语句
简单介绍:
这个内容一般不太常用,我就直接演示一下使用格式。
- 先定义一个类写出想要实现的SQL语句
public class SqlDao {
public String delete() {
SQL sql = new SQL() {
{
DELETE_FROM("student");
WHERE("id=#{id}");
}
};
return sql.toString();
}
}
- 再定义一个接口来调用这个SQL语句
public interface SqlMapper {
@DeleteProvider(type = SqlDao.class, method = "delete")
Integer delete(Integer id);
}
- 编写测试类来测试结果
public class Test {
private SqlSession sqlSession;
private SqlMapper sqlMapper;
public Test() {
this.sqlSession = SqlSessionUtils.getSession();
sqlMapper = sqlSession.getMapper(SqlMapper.class);
}
@org.junit.Test
public void test1() {
Integer delete = sqlMapper.delete(5);
System.out.println(delete);
}
}
测试结果:
以上就是本次文章的介绍,如果有不恰当的地方,欢迎指正。