- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Mybatis注解开发单表、多表操作的实现代码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
之前我们在mapper映射文件中编写的sql语句已经各种配置,其实是比较麻烦的 。
而这几年来注解开发越来越流行,mybatis也可以使用注解开发方式,这样我们就可以减少编写mapper映射文件了 。
常用注解 。
@select(“查询的 sql 语句”):执行查询操作注解 。
@insert(“查询的 sql 语句”):执行新增操作注解 。
@update(“查询的 sql 语句”):执行修改操作注解 。
@delete(“查询的 sql 语句”):执行删除操作注解 。
表:我们还是用db1中的student表 。
新建mybatis04项目 。
javabean 。
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
|
package
com.itheima.bean;
public
class
student {
private
integer id;
private
string name;
private
integer age;
public
student() {
}
public
student(integer id, string name, integer age) {
this
.id = id;
this
.name = name;
this
.age = age;
}
public
integer getid() {
return
id;
}
public
void
setid(integer id) {
this
.id = id;
}
public
string getname() {
return
name;
}
public
void
setname(string name) {
this
.name = name;
}
public
integer getage() {
return
age;
}
public
void
setage(integer age) {
this
.age = age;
}
@override
public
string tostring() {
return
"student{"
+
"id="
+ id +
", name='"
+ name + '\
''
+
", age="
+ age +
'}'
;
}
}
|
创建mapper接口 。
1
2
3
4
5
6
7
8
9
10
11
12
|
package
com.itheima.mapper;
import
com.itheima.bean.student;
import
org.apache.ibatis.annotations.select;
import
java.util.list;
public
interface
studentmapper {
//查询全部
@select
(
"select * from student"
)
public
abstract
list<student> selectall();
}
|
配置mybatisconfig.xml 。
1
2
3
4
5
|
<!--配置映射关系:这里已经没有mapper映射文件了,但是我们需要配置mapper接口所在的包-->
<mappers>
<
package
name=
"com.itheima.mapper"
/>
</mappers>
<!--其实是注解的方式帮助我们生成了映射文件,所以我们依然是在mappers节点里配置-->
|
测试类:com.itheima.test.test01 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
@test
public
void
selectall()
throws
exception{
//1.加载核心配置文件
inputstream is = resources.getresourceasstream(
"mybatisconfig.xml"
);
//2.获取sqlsession工厂对象
sqlsessionfactory sqlsessionfactory =
new
sqlsessionfactorybuilder().build(is);
//3.通过工厂对象获取sqlsession对象
sqlsession sqlsession = sqlsessionfactory.opensession(
true
);
//4.获取studentmapper接口的实现类对象
studentmapper mapper = sqlsession.getmapper(studentmapper.
class
);
//5.调用实现类对象中的方法,接收结果
list<student> list = mapper.selectall();
//6.处理结果
for
(student student : list) {
system.out.println(student);
}
}
|
注意:
修改mybatis的核心配置文件,我们使用了注解替代的映射文件,所以我们只需要加载使用了注解的mapper接口即可 。
1
2
3
4
|
<mappers>
<!--扫描使用注解的类-->
<mapper
class
=
"com.itheima.mapper.usermapper"
></mapper>
</mappers>
|
或者指定扫描包含映射关系的接口所在的包也可以 。
1
2
3
4
|
<mappers>
<!--扫描使用注解的类所在的包-->
<
package
name=
"com.itheima.mapper"
></
package
>
</mappers>
|
1.3 注解实现新增操作 。
studentmapper新增接口方法 。
1
2
3
|
//新增操作: sql的参数与之前的写法一致,从insert方法的参数中获取对应属性值
@insert
(
"insert into student values (#{id},#{name},#{age})"
)
public
abstract
integer insert(student stu);
|
测试方法 。
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
|
@test
public
void
insert()
throws
exception{
//1.加载核心配置文件
inputstream is = resources.getresourceasstream(
"mybatisconfig.xml"
);
//2.获取sqlsession工厂对象
sqlsessionfactory sqlsessionfactory =
new
sqlsessionfactorybuilder().build(is);
//3.通过工厂对象获取sqlsession对象
sqlsession sqlsession = sqlsessionfactory.opensession(
true
);
//4.获取studentmapper接口的实现类对象
studentmapper mapper = sqlsession.getmapper(studentmapper.
class
);
//5.调用实现类对象中的方法,接收结果
student stu =
new
student(
4
,
"赵六"
,
26
);
integer result = mapper.insert(stu);
//6.处理结果
system.out.println(result);
//7.释放资源
sqlsession.close();
is.close();
}
|
返回自动增长主键 。
介绍 。
代码 。
测试 。
在mapper.insert(stu)之后,会将操作结果返回,并且也会对stu本身的id进行赋值 。
结果 。
studentmapper新增接口方法 。
1
2
3
|
//修改操作
@update
(
"update student set name=#{name},age=#{age} where id=#{id}"
)
public
abstract
integer update(student stu);
|
测试方法 。
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
|
@test
public
void
update()
throws
exception{
//1.加载核心配置文件
inputstream is = resources.getresourceasstream(
"mybatisconfig.xml"
);
//2.获取sqlsession工厂对象
sqlsessionfactory sqlsessionfactory =
new
sqlsessionfactorybuilder().build(is);
//3.通过工厂对象获取sqlsession对象
sqlsession sqlsession = sqlsessionfactory.opensession(
true
);
//4.获取studentmapper接口的实现类对象
studentmapper mapper = sqlsession.getmapper(studentmapper.
class
);
//5.调用实现类对象中的方法,接收结果
student stu =
new
student(
4
,
"赵六"
,
36
);
integer result = mapper.update(stu);
//6.处理结果
system.out.println(result);
//7.释放资源
sqlsession.close();
is.close();
}
|
studentmapper新增接口方法 。
1
2
3
|
//删除操作
@delete
(
"delete from student where id=#{id}"
)
public
abstract
integer delete(integer id);
|
测试方法 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
@test
public
void
delete()
throws
exception{
//1.加载核心配置文件
inputstream is = resources.getresourceasstream(
"mybatisconfig.xml"
);
//2.获取sqlsession工厂对象
sqlsessionfactory sqlsessionfactory =
new
sqlsessionfactorybuilder().build(is);
//3.通过工厂对象获取sqlsession对象
sqlsession sqlsession = sqlsessionfactory.opensession(
true
);
//4.获取studentmapper接口的实现类对象
studentmapper mapper = sqlsession.getmapper(studentmapper.
class
);
//5.调用实现类对象中的方法,接收结果
integer result = mapper.delete(
4
);
//6.处理结果
system.out.println(result);
//7.释放资源
sqlsession.close();
is.close();
}
|
1.6 注解开发总结 。
注解可以简化开发操作,省略映射配置文件的编写 。
常用注解 。
@select(“查询的 sql 语句”):执行查询操作注解 。
@insert(“查询的 sql 语句”):执行新增操作注解 。
@update(“查询的 sql 语句”):执行修改操作注解 。
@delete(“查询的 sql 语句”):执行删除操作注解 。
配置映射关系 。
1
|
<mappers> <
package
name=
"接口所在包"
/> </mappers>
|
<resultmap>
来实现,
2.2.0 准备工作 。
创建项目: mybatis05 。
javabean - card 。
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
|
package
com.itheima.bean;
public
class
card {
private
integer id;
//主键id
private
string number;
//身份证号
private
person p;
//所属人的对象
public
card() {
}
public
card(integer id, string number, person p) {
this
.id = id;
this
.number = number;
this
.p = p;
}
public
integer getid() {
return
id;
}
public
void
setid(integer id) {
this
.id = id;
}
public
string getnumber() {
return
number;
}
public
void
setnumber(string number) {
this
.number = number;
}
public
person getp() {
return
p;
}
public
void
setp(person p) {
this
.p = p;
}
@override
public
string tostring() {
return
"card{"
+
"id="
+ id +
", number='"
+ number + '\
''
+
", p="
+ p +
'}'
;
}
}
|
javabean - person 。
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
|
package
com.itheima.bean;
public
class
person {
private
integer id;
//主键id
private
string name;
//人的姓名
private
integer age;
//人的年龄
public
person() {
}
public
person(integer id, string name, integer age) {
this
.id = id;
this
.name = name;
this
.age = age;
}
public
integer getid() {
return
id;
}
public
void
setid(integer id) {
this
.id = id;
}
public
string getname() {
return
name;
}
public
void
setname(string name) {
this
.name = name;
}
public
integer getage() {
return
age;
}
public
void
setage(integer age) {
this
.age = age;
}
@override
public
string tostring() {
return
"person{"
+
"id="
+ id +
", name='"
+ name + '\
''
+
", age="
+ age +
'}'
;
}
}
|
cardmapper接口:我们的核心就是要在card中做一些处理,实现一对一的查询 。
1
2
3
4
5
6
7
8
9
10
|
package
com.itheima.one_to_one;
import
com.itheima.bean.card;
import
java.util.list;
public
interface
cardmapper {
//查询全部
public
abstract
list<card> selectall();
}
|
2.2.1 一对一查询的模型 。
一对一查询的需求:查询一个用户信息,与此同时查询出该用户对应的身份证信息 。
2.2.2 一对一查询的语句 。
对应的sql语句:
1
2
3
|
select * from card; -- 只根据这个sql语句只能查询出来card的数据
select * from person where id=#{id}; -- 需要根据card表中查询出来的pid,再次查询person数据才能将person数据也查询出来
|
2.2.3 创建personmapper接口 。
1
2
3
4
5
|
public
interface
personmapper {
//根据id查询
@select
(
"select * from person where id=#{id}"
)
public
abstract
person selectbyid(integer id);
}
|
2.2.4 使用注解配置cardmapper 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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"
,
// 根据查询出的card表中的pid字段来查询person表
/*
one、@one 一对一固定写法
select属性:指定调用哪个接口中的哪个方法
*/
one =
@one
(select =
"com.itheima.one_to_one.personmapper.selectbyid"
)
)
})
public
abstract
list<card> selectall();
}
|
2.2.5 测试类 。
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
|
package
com.itheima.one_to_one;
import
com.itheima.bean.card;
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.test;
import
java.io.inputstream;
import
java.util.list;
public
class
test01 {
@test
public
void
selectall()
throws
exception{
//1.加载核心配置文件
inputstream is = resources.getresourceasstream(
"mybatisconfig.xml"
);
//2.获取sqlsession工厂对象
sqlsessionfactory sqlsessionfactory =
new
sqlsessionfactorybuilder().build(is);
//3.通过工厂对象获取sqlsession对象
sqlsession sqlsession = sqlsessionfactory.opensession(
true
);
//4.获取cardmapper接口的实现类对象
cardmapper mapper = sqlsession.getmapper(cardmapper.
class
);
//5.调用实现类对象中的方法,接收结果
list<card> list = mapper.selectall();
//6.处理结果
for
(card card : list) {
system.out.println(card);
}
//7.释放资源
sqlsession.close();
is.close();
}
}
|
结果 。
2.2.6 一对一配置总结 。
1
2
3
4
5
6
7
8
9
|
@results
:封装映射关系的父注解。
result[] value():定义了 result 数组
@result
:封装映射关系的子注解。
column 属性:查询出的表中字段名称
property 属性:实体对象中的属性名称
javatype 属性:被包含对象的数据类型
one 属性:一对一查询固定属性
@one
:一对一查询的注解。
select 属性:指定调用某个接口中的方法
|
2.2.7 分析 。
2.3.1 一对多查询的模型 。
一对多查询的需求:查询一个课程,与此同时查询出该该课程对应的学生信息 。
2.3.2 一对多查询的语句 。
对应的sql语句:
1
2
3
|
select * from classes
select * from student where cid=#{cid}
|
2.3.3 创建studentmapper接口 。
1
2
3
4
5
|
public
interface
studentmapper {
//根据cid查询student表
@select
(
"select * from student where cid=#{cid}"
)
public
abstract
list<student> selectbycid(integer cid);
}
|
2.3.4 使用注解配置mapper 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
interface
classesmapper {
//查询全部
@select
(
"select * from classes"
)
@results
({
@result
(column =
"id"
,property =
"id"
),
@result
(column =
"name"
,property =
"name"
),
@result
(
property =
"students"
,
// 被包含对象的变量名
javatype = list.
class
,
// 被包含对象的实际数据类型
column =
"id"
,
// 根据查询出的classes表的id字段来查询student表
/*
many、@many 一对多查询的固定写法
select属性:指定调用哪个接口中的哪个查询方法
*/
many =
@many
(select =
"com.itheima.one_to_many.studentmapper.selectbycid"
)
)
})
public
abstract
list<classes> selectall();
}
|
2.3.5 测试类 。
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
|
public
class
test01 {
@test
public
void
selectall()
throws
exception{
//1.加载核心配置文件
inputstream is = resources.getresourceasstream(
"mybatisconfig.xml"
);
//2.获取sqlsession工厂对象
sqlsessionfactory sqlsessionfactory =
new
sqlsessionfactorybuilder().build(is);
//3.通过工厂对象获取sqlsession对象
sqlsession sqlsession = sqlsessionfactory.opensession(
true
);
//4.获取classesmapper接口的实现类对象
classesmapper mapper = sqlsession.getmapper(classesmapper.
class
);
//5.调用实现类对象中的方法,接收结果
list<classes> list = mapper.selectall();
//6.处理结果
for
(classes cls : list) {
system.out.println(cls.getid() +
","
+ cls.getname());
list<student> students = cls.getstudents();
for
(student student : students) {
system.out.println(
"\t"
+ student);
}
}
//7.释放资源
sqlsession.close();
is.close();
}
}
|
2.3.6 一对多配置总结 。
1
2
3
4
5
6
7
8
9
|
@results
:封装映射关系的父注解。
result[] value():定义了 result 数组
@result
:封装映射关系的子注解。
column 属性:查询出的表中字段名称
property 属性:实体对象中的属性名称
javatype 属性:被包含对象的数据类型
many 属性:一对多查询固定属性
@many
:一对多查询的注解。
select 属性:指定调用某个接口中的方法
|
2.3.7 分析 。
2.4.1 多对多查询的模型 。
多对多查询的需求:查询学生以及所对应的课程信息 。
2.4.2 多对多查询的语句 。
对应的sql语句:
1
2
|
select distinct s.id,s.name,s.age from student s,stu_cr sc where sc.sid=s.id
select c.id,c.name from stu_cr sc,course c where sc.cid=c.id and sc.sid=#{id}
|
2.4.3 添加coursemapper 接口方法 。
1
2
3
4
5
|
public
interface
coursemapper {
//根据学生id查询所选课程
@select
(
"select c.id,c.name from stu_cr sc,course c where sc.cid=c.id and sc.sid=#{id}"
)
public
abstract
list<course> selectbysid(integer id);
}
|
2.4.4 使用注解配置mapper 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public
interface
studentmapper {
//查询全部
@select
(
"select distinct s.id,s.name,s.age from student s,stu_cr sc where sc.sid=s.id"
)
@results
({
@result
(column =
"id"
,property =
"id"
),
@result
(column =
"name"
,property =
"name"
),
@result
(column =
"age"
,property =
"age"
),
@result
(
property =
"courses"
,
// 被包含对象的变量名
javatype = list.
class
,
// 被包含对象的实际数据类型
column =
"id"
,
// 根据查询出student表的id来作为关联条件,去查询中间表和课程表
/*
many、@many 一对多查询的固定写法
select属性:指定调用哪个接口中的哪个查询方法
*/
many =
@many
(select =
"com.itheima.many_to_many.coursemapper.selectbysid"
)
)
})
public
abstract
list<student> selectall();
}
|
2.4.5 测试类 。
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
|
public
class
test01 {
@test
public
void
selectall()
throws
exception{
//1.加载核心配置文件
inputstream is = resources.getresourceasstream(
"mybatisconfig.xml"
);
//2.获取sqlsession工厂对象
sqlsessionfactory sqlsessionfactory =
new
sqlsessionfactorybuilder().build(is);
//3.通过工厂对象获取sqlsession对象
sqlsession sqlsession = sqlsessionfactory.opensession(
true
);
//4.获取studentmapper接口的实现类对象
studentmapper mapper = sqlsession.getmapper(studentmapper.
class
);
//5.调用实现类对象中的方法,接收结果
list<student> list = mapper.selectall();
//6.处理结果
for
(student student : list) {
system.out.println(student.getid() +
","
+ student.getname() +
","
+ student.getage());
list<course> courses = student.getcourses();
for
(course cours : courses) {
system.out.println(
"\t"
+ cours);
}
}
//7.释放资源
sqlsession.close();
is.close();
}
}
|
2.4.6 多对多配置总结 。
1
2
3
4
5
6
7
8
9
|
@results
:封装映射关系的父注解。
result[] value():定义了 result 数组
@result
:封装映射关系的子注解。
column 属性:查询出的表中字段名称
property 属性:实体对象中的属性名称
javatype 属性:被包含对象的数据类型
many 属性:一对多查询固定属性
@many
:一对多查询的注解。
select 属性:指定调用某个接口中的方法
|
2.4.7 分析 。
我们之前通过注解开发时,相关 sql 语句都是自己直接拼写的。一些关键字写起来比较麻烦、而且容易出错.
mybatis 给我们提供了 org.apache.ibatis.jdbc.sql 功能类,专门用于构建 sql 语句 。
创建项目:将之前的注解的所有相关代码,配置文件拿过来 。
新建测试类: com.itheima.sql.sqltest 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package
com.itheima.sql;
public
class
sqltest {
public
static
void
main(string[] args) {
string sql = getsql();
system.out.println(sql);
}
//定义方法,获取查询student表的sql语句
public
static
string getsql() {
string sql =
"select * from student"
;
return
sql;
}
}
|
如果sql语句比较长,sql中的关键字较多时,就可能会写错 。
修改代码:使用sql类通过的方法来编写sql语句 。
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
|
package
com.itheima.sql;
import
org.apache.ibatis.jdbc.sql;
public
class
sqltest {
public
static
void
main(string[] args) {
string sql = getsql();
system.out.println(sql);
}
//定义方法,获取查询student表的sql语句
/*public static string getsql() {
string sql = "select * from student";
return sql;
}*/
public
static
string getsql() {
string sql =
new
sql(){
//通过sql类提供的方法来实现sql语句的编写
{
select(
"*"
);
from(
"student"
);
}
}.tostring();
return
sql;
}
}
|
结果 。
定义功能类并提供获取查询的 sql 语句的方法 。
新建类:com.itheima.sql.returnsql,定义获取sql语句的方法 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package
com.itheima.sql;
import
org.apache.ibatis.jdbc.sql;
public
class
returnsql {
//定义方法,返回查询的sql语句
public
string getselectall() {
return
new
sql() {
{
select(
"*"
);
from(
"student"
);
}
}.tostring();
//以上代码说明:内层的花括号是一个构造代码块,在实例化一个对象时会先于构造方法执行,编译时会将构造代码块移入构造方法中
//如果上述不理解,可以使用以下方式:builder风格
string sql =
new
sql()
.select(
"*"
)
.from(
"student"
)
.tostring();
return
sql;
}
}
|
@selectprovider:生成查询用的 sql 语句注解( 调用提供sql语句的方法,获取到查询的sql语句 ) 。
type 属性:用于指定生成 sql 语句功能的类对象 。
method 属性:用于指定类中要执行获取sql语句的方法 (指定方法名,不加小括号) 。
修改studentmapper 。
1
2
3
4
5
|
//查询全部
//@select("select * from student")
//注意:method只是指定一个方法的名字,selectprovider内部会自己调用
@selectprovider
(type = returnsql.
class
, method =
"getselectall"
)
public
abstract
list<student> selectall();
|
运行test包中的test01的selectall方法,能查询出数据即可 。
定义功能类并提供获取新增的 sql 语句的方法,在returnsql中增加如下方法:
1
2
3
4
5
6
7
8
9
|
//定义方法,返回新增的sql语句
public
string getinsert(student stu) {
return
new
sql() {
{
insert_into(
"student"
);
into_values(
"#{id},#{name},#{age}"
);
}
}.tostring();
}
|
@insertprovider:生成新增用的 sql 语句注解( 调用提供sql语句的方法,获取到新增的sql语句 ) 。
type 属性:生成 sql 语句功能类对象 。
method 属性:指定调用方法 。
修改studentmapper 。
1
2
3
4
|
//新增功能
//@insert("insert into student values (#{id},#{name},#{age})")
@insertprovider
(type = returnsql.
class
, method =
"getinsert"
)
public
abstract
integer insert(student stu);
|
运行test包中的test01的insert方法,能插入数据即可 。
3.4 修改功能的实现 。
定义功能类并提供获取修改的 sql 语句的方法 。
1
2
3
4
5
6
7
8
9
10
|
//定义方法,返回修改的sql语句
public
string getupdate(student stu) {
return
new
sql() {
{
update(
"student"
);
set(
"name=#{name}"
,
"age=#{age}"
);
where(
"id=#{id}"
);
}
}.tostring();
}
|
@updateprovider:生成修改用的 sql 语句注解( 调用提供sql语句的方法,获取到更新的sql语句 ) 。
type 属性:生成 sql 语句功能类对象 。
method 属性:指定调用方法 。
修改studentmapper 。
1
2
3
4
|
//修改功能
//@update("update student set name=#{name},age=#{age} where id=#{id}")
@updateprovider
(type = returnsql.
class
, method =
"getupdate"
)
public
abstract
integer update(student stu);
|
运行test包中的test01的update方法,能更新数据即可 。
定义功能类并提供获取删除的 sql 语句的方法 。
1
2
3
4
5
6
7
8
9
|
//定义方法,返回删除的sql语句
public
string getdelete(integer id) {
return
new
sql() {
{
delete_from(
"student"
);
where(
"id=#{id}"
);
}
}.tostring();
}
|
@deleteprovider:生成删除用的 sql 语句注解( 调用提供sql语句的方法,获取到删除的sql语句 ) 。
type 属性:生成 sql 语句功能类对象 。
method 属性:指定调用方法 。
修改studentmapper 。
1
2
3
4
|
//删除功能
//@delete("delete from student where id=#{id}")
@deleteprovider
(type = returnsql.
class
, method =
"getdelete"
)
public
abstract
integer delete(integer id);
|
运行test包中的test01的delete方法,能删除数据即可 。
我们之前在做学生管理系统时,使用的是原始jdbc操作数据库的,操作非常麻烦,现在我们使用mybatis操作数据库,简化dao的开发.
创建数据库 。
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
|
-- 创建db3数据库
create database db3;
-- 使用db3数据库
use db3;
-- 创建用户表
create table user(
uid varchar(
50
) primary key, -- 用户id
ucode varchar(
50
), -- 用户标识
loginname varchar(
100
), -- 登录用户名
password varchar(
100
), -- 登录密码
username varchar(
100
), -- 用户名
gender varchar(
10
), -- 用户性别
birthday date, -- 出生日期
dutydate date -- 入职日期
);
-- 添加一条测试数据
insert into user values (
'11111111'
,
'zhangsan001'
,
'zhangsan'
,
'1234'
,
'张三'
,
'男'
,
'2008-10-28'
,
'2018-10-28'
);
-- 创建student表
create table student(
sid
int
primary key auto_increment, -- 学生id
name varchar(
20
), -- 学生姓名
age
int
, -- 学生年龄
birthday date -- 学生生日
);
-- 添加数据
insert into student values (
null
,
'张三'
,
23
,
'1999-09-23'
),(
null
,
'李四'
,
24
,
'1998-08-10'
),
(
null
,
'王五'
,
25
,
'1996-06-06'
),(
null
,
'赵六'
,
26
,
'1994-10-20'
);
|
将之前的“jdbc基础网页版”项目copy过来 。
运行起来:注意这个项目的虚拟目录必须是/,因为界面中的链接写死了 。
输入zhangsan,1234,登陆进去,我们现在要处理的是 在校学生管理:
在这里,可以对学生进行增删改查,之前是通过jdbc实现的这些功能,现在我们需要通过mybatis来实现 。
增加jar包:
复制相关的配置文件:log4j和mybatisconfig 。
修改config.properties(这个其实就是jdbc配置文件) 。
1
2
3
4
|
driver=com.mysql.jdbc.driver
url=jdbc:mysql:
//192.168.59.143:3306/db3
username=root
password=itheima
|
修改mybatisconfig主配置文件:
1
2
3
4
5
6
7
|
<!--引入数据库连接的配置文件-->
<properties resource=
"config.properties"
/>
起别名的配置删掉
<!--配置映射关系-->
<mappers>
<
package
name=
"com.itheima.dao"
/>
</mappers>
|
删除studentdaoimpl,我们不需要实现类,我们会通过接口代理的方式来实现 。
修改studentdao,给接口方法通过注解的方式配置sql语句 。
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
|
package
com.itheima.dao;
import
com.itheima.domain.student;
import
org.apache.ibatis.annotations.delete;
import
org.apache.ibatis.annotations.insert;
import
org.apache.ibatis.annotations.select;
import
org.apache.ibatis.annotations.update;
import
java.util.arraylist;
/*
dao层接口
*/
public
interface
studentdao {
//查询所有学生信息
@select
(
"select * from student"
)
public
abstract
arraylist<student> findall();
//条件查询,根据id获取学生信息
@select
(
"select * from student where sid=#{sid}"
)
public
abstract
student findbyid(integer sid);
//新增学生信息
@insert
(
"insert into student values (#{sid},#{name},#{age},#{birthday})"
)
public
abstract
int
insert(student stu);
//修改学生信息
@update
(
"update student set name=#{name},age=#{age},birthday=#{birthday} where sid=#{sid}"
)
public
abstract
int
update(student stu);
//删除学生信息
@delete
(
"delete from student where sid=#{sid}"
)
public
abstract
int
delete(integer sid);
}
|
修改studentserviceimpl,删除之前的daoimpl的逻辑 。
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
|
package
com.itheima.service.impl;
import
com.itheima.domain.student;
import
com.itheima.service.studentservice;
import
java.util.list;
/**
* 学生的业务层实现类
* @author 黑马程序员
* @company http://www.itheima.com
*/
public
class
studentserviceimpl
implements
studentservice {
@override
public
list<student> findall() {
}
@override
public
student findbyid(integer sid) {
}
@override
public
void
save(student student) {
}
@override
public
void
update(student student) {
}
@override
public
void
delete(integer sid) {
}
}
|
我们主要是将原来的jdbc实现的方式改为mybatis实现 。
新建com.itheima.utils.mybatisutils.java 。
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
|
package
com.itheima.utils;
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
java.io.ioexception;
/*
工具类
*/
public
class
mybatisutils {
// 私有构造方法
private
mybatisutils(){}
// 声明连接工厂对象
private
static
sqlsessionfactory sqlsessionfactory;
// 静态代码块,读取核心配置文件并工厂对象赋值
static
{
try
{
sqlsessionfactory =
new
sqlsessionfactorybuilder().build(resources.getresourceasstream(
"mybatisconfig.xml"
));
}
catch
(ioexception e) {
e.printstacktrace();
}
}
// 提供静态方法,返回sqlsession对象
public
static
sqlsession getsqlsession() {
return
sqlsessionfactory.opensession(
true
);
}
}
|
修改studentserviceimpl代码 。
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
|
package
com.itheima.service.impl;
import
com.itheima.dao.studentdao;
import
com.itheima.domain.student;
import
com.itheima.service.studentservice;
import
com.itheima.utils.mybatisutils;
import
org.apache.ibatis.session.sqlsession;
import
java.util.arraylist;
import
java.util.list;
/**
* 学生的业务层实现类
* @author 黑马程序员
* @company http://www.itheima.com
*/
public
class
studentserviceimpl
implements
studentservice {
@override
public
list<student> findall() {
// 获取sqlsession对象
sqlsession sqlsession = mybatisutils.getsqlsession();
// 获取studentdao接口的实现类对象
studentdao mapper = sqlsession.getmapper(studentdao.
class
);
// 调用实现类对象相应的功能
arraylist<student> list = mapper.findall();
// 释放资源
sqlsession.close();
// 返回结果
return
list;
}
@override
public
student findbyid(integer sid) {
// 获取sqlsession对象
sqlsession sqlsession = mybatisutils.getsqlsession();
// 获取studentdao接口的实现类对象
studentdao mapper = sqlsession.getmapper(studentdao.
class
);
// 调用实现类对象相应的功能
student stu = mapper.findbyid(sid);
// 释放资源
sqlsession.close();
// 返回结果
return
stu;
}
@override
public
void
save(student student) {
// 获取sqlsession对象
sqlsession sqlsession = mybatisutils.getsqlsession();
// 获取studentdao接口的实现类对象
studentdao mapper = sqlsession.getmapper(studentdao.
class
);
// 调用实现类对象相应的功能
mapper.insert(student);
// 释放资源
sqlsession.close();
}
@override
public
void
update(student student) {
// 获取sqlsession对象
sqlsession sqlsession = mybatisutils.getsqlsession();
// 获取studentdao接口的实现类对象
studentdao mapper = sqlsession.getmapper(studentdao.
class
);
// 调用实现类对象相应的功能
mapper.update(student);
// 释放资源
sqlsession.close();
}
@override
public
void
delete(integer sid) {
// 获取sqlsession对象
sqlsession sqlsession = mybatisutils.getsqlsession();
// 获取studentdao接口的实现类对象
studentdao mapper = sqlsession.getmapper(studentdao.
class
);
// 调用实现类对象相应的功能
mapper.delete(sid);
// 释放资源
sqlsession.close();
}
}
package
com.itheima.service.impl;
import
com.itheima.dao.studentdao;
import
com.itheima.domain.student;
import
com.itheima.service.studentservice;
import
com.itheima.utils.mybatisutils;
import
org.apache.ibatis.session.sqlsession;
import
java.util.arraylist;
import
java.util.list;
/**
* 学生的业务层实现类
* @author 黑马程序员
* @company http://www.itheima.com
*/
public
class
studentserviceimpl
implements
studentservice {
@override
public
list<student> findall() {
// 获取sqlsession对象
sqlsession sqlsession = mybatisutils.getsqlsession();
// 获取studentdao接口的实现类对象
studentdao mapper = sqlsession.getmapper(studentdao.
class
);
// 调用实现类对象相应的功能
arraylist<student> list = mapper.findall();
// 释放资源
sqlsession.close();
// 返回结果
return
list;
}
@override
public
student findbyid(integer sid) {
// 获取sqlsession对象
sqlsession sqlsession = mybatisutils.getsqlsession();
// 获取studentdao接口的实现类对象
studentdao mapper = sqlsession.getmapper(studentdao.
class
);
// 调用实现类对象相应的功能
student stu = mapper.findbyid(sid);
// 释放资源
sqlsession.close();
// 返回结果
return
stu;
}
@override
public
void
save(student student) {
// 获取sqlsession对象
sqlsession sqlsession = mybatisutils.getsqlsession();
// 获取studentdao接口的实现类对象
studentdao mapper = sqlsession.getmapper(studentdao.
class
);
// 调用实现类对象相应的功能
mapper.insert(student);
// 释放资源
sqlsession.close();
}
@override
public
void
update(student student) {
// 获取sqlsession对象
sqlsession sqlsession = mybatisutils.getsqlsession();
// 获取studentdao接口的实现类对象
studentdao mapper = sqlsession.getmapper(studentdao.
class
);
// 调用实现类对象相应的功能
mapper.update(student);
// 释放资源
sqlsession.close();
}
@override
public
void
delete(integer sid) {
// 获取sqlsession对象
sqlsession sqlsession = mybatisutils.getsqlsession();
// 获取studentdao接口的实现类对象
studentdao mapper = sqlsession.getmapper(studentdao.
class
);
// 调用实现类对象相应的功能
mapper.delete(sid);
// 释放资源
sqlsession.close();
}
}
|
员工管理也有增删改查,大家可以作为课下作业 。
到此这篇关于mybatis注解开发单表、多表操作的实现代码的文章就介绍到这了,更多相关mybatis注解开发内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:http://www.cnblogs.com/859630097com/p/14439046.html 。
最后此篇关于Mybatis注解开发单表、多表操作的实现代码的文章就讲到这里了,如果你想了解更多关于Mybatis注解开发单表、多表操作的实现代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我需要一些说明。我可以直接写入 /dev/port 以直接访问并行端口并且它工作正常(我可以打开插入端口连接器的 LED)。但是,我想我可以用 /dev/mem 做同样的事情? (http://tld
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我使用 Visual C++ 和 Win32 API 学习了 Windows 编程。如今,似乎大多数应用程序都是使用 C# 在 .NET 中开发的。我知道大多数时候 native 代码和托管代码之间没
请耐心等待。我正在制作一个 java 控制台,类似于此处找到的 DragonConsole https://code.google.com/p/dragonconsole/ 。一切都按计划进行,但我想
关闭。这个问题需要更多 focused .它目前不接受答案。 想要改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭5年前。 Improve this que
Django 的开发服务器表现得很奇怪。访问它的浏览器在加载时卡住,任何退出它的尝试都不起作用。当我点击 control c看似相当,但实际上仍在运行。让它退出的唯一方法是重新启动我的电脑,这很令人沮
我正在使用 Flash Develop,并且创建了一个 ActionScript 3.0 项目。它启动并读取一个 xml 文件,其中包含图像的 url。我已将 url 保留在与 swf 相同的文件夹中
是否可以根据其 website 上提供的规范开发 AUTOSAR BSW 堆栈(例如用于 CAN 通信)?不购买任何昂贵的供应商工具?可以遵循哪些步骤?我被要求探索这种可能性。 最佳答案 是和否。工具
有人知道如何用音频文件的内容覆盖 iPhone 麦克风吗? 想象一个场景,您正在通话,并且想要播放一些简短的音频让其他人听到。 因此,有必要将麦克风(硬件)置于保持状态,并使用委托(delegate)
我遇到了这个问题,我的应用程序出现 EXC_BAD_ACCESS 错误并卡住/停止。我使用模拟器的“向左旋转”和“向右旋转”选项来模拟方向变化行为。导致此错误的可能原因有哪些?由于我没有获得有关错误的
我有超过 1 台 Mac,我想在所有这些 Mac 上进行开发。我知道我需要在每台机器上同步我的手机,但这是我遇到的最小的问题。看起来我无法在手机上运行应用程序,除了在其中之一上开发的应用程序。 是否有
在手机上测试时,我的应用程序在特定点崩溃。控制台显示此消息 Tue Jan 27 15:47:14 unknown SpringBoard[22] : Application com.myprof.
我有一个案例,我从服务器获取信息。我的应用程序有一个选项卡栏和导航按钮。我希望应用程序显示进度指示器并禁用所有其他控件,以便用户在从服务器提取数据时无法跳转。我怎样才能实现这个目标? 我想到的一种方法
有时,当我尝试“构建”/编译下载的源代码时,我会收到以下警告: ld: warning: directory '/Volumes/Skiiing2/CD/ViewBased/Unknown Path/
我无法在 Apple 文档中找到关于开发和分发配置之间差异的明确解释。我目前正在使用开发配置在我的 iPhone 上进行开发和测试。我打算将该应用程序分发到我的 Beta 测试中,我想知道: 我需要使
我在使用 SharePoint 时遇到的最大挑战之一是它不能很好地适应典型的项目环境,其中至少包含开发和生产环境。我遇到的最多的问题是内容和列表是如此紧密地耦合在一起,以至于如果不在生产环境中执行内容
我失败了fist step让 Eclipse(对我来说是全新的)为 ARM 开发做好准备。 我在 Windows 10 中安装了 Eclipse。我想我应该安装 xpm,但我不知道在哪里输入此命令:
首先,我告诉你-我是编码新手 我正在使用vs代码来学习c++,它不会产生像dev c++或codeblocks这样的调试器。我看了一些视频,其中我们必须编辑json文件,这对于初学者来说非常复杂。有人
我失败了fist step让 Eclipse(对我来说是全新的)为 ARM 开发做好准备。 我在 Windows 10 中安装了 Eclipse。我想我应该安装 xpm,但我不知道在哪里输入此命令:
我开发了一个 Ionic 应用程序(iOS 和 Android 的混合)。我有 Xcode 8.3.3 并购买了一年的 Apple Developer Program 订阅。 我不想测试我的应用并将其
我是一名优秀的程序员,十分优秀!