一、模仿教程练习增删改查,自己完成一个新表相关操作
1、配置fkxml文件
我们这里的增删改查sql语句必须对应我们自己创建的表
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Num">
<select id="query" parameterType="String" resultType="fk">
select * from data where zhanghao=#{zhanghao}
</select>
<insert id="add" parameterType="fk">
insert into data(name ,zhanghao ,password ,age) values(#{name} ,#{zhanghao} ,#{password} ,#{age})
</insert>
<update id="uppdate" parameterType="fk">
update data set name=#{name},age=#{age} where zhanghao=#{zhanghao}
</update>
<delete id="delete" parameterType="fk">
delete from data where zhanghao=#{zhanghao}
</delete>
<select id="list" resultType="fk">
select * from data
</select>
</mapper>
2、Java类
package Num;
public class fk {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getZhanghao() {
return zhanghao;
}
public void setZhanghao(String zhanghao) {
this.zhanghao = zhanghao;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private String name;
private String zhanghao;
private String password;
private int age;
public fk(){
}
public fk(String name ,String zhanghao ,String password ,int age){
this.age = age;
this.name = name;
this.password = password;
this.zhanghao = zhanghao;
}
}
3、编写测试类,我们可以用一个循环输入来一次测试增删改查所有功能
package controller;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Scanner;
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 Num.fk;
public class TestMybatis {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session=sqlSessionFactory.openSession();
System.out.println("输入数字对应相关功能:");
System.out.println("1、增加");
System.out.println("2、删除");
System.out.println("3、修改");
System.out.println("4、查询");
System.out.println("5、结束程序");
Scanner sc = new Scanner(System.in);
while(true){
int value = sc.nextInt();
if (value == 1){
System.out.println("请输入姓名、账号、密码、年龄");
String name = sc.next();
String zhanghao = sc.next();
String password = sc.next();
int age = sc.nextInt();
fk f = new fk(name ,zhanghao ,password ,age);
session.insert("add" ,f);
session.commit();
}else if (value == 2){
System.out.println("请输入您想删除的账号");
String zh = sc.next();
fk f = new fk();
f.setZhanghao(zh);
session.delete("delete" ,f);
session.commit();
}else if (value == 3){
System.out.println("请输入修改后的姓名、账号、密码、年龄");
String name = sc.next();
String zhanghao = sc.next();
String password = sc.next();
int age = sc.nextInt();
fk f = new fk(name ,zhanghao ,password ,age);
session.insert("update" ,f);
session.commit();
}else if (value == 4){
List<fk> array = session.selectList("list");
for (fk f : array){
System.out.println("姓名:" + f.getName() + " " + "年龄:" + f.getAge());
}
session.commit();
}else{
session.close();
break;
}
}
}
}
运行没问题:
二、一对多,多对一,多对多的练习
这一部分比较难,学习时我建议跟着教程一句代码一句代码地敲,边写边理解,而不是想一蹴而就直接看懂。
一对多:
这个部分最关键的应该就是xml文件配置resultMap。每一列column指明列名,property指明对应属性;<id>部分是主键,用来确定某一元组,<result>部分则是前面id确定的元组具体属性。还需要注意的就是如果在sql语句中修改了列名,映射中记得也要与其对应。
多对一:
一对多和多对一最大的区别就是association和collection标签
association
用于处理一对一或多对一关系。它将查询结果中的一行记录映射为一个 Java 对象,并将这个 Java 对象设置到它所属的另一个 Java 对象中。
collection
用于处理一对多或多对多关系。它将查询结果中的多行记录映射为一个 Java 集合,并将这个集合设置到它所属的 Java 对象中。
多对多 :
多对多的关键就是Order.xml文件的映射配置。我的理解就是首先拿着订单的id在订单和产品关系表中找到属于这个订单id的集合(一个订单id对应了多个产品,一对多),然后再给每个订单映射了产品的从属(多个订单可能都有同一个产品,多对一),从而达到多对多的效果。
三、动态sql
1、if 就是给sql语句加了个if判断功能
2、where有种if进阶版的感觉,可以判断多个条件并且不受空参影响,包括update对应的set都是一个道理,就不做额外练习
3、choose对标if else逻辑判断。有些同学会认为这是switch-case当然也没问题,如果按照if else理解了话其实这是一个多重if-else嵌套关系
4、 foreach标签就是可以让你配合in一次查找多个结果。其中“open="(" separator="," close=")"”这一句是在规范配合sql语句in的格式,不能省略
5、 bind标签我尝试了一下这样操作
可以运行,但是要注意属性不能往里面放,比如这样:
就不可以。
四、分页
教程的分页只是给你简单展示了一下功能,并没有真正的达到分页的效果,我们简单写一个代码来实现这个效果
package controller;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
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 Num.Category;
import Num.Order;
import Num.OrderItem;
import Num.Product;
public class TestMybatis {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
int start = 0 ,count = 5 ,page = 1;
while (true){
System.out.println("这是第" + page + "页");
Map<String,Object> params = new HashMap<>();
params.put("start", start);
params.put("count", count);
start += 5;
page ++;
List<Category> cs =session.selectList("listCategory", params);
for (Category c : cs) {
System.out.println(c);
}
if (page == 21) break;
session.commit();
}
session.close();
}
}
效果: