本次练习基于how2j完成MyBatis入门、CRUD、更多查询
1.MyBatis入门:
(1)关于两个xml配置文件
MyBatis-config.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 声明XML版本和编码 -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--
MyBatis 配置文件的 DTD 声明,用于验证 XML 配置文件是否符合 MyBatis 的语法规范。
-->
<configuration>
<!-- 声明类型别名,用于简化 Java 类型的命名,方便在 XML 中引用。 -->
<!--使用pakage标签,使得name包下所有的类可在后续xml配置中直接简写为类名 -->
<typeAliases>
<package name="com.how2java.pojo"/>
</typeAliases>
<!-- 声明环境,用于定义 MyBatis 的运行环境,包括事务管理器和数据源等。 -->
<environments default="development">
<environment id="development">
<!-- 声明事务管理器类型,用于管理数据库事务,包括开启、提交、回滚等操作。 -->
<transactionManager type="JDBC"/>
<!-- 声明数据源类型,用于连接数据库,包括数据库驱动、URL、用户名和密码等信息。 -->
<dataSource type="POOLED">
<!-- 数据库驱动 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!-- 数据库连接URL -->
<property name="url" value="jdbc:mysql://localhost:3306/how2java?characterEncoding=UTF-8"/>
<!-- 数据库用户名 -->
<property name="username" value="root"/>
<!-- 数据库密码 -->
<property name="password" value="admin"/>
</dataSource>
</environment>
</environments>
<!-- 声明映射器,用于定义数据库操作的 SQL 语句和映射关系。 -->
<mappers>
<mapper resource="com/how2java/pojo/Category.xml"/>
</mappers>
</configuration>
MyBatis 的配置文件,用于配置 MyBatis 的运行环境、数据源、事务管理器和映射器等。其中,
typeAliases标签用于声明类型别名,方便在 XML 中引用 Java 类型;
environments标签用于声明 MyBatis的运行环境,包括事务管理器和数据源等;
dataSource 标签用于连接数据库,包括数据库驱动、URL、用户名和密码等信息;
mappers标签用于声明映射器,定义数据库操作的 SQL 语句和映射关系。
通过这个文件的配置,MyBatis 可以连接数据库并执行SQL 语句,实现数据的持久化和访问。
Category.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 声明XML版本和编码 -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 声明mapper的DTD -->
<mapper namespace="com.how2java.pojo">
<!-- 声明mapper的命名空间,用于唯一标识该mapper -->
<select id="listCategory" resultType="Category">
<!-- 声明查询语句,用于查询表格category_的所有字段 -->
select * from category_
</select>
<!-- 查询结果映射类型,即将查询结果映射为Category类型 -->
</mapper>
<!-- 该mapper用于提供关于Category表格的数据库操作,包括查询、插入、更新、删除等操作。 -->
MyBatis 的映射器文件,用于定义数据库操作的 SQL 语句和映射关系。其中,mapper 标签用于声明映射器的命名空间,唯一标识该映射器;
select 标签用于声明查询语句,用于查询表格 category_的所有字段;resultType 属性用于声明查询结果映射类型,即将查询结果映射为 Category类型。
通过这个文件的配置,MyBatis 可以根据映射器文件中的 SQL 语句和映射关系,执行数据库操作,实现数据的持久化和访问。这个文件提供了关于 Category表格的数据库操作,包括查询、插入、更新、删除等操作。
(2)注意:
- 本次建立的是一个Java项目,而不是一个动态Web项目;
- 本次不能与Web项目一样,仅将jar包放在新建的lib文件夹下就可以了,还需要导入
- 注意文件的位置:
(3)运行效果:
运行TestMyBatis.java:
(4)代码:
两个配置文件见上
Category.java:
package com.how2java.pojo;
public class Category {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
TestMyBatis.java:
package com.how2java;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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 com.how2java.pojo.Category;
public class TestMybatis {
public static void main(String[] args) throws IOException {
// 配置文件的路径
String resource = "mybatis-config.xml";
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
// 根据配置文件构建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 打开一个新的 SqlSession
SqlSession session=sqlSessionFactory.openSession();
// 查询所有的 Category 记录
List<Category> cs=session.selectList("listCategory");
for (Category c : cs) {
System.out.println(c.getName());
}
// 关闭 SqlSession
session.close();
}
}
2.MyBatis的CRUD:
(1)前置准备:
补充CUD所需的xml配置文件
代码如下:
Category.xml:
<?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="com.how2java.pojo">
<!-- 定义一个名为addCategory的插入操作,参数类型为Category -->
<insert id="addCategory" parameterType="Category" >
insert into category_ ( name ) values (#{name})
</insert>
<!-- 定义一个名为deleteCategory的删除操作,参数类型为Category -->
<delete id="deleteCategory" parameterType="Category" >
delete from category_ where id= #{id}
</delete>
<!-- 定义一个名为getCategory的查询操作,参数类型为int,结果类型为Category -->
<select id="getCategory" parameterType="_int" resultType="Category">
select * from category_ where id= #{id}
</select>
<!-- 定义一个名为updateCategory的更新操作,参数类型为Category -->
<update id="updateCategory" parameterType="Category" >
update category_ set name=#{name} where id=#{id}
</update>
<!-- 定义一个名为listCategory的查询操作,结果类型为Category -->
<select id="listCategory" resultType="Category">
select * from category_
</select>
</mapper>
(2)C:
- 添加代码片段进行插入操作:
//new一个Category对象
Category c = new Category();
//调用c对象的SetName方法
c.setName("Category");
//调用session的insert方法,执行id为addCategory的sql语句
//向数据库中插入c对象
session.insert("addCategory",c);
- 添加listAll方法,方便在控制台观察:
private static void listAll(SqlSession session) {
List<Category> cs = session.selectList("listCategory");
for (Category c : cs) {
System.out.println(c.getName());
}
}
- 完整代码:
package com.how2java;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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 com.how2java.pojo.Category;
public class TestMybatis {
public static void main(String[] args) throws IOException {
// 配置文件的路径
String resource = "mybatis-config.xml";
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
// 根据配置文件构建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 打开一个新的 SqlSession
SqlSession session=sqlSessionFactory.openSession();
Category c = new Category();
c.setName("category3");
session.insert("addCategory",c);
listAll(session);
session.commit();
session.close();
}
private static void listAll(SqlSession session) {
List<Category> cs = session.selectList("listCategory");
for (Category c : cs) {
System.out.println(c.getName());
}
}
}
- 运行TestMyBatis.java,观察数据库和控制台:
(3)R:
见MyBatis入门
(4)U:
- 添加代码片段进行个更新操作:
//先进行查询操作,再进行修改
//因为修改必须要基于一定的对象,没有对象修改啥呢
//查询id为1的元组,返回一个Category对象,用“装”着
Category c= session.selectOne("getCategory",1);
//调用c的SetName方法,修改c的名字为“”
c.setName("你好,我被修改了");
//执行SQL语句
session.update("updateCategory",c);
运行TestMyBatis.java,观察数据库和控制台:
(5)D:
- 添加代码片段进行个删除操作:
//在配置文件Category.java中声明的传入的参数类型是Category对象
Category c = new Category();
c.setId(1);
//删除id为1的对象
session.delete("deleteCategory",c);
- 运行TestMyBatis.java,观察数据库和控制台:
3.MyBatis更多查询:
(1)模糊查询:
- 在Category.xml中添加代码,即可重复使用的sql语句,id为listCategoryByName:
<select id="listCategoryByName" parameterType="string" resultType="Category">
select * from category_ where name like concat('%',#{0},'%')
</select>
- 修改listAll方法中的selectList方法的参数,实现查询模糊查询,”具体情况如下:
private static void listAll(SqlSession session) {
// List<Category> cs = session.selectList("listCategory");
List<Category> cs = session.selectList("listCategoryByName","六");
for (Category c : cs) {
System.out.println(c.getName());
}
}
- 运行TestMyBatis.java,观察控制台:
(4)多条件查询:
- 在Category.xml中添加代码,即可重复使用的sql语句,id为listCategoryByIdAndName:
</select>
<select id="listCategoryByIdAndName" parameterType="map" resultType="Category">
select * from category_ where id> #{id} and name like concat('%',#{name},'%')
</select>
- 创建一个空的参数映射表,修改listAll方法中的selectList方法的参数,实现查询多条件查询,”具体情况如下:
private static void listAll(SqlSession session) {
// 创建一个空的参数映射表
Map<String,Object> params = new HashMap<>();
// 向参数映射表中添加两个参数,id 和 name
params.put("id", 3);
params.put("name", "cat");
// 调用 SqlSession 的 selectList 方法执行查询操作
// 第一个参数是映射文件中定义的查询语句的 ID,第二个参数是参数映射表
List<Category> cs = session.selectList("listCategoryByIdAndName",params);
// 遍历查询结果,输出每个 Category 对象的 name 属性
for (Category c : cs) {
System.out.println(c.getName());
}
}
- 运行TestMyBatis.java,观察控制台:
4.关于Map:
Map 是 Java 中的一个泛型类型,它表示一个键值对映射表,其中键的类型为 String,值的类型为 Object。这个类型常用于存储动态参数或结果集,可以根据需要动态添加、删除或修改键值对。
例如,我们可以使用Map来存储学生的成绩,其中键是学生的姓名,值是他们的成绩。以下是一个示例代码:
Map<String, Integer> scores = new HashMap<>();
scores.put("Alice", 85);
scores.put("Bob", 90);
scores.put("Charlie", 80);
在上面的代码中,我们使用了HashMap来创建一个Map对象,并使用put()方法向Map中添加键值对。在这个Map中,我们使用学生的姓名作为键,使用他们的成绩作为值。
我们还可以使用get()方法来获取Map中的值。例如,我们可以使用以下代码来获取Bob的成绩:
int bobsScore = scores.get("Bob");
在这个例子中,我们使用了get()方法来获取Bob的成绩,并将其存储在一个整数变量中。
除了HashMap之外,Java中还有其他类型的Map,例如TreeMap和LinkedHashMap。每种类型的Map都有其自己的特点和用途。
最近几天考试较多,mybatis剩余内容周天继续学习。