我是靠谱客的博主 兴奋可乐,这篇文章主要介绍实验三 在实验二的基础上使用注解在Mybatis框架中完成增删改查操作,现在分享给大家,希望可以做个参考。

Mybatis的xml映射文件与注解方式有些许区别,具体体现在Mybatis配置文件与Mapper接口中。

1、mybatis配置文件
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?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标签加载外部properties文件--> <properties resource="jdbc.properties"></properties> <!-- 自定义别名 --> <!-- <typeAliases>--> <!-- <typeAlias type="com.yjx.pojo.Student" alias="student"></typeAlias>--> <!-- <typeAlias type="com.yjx.pojo.Book" alias="book"></typeAlias>--> <!-- </typeAliases>--> <!-- 配置当前数据源的环境--> <environments default="development"> <environment id="development"> <!-- 事务管理器 --> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!-- 加载映射文件 --> <mappers> <!-- <mapper resource="com/yjx/mapper/StudentMapper.xml"></mapper>--> <!-- <mapper resource="com/yjx/mapper/BookMapper.xml"></mapper>--> <mapper class="com.yjx.mapper.BookMapper"></mapper> </mappers> </configuration>

<typeAliases>标签:用于为实体类定义别名,不用每次都写详细路径,在使用注解的情况下并不生效,可以注释掉。
<mapper>标签:用于加载数据层接口映射文件,里面有resource、url、class 3个属性,由于使用注解的方式,不需要mapper映射文件,所以resource属性是无法找到指定资源的。我们需要用class属性去找到对应的接口类或用package标签匹配到指定的包文件。

2、Mapper接口
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.test.mapper; import com.test.pojo.Book; import org.apache.ibatis.annotations.*; import java.util.List; public interface BookMapper { // 查询所有图书 @Select("select * from book") List<Book> findAllBook(); @Insert("insert into book(bookname,author,publicationdate,price) values(#{bookname},#{author},#{publicationdate},#{price})") @Options(useGeneratedKeys = true,keyProperty = "id") void addBook(Book book); @Delete("delete from book where id=#{id}") void delBook(int id); @Update("update book set price = #{price} where id = #{id}") void updateBook(Book book); }

可以看到,最大的不同就是:之前我们在mapper映射文件中实现的具体数据库操作,都换成了在接口类中的注解。<select>标签对应 @Select 标签,在括号中填写具体的sql代码即可完成数据库操作,其他update、delete、insert同样。

动态sql语句用标签怎么来实现呢?
provider系类标签来实现

参考例子
我需要做一个条件模糊查询功能,当没有筛选条件的时候,默认查询全部图书;当有输入书名或者作者时,按条件查询。
在mapper中新建一个方法findBooks

复制代码
1
2
3
4
// 条件模糊查询功能 @SelectProvider(type = BookProvider.class,method = "selectByif") List<Book> findBooks(Book book);

可以看到,和普通查询不同,条件查询用的是 @SelectProvider 标签,而且里面写的不是sql语句。
type属性是用于指定具体实现动态SQL类,该类必须能通过无参构造方法来进行初始化!
method属性是用来指定你要返回的查询语句的方法,方法必须是public,返回值必须是String,可以是static或非static的。

在例子中,我指定了BookProvider类中的selectByif中的方法

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.test.mapper; import com.test.pojo.Book; import org.apache.ibatis.jdbc.SQL; public class BookProvider { public String selectByif(final Book book){ return new SQL(){ { SELECT("*").FROM("book"); if(book.getBookname() !=null && book.getBookname() != ""){ WHERE("bookname like" + "'%" + book.getBookname() +"%'"); } if (book.getAuthor() != null && book.getAuthor() != ""){ WHERE("author like" + "'%" + book.getAuthor() + "%'"); } } }.toString(); } }

BookProvider类的selectByif的方法其实就是一个普通的方法,通过字符串拼接技术,用if来判断是否需要拼接字符串,方法运行结束后会返回一个SQL语句给数据库进行操作。

其他的insert、update、delete对应于@InsertProvider、@UpdateProvider、@DeleteProvider,使用方法与@SelectProvider完全一致。

@UpdateProvider
在BookProvider类里面加入一个update新方法

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public String update(Book book){ return new SQL(){ { UPDATE("book") ; if(book.getBookname() != null && book.getBookname() != ""){ SET("bookname=#{bookname}"); } if (book.getAuthor() != null && book.getAuthor() != ""){ SET("author=#{author}"); } Integer point= book.getPrice(); if (point != null){ SET("price=#{price}"); } if (book.getPublicationdate() != null){ SET("publicationdate=#{publicationdate}"); } WHERE("id=#{id}"); } }.toString(); }

相应的接口方法改为

复制代码
1
2
3
@UpdateProvider(type = BookProvider.class,method = "update") void updateBook(Book book);
3、测试类
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import com.mysql.cj.xdevapi.SessionFactory; import com.yjx.mapper.BookMapper; import com.yjx.pojo.Book; 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.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; public class mybatisTest { private InputStream resourceAsStream; private SqlSessionFactory sqlSessionFactory; private SqlSession sqlSession; private BookMapper bookMapper; @Before public void init() throws IOException { resourceAsStream = Resources.getResourceAsStream("mybatis.xml"); sqlSessionFactory =new SqlSessionFactoryBuilder().build(resourceAsStream); sqlSession = sqlSessionFactory.openSession(true); bookMapper = sqlSession.getMapper(BookMapper.class); } @Test public void testAnnoSelect(){ List<Book> books = bookMapper.findAllBook(); for (Book book : books) { System.out.println(book); } } @Test public void testAnnoAdd(){ Book book = new Book(); book.setBookname("我爱JavaEE"); book.setAuthor("yjx"); book.setPublicationdate(new Date()); book.setPrice(100); bookMapper.addBook(book); // sqlSession.commit(); } // 更新 @Test public void testAnnoUpdate(){ Book book = new Book(); book.setId(10); book.setPrice(99); book.setAuthor("yjx"); bookMapper.updateBook(book); // sqlSession.commit(); } @Test public void testAnnoDelete(){ bookMapper.delBook(9); // sqlSession.commit(); } @Test public void testAnnoIf(){ Book book = new Book(); book.setBookname("Java"); // book.setAuthor("yjx"); List<Book> books = bookMapper.findBooks(book); for (Book book1 : books) { System.out.println(book1); } } @After public void end() throws IOException { sqlSession.commit(); sqlSession.close(); resourceAsStream.close(); } }
4、源码下载

需要完整源码可同过下面连接来下载(资源不需要积分或者C币,纯公益事业)
源码下载

最后

以上就是兴奋可乐最近收集整理的关于实验三 在实验二的基础上使用注解在Mybatis框架中完成增删改查操作的全部内容,更多相关实验三内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部