一、利用注解开发
mybatis最初配置信息是基于 XML ,映射语句(SQL)也是定义在 XML 中的。而到MyBatis 3提供了新的基于注解的配置。不幸的是,Java 注解的的表达力和灵活性十分有限。最强大的 MyBatis 映射并不能用注解来构建
sql 类型主要分成 :
@select ()
@update ()
@Insert ()
@delete ()
注意:利用注解开发就不需要mapper.xml映射文件了 .
//获取SqlSession连接
public static SqlSession getSession(){
return getSession(true); //事务自动提交
}
public static SqlSession getSession(boolean flag){
return sqlSessionFactory.openSession(flag);
}
1.1查询
1、编写接口方法注解
//根据id查询用户
@Select("select * from user where id = #{id}")
User selectUserById(@Param("id") int id);
2、在mybatis的核心配置文件中注入
<mappers>
<mapper class="com.yanyu.dao.UserMapper"/>
</mappers>
3、我们去进行测试
@Test
public void testSelectUserById() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(2);
System.out.println(user);
session.close();
}
1.2新增
1.编写接口方法注解
@Insert("insert into user1 (id,name,pwd) values (#{id},#{name},#{pwd})")
int addUser(User user);
2.测试
@Test
public void testAddUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User(5, "烟雨", "123456");
mapper.addUser(user);
session.close();
}
1.3修改
1、编写接口方法注解
//修改一个用户
@Update("update user1 set name=#{name},pwd=#{pwd} where id = #{id}")
int updateUser(User user);
2、测试
@Test
public void testUpdateUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User(5, "55", "zxcvbn");
mapper.updateUser(user);
session.close();
}
1.4删除
1、编写接口方法注解
//根据id删除用
@Delete("delete from user1 where id = #{id}")
int deleteUser(@Param("id")int id);
2、测试
@Test
public void testDeleteUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.deleteUser(5);
session.close();
}
1.5关于@Param
@Param注解用于给方法参数起一个名字。以下是总结的使用原则:
在方法只接受一个参数的情况下,可以不使用@Param。
在方法接受多个参数的情况下,建议一定要使用@Param注解给参数命名。
如果参数是 JavaBean , 则不能使用@Param。
不使用@Param注解时,参数只能有一个,并且是Javabean。
1.6#与$的区别
#{} 的作用主要是替换预编译语句(PrepareStatement)中的占位符? 【推荐使用】
INSERT INTO user (name) VALUES (#{name}); INSERT INTO user (name) VALUES (?);${} 的作用是直接进行字符串替换
INSERT INTO user (name) VALUES ('${name}'); INSERT INTO user (name) VALUES ('kuangshen');
二、IDEA Debug教程
Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行过程中参数的变化。
2.1开始调试
开始调试主要分为两步,第一为设置断点,第二才进行调式操作。
1、设置断点
设置断点的方法基本上大多数的 IDE 都一致,当我们在代码行上的数字旁鼠标左键点击一下,便设置断点成功(可设置多个断点)。断点还可以进行其余设置

2、Debug调试
启动调式主要有以下三种方法:
- 工具栏点击小甲虫样式的
debug按钮 - 鼠标右键 菜单下的
debug - 快捷键:
Alt+Shift+D(可自行更换)
方式一:

方式二:

2.2调试界面解释
点击了调试按钮之后,我们 IDEA 的底部会变成以下形式。既然要开始调试,我们总得先对调试界面有一个初步的认识不是,因此在下面我对常用的部分进行解释

1、调试器
在此界面可查看关于调式获得到的信息,如变量、方法返回值等
2、控制台
点击控制台后可以跟我们正常运行代码一样,在控制台中输入数据和查看输出情况
3、重启
重新调试
4、停止
停止当前调试
5、Resume Program
快捷键为 F8,跳到一下个断点处
6、Step Over
快捷键为 F6。步过,一行一行地往下走,如果这一行上有方法,直接执行完该方法的内容,不会进入方法里面。
7、Step Into
快捷键为 F5。步入,如果当前行有方法,可以进入方法内部,一般用于进入自定义方法内,不会进入官方类库的方法。
8、Step Out
快捷键为 F7。步出,从步入的方法内退出到方法调用处,此时方法已执行完毕,只是还没有完成赋值。
9、Force Step Into
快捷键为 Alt + Shift + F7。强制步入,能进入任何方法,查看底层源码的时候可以用这个进入官方类库的方法。
10、Run to Cursor
Ctrl+R。运行到光标处,你可以将光标定位到你需要查看的那一行,然后使用这个功能,代码会运行至光标行,而不需要打断点。
11、Show Execution Point
快捷键为 Alt + F10 。如果你的光标在其它行或其它页面,点击这个按钮可跳转到当前Debug代码执行的行。
12、Variable窗口
如图中的红框,这里显示当前方法里的所有变量。

2.3步过、步入和强制步入区别
这三个按钮的功能各有千秋,都具有进行到下一步的功能。当我们写的 bug 不同时,我们就得用到不同的按钮,下面我用表格列出三者的不同
| 是否可跳转 | 是否可进入自定义方法 | 是否可进入类库方法 | |
|---|---|---|---|
| 步过 | ✖ | ✖ | ✖ |
| 步入 | ✔ | ✔ | ✖ |
| 强制步入 | ✔ | ✔ | ✔ |
2.4调试案例
package org.example;
import lombok.*;
@Setter
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class User {
private int id;
private String name;
}
package org.example;
import java.util.ArrayList;
import java.util.List;
/*
* 1、静态方法不能直接调用非静态方法。
* 2、静态方法和变量可以在类被加载时就被访问,而非静态方法和变量需要在该对象创建后才能被访问。
* 3、如果想在静态方法中访问非静态方法或者变量,则需要先创建一个对象,然后在静态方法里面通过对象去访问非静态方法。
* */
public class UserTest {
// 非静态方法,获取User列表
public List<User> getUserList(){
User user1 = new User(1,"张三");
User user2 = new User(2,"李四");
User user3 = new User(3,"王五");
// 注意List是接口,接口不能直接实例化,需要通过它的实现类
List<User> users= new ArrayList<>();
users.add(user1);
users.add(user2);
users.add(user3);
return users;
}
public void syTest(){
System.out.println("断点回退前");
System.out.println("回退后");
}
public void allTest(int[] array){
for (int i : array) {
if (i==1){
System.out.println(1);
}else if (i==2){
System.out.println(2);
}else if (i==3){
System.out.println(3);
}else if (i==4){
System.out.println(4);
}
else {
System.out.println(5);
}
}
}
// 主程序入口,静态方法
public static void main(String[] args) {
int[] array={1,2,3,4,5};
UserTest userTest = new UserTest();
// 在静态方法里面调用非静态方法,需要通过对象去调用。
userTest.allTest(array);
List<User> users= userTest.getUserList();
// 带条件的断点
for (User user : users) {
System.out.println(user.getId());
}
// 断点回退
userTest.syTest();
// 执行中断 force return
userTest.allTest(array);
}
}
1、常用调试
在userTest.allTest(array) 打一个断点,点击Debug
2、带条件的断点
在System.out.println(user.getId());打一个断点,鼠标右键断点,编写调试条件

3、断点回退(只能用在方法里面)
在userTest.syTest() ,打一个断点,Step Into进入方法后,点击Step Over,我们可以看到,左下角框有Reset Frame(断点回退),点一下它,就回到之前执行断点之前的位置,再次重复该操作,查看控制台输出内容。




















