MyBatis学习笔记,记录了MyBatis的两种写法以及传参的过程等。
MyBatis简介
什么是MyBatis?
MyBatis是一个开源的第三方Java持久层框架,用于定制化SQL、存储过程以及高级映射。可用于ORM模型的实现。
什么是ORM模型?
ORM模型是一种通过映射表,把Java对象和数据库二维表之间建立关系的程序技术。通过映射表映射,实现对象的存储和读取。
使用场景
- 更佳关注SQL优化的项目:例如开发时数据量小、生产环境数据量大。
- 需求频繁更新改动的项目:Mybatis隐藏了底层的实现,使开发人员跟专注于业务实现。
下载和安装
- MyBatis官网:http://www.mybatis.org/mybatis-3
- 手动下载导入包:
- 下载地址:https://github.com/mybatis/mybatis-3/releases
- 作为classpath依赖路径引入
- 作为依赖项目引入
- maven导入包:
- http://mvnrepository.com查询maven依赖配置
- maven项目的pom.xml中添加配置
- 查看项目依赖
实现基础的mybatis案例
- 在Eclipse中新建Maven项目。
- 访问mvnrepository.com查询以下包的依赖安装代码,并插入pom.xml文件的标签内:
- mybatis包(3.4.3版本)
- MySQL Connector包(5.1.41。6以下版本)
- Junit(4.12版本。如果没有测试文件可以不导入此包)
- 配置MyBatis主配置文件
- 在src/main/resources下新建mybatis.xml文件,内容如下:
<?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>
<!--开发环境集合-->
<environments default="development">
<!--id名为development的开发环境-->
<environment id="development">
<!--事务管理,使用JDBC管理-->
<transactionManager type="JDBC"/>
<!--数据源,使用数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mytest?useUnicode=true&serverTimezone=GMT%2B8&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--映射配置文件的路径-->
<mappers>
<mapper resource="mapper/usersMapper.xml"/>
</mappers>
</configuration>
- 创建数据库
CREATE DATABASE mytest;
USE mytest;
CREATE TABLE users(
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号',
username VARCHAR(50) COMMENT '登录账号',
userpass VARCHAR(50) COMMENT '登录密码',
nickname VARCHAR(20) COMMENT '用户昵称'
);
INSERT INTO users VALUES(1,'admin','admin','管理员');
INSERT INTO users VALUES(2,'manager','manager','管理员');
INSERT INTO users VALUES(3,'administrator','administrator','管理员');
SELECT * FROM users;
- 创建com.qqfh.entity包,创建Users类,新增全局变量,和数据库的字段一一对应。
- 在src/main/resources目录下创建mapper文件夹
- 在mapper文件夹下新建usersMapper.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">
<!--namespace 命名空间
通常情况,命名空间的值,是当前映射类的全名称
-->
<mapper namespace="com.qqfh.entity.Users">
<!--id名为selectBlog的查询,返回值类型为Users-->
<select id="usersList" resultType="com.qqfh.entity.Users">
select * from users
</select>
</mapper>
- 在src/test/java目录下新建类TestDemo.java,代码如下:
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 org.junit.Test;
import com.qqfh.entity.Users;
public class TestDemo {
@Test
public void testDemo() throws IOException {
//mybatis配置文件的名称
String resource = "mybatis.xml";
//初始化mybatis配置环境
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//打开和数据库之间的会话
SqlSession session = factory.openSession();
//执行查询
List<Users> ulist = session.selectList("usersList");
//遍历查询结果
for(Users u:ulist) {
System.out.println(u);
}
//关闭会话
session.close();
}
}
MyBatis参数配置
Java文件中使用Mybatis流程
在Java文件中使用Mybatis的流程如下:
- 获取mybatis配置文件。
- 获取配置文件的输入流(InputStream)。
- 通过输入流构建工厂(SqlSessionFactory)。
- 通过工厂openSession()方法获得SqlSession对象。
- 通过SqlSession执行配置好的SQL语句
mybatis-config.xml配置文件
mybatis-config.xml配置文件(文件名可以自定义),主要用于存放连接数据库的配置信息。
<?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="db.properties"></properties>
<!--
environments用于进行数据源的设置,可以配置多个数据源
default属性表示当前项目运行过程中使用哪个数据源id
-->
<environments default="development">
<!--
environment用于配置一个具体的独立的数据源
id属性表示给当前数据源定义一个名称,方便environments指定数据源
-->
<environment id="development">
<!--
transactionManager用于配置事务管理,默认情况下使用的是JDBC事务管理
-->
<transactionManager type="JDBC"/>
<!--
dataSource用于配置具体的连接信息
type属性表示是否使用连接池(POOLED值表示使用数据库连接池)
-->
<dataSource type="POOLED">
<!--
property用于表示具体的配置信息
value属性的值可以直接指定也可以调用properties配置文件中的值,例如"${driver}"对应的是properties配置文件中driver的值。
-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--
mappers用于配置外部的映射配置文件
在主配置文件中需要引入加载映射配置文件
-->
<mappers>
<!--
mapper用于配置引入某个具体的映射配置文件
resource属性表示通过文件路径的方式引入
-->
<mapper resource="mapper/userMapper.xml"/>
</mappers>
</configuration>
可以配置properties文件,用于设置数据连接信息,内容以key=value形式写入。
db.properties文件(文件名可以自定义)
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mytest?useUnicode=true&serverTimezone=GMT%2B8&characterEncoding=utf8
username=root
password=root
userMapper.xml配置文件
userMapper.xml配置文件(文件名可以自定义),用于存放具体的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属性表示命名空间,主要进行session级别的缓存管理
命名空间默认情况下,使用映射类的全名称
-->
<mapper namespace="com.qqfh.mybatis.Users">
<!--
select用于配置具体的SQL语句
id属性表示为该条SQL语句定义一个名词,方便java程序调用
resultType属性表示返回值类型
如果需要使用resultMap自定义映射,则该行需要改为:
<select id="findAll" resultMap="forUsers">
-->
<select id="findAll" resultType="com.qqfh.mybatis.Users">
select * from users
<if test="id != null">
<!--
#{id}表示传递过来的Users对象的id全局变量值
-->
where id = #{id}
</if>
</select>
<!--
可以配置多个查询条件
-->
<select id="findAll" resultType="com.qqfh.mybatis.Users">
select * from users where id = #{id}
</select>
<!--
resultMap自定义映射关系集合,包含对于一些自定义操作的配置。例如不一致的属性和字段
id属性表示当前映射关系的名称
type属性表示这个resultMap保存数据的类型
-->
<resultMap id="forUsers" type="com.qqfh.mybatis.Users">
<!--id标签用于配置主键-->
<id coloumn="id" property="uid"></id>
<!--
result用于配置普通属性
column属性表示数据库字段名称
property属性表示实体类的属性
-->
<result column="username" property="name"></result>
</resultMap>
</mapper>
通过注解编写SQL语句
可以通过注解的形式编写SQL语句,可以更加便捷(Java程序可以直接通过调用方法执行SQL语句)。注解的编写方式和Mapper编写方式不同,要修改MyBatis配置文件,同时Java文件中执行SQL语句的方式也不一样。
- MyBatis配置文件中,标签修改为对应的包。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.4//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
<property name="reasonable" value="true"/>
</plugin>
</plugins>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/icake"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.imooc.icake.dao"/>
</mappers>
</configuration>
- 需要通过getMapper()方法,传入包含注解SQL语句的类名,返回对象。
package com.imooc.icake.global;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
public class DaoFactory {
private static DaoFactory daoFactory;
private SqlSessionFactory sessionFactory;
private DaoFactory(){
SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
try {
sessionFactory = sessionFactoryBuilder.build(Resources.getResourceAsReader("/mybatis.xml"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static DaoFactory getInstence(){
if(daoFactory==null)
daoFactory = new DaoFactory();
return daoFactory;
}
public <T> T getDao(Class<T> tClass){
return sessionFactory.openSession(true).getMapper(tClass);
}
}
- 编写包含注解SQL语句的类
package com.imooc.icake.dao;
import com.imooc.icake.entity.Catalog;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface CatalogDao {
@Insert("<script>" +
"insert into catalog(title,pid,info) values" +
"<foreach collection='list' item='catalog' separator=','>" +
"(#{catalog.title},#{catalog.pid},#{catalog.info})" +
"</foreach>" +
"</script>")
@Options(useGeneratedKeys = true,keyProperty = "id")
void batchInsert(List<Catalog> list);
@Delete("delete from catalog where id=#{id}")
void delete(int id);
@Select("select * from catalog where id=#{id}")
@Results(id = "all",value = {
@Result(column = "id",property = "id",id = true),
@Result(column = "title",property = "title"),
@Result(column = "pid",property = "pid"),
@Result(column = "info",property = "info"),
@Result(column = "id",property = "children",many = @Many(select = "selectByPid"))
})
Catalog select(int id);
@Select("select * from catalog where pid=#{pid}")
@ResultMap("all")
List<Catalog> selectByPid(int pid);
}
- 在业务执行类中,调用方法执行SQL语句
package com.imooc.icake.biz.impl;
import com.imooc.icake.biz.CatalogBiz;
import com.imooc.icake.dao.CatalogDao;
import com.imooc.icake.entity.Catalog;
import com.imooc.icake.global.DaoFactory;
import java.util.List;
public class CatalogBizImpl implements CatalogBiz {
private CatalogDao catalogDao = DaoFactory.getInstence().getDao(CatalogDao.class);
public void add(List<Catalog> list) {
catalogDao.batchInsert(list);
}
public void remove(int id) {
catalogDao.delete(id);
}
public Catalog getRoot() {
return catalogDao.select(10000);
}
}
MyBatis参数传递
在MyBatis映射文件中,SQL语句里会需要一个或多个参数,此时就需要了解MyBatis的参数传递方法。下面分为单参数传递、多参数传递和集合类型参数传递。
单参数传递
忽视传递参数的名称,直接把参数匹配到SQL的语句当中空缺的位置(不需要与SQL语句中空缺位置名称匹配)。
多参数传递
方式名称 | 传递参数 | XML获取方式 |
---|---|---|
默认方式 | 直接传递多个类型参数时,系统会自动命名参数名: [arg1,arg2…,parm1,parm2…] | 调用时需要使用系统给定的参数名:#{parm1} #{parm2} |
封装实体类 | 传递一个对象 | 使用#{属性名}就可以调用 |
封装为Map | 直接传递一个map对象 | 使用#{key}就可以取出对应的值 |
@param注解 | 定义映射时,使用"@Param(“user”)String username",user相当于key | 直接使用#{user}取值 |
集合类型传递
集合名称 | 传递参数 | XML获取方式 |
---|---|---|
Collection | 集合类型 | #{collection[0]} |
List | Arrays.asList(1,2) | #{collection[0]}或#{list[0]} |
Array | new int[]{1,2} | #{array[0]} |
foreach遍历参数
通过数组、集合传递参数时,可以用foreach遍历参数
属性 | 说明 | 例子 |
---|---|---|
collection | 指定需要遍历的名称 | collection=“array” |
item | 每次循环时值的名称 | item=“id” |
index | 当前遍历的索引值 | index=“1” |
open | 开始符号 | open="(" |
close | 结尾符号 | close=")" |
separator | 分隔符 | separator="," |
例子
<select id="getPersonByIds" resultType="person">
select * from person where id in
<foreach collection="array" item="id" index="i" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
具体命令
新增数据
Mapper新增
Mapper.xml文件配置:
<insert id="addUser">
insert into users(username,userpass,nickname)
values(#{username},#{userpass},#{nickname})
</insert>
Java文件中配置:
//sqlsession是SqlSession的实例对象,insert()方法返回影响行数
//addUser是Mapper.xml文件中对应的ID名称。
//user是对应数据库字段的实体类对象,存放了需要新增的数据。
sqlsession.insert("addUser",user);
//需要使用SqlSession的commit()方法提交
sqlsession.commit();
因为Mysql中主键的值是自动增长。如果想通过Mybatis新增数据时,传入的对象能获得自动增长的主键,应该在Mapper.xml文件中添加属性:
//自动增长的值,赋给对应实体类的id全局变量。
<insert id="addUser" useGeneratedKeys="true" keyProperty="id">
insert into users(username,userpass,nickname)
values(#{username},#{userpass},#{nickname})
</insert>
SQL片段
在Mapper.xml配置时,会遇到某一段连续代码重复输入的情况很多,这时可以把该段代码改为SQL片段,在遇到需要该段代码时可以简写。
//设置SQL代码片段
<sql id="user_fields">
username,userpass,nickname,age,gender
</sql>
//引用SQL代码片段
<include refid="user_fields"></include>
注解新增
通过注解的方式编写SQL新增语句:
@Insert("<script>" +
"insert into catalog(title,pid,info) values" +
"<foreach collection='list' item='catalog' separator=','>" +
"(#{catalog.title},#{catalog.pid},#{catalog.info})" +
"</foreach>" +
"</script>")
@Options(useGeneratedKeys = true,keyProperty = "id")
void batchInsert(List<Catalog> list);
@Insert("insert into cake(title,cid,image_path,price,taste,sweetness,weight,size,material,status) values(#{title},#{cid},#{imagePath},#{price},#{taste},#{sweetness},#{weight},#{size},#{material},#{status})")
@Options(useGeneratedKeys = true,keyProperty = "id")
void insert(Cake cake);
批量新增数据
可以使用以下三种方式批量新增数据:
- foreach遍历集合,增加value尾部的值
- 数据库连接方式处,增加allowMultiQueries=true设置,增加整条新增语句
- 通过ExecutorType进行批量增加
foreach循环参数
参数名称 | 说明 |
---|---|
collection | 表示需要遍历的变量名称 |
item | 表示定义一个变量,接收每次循环的一个对象 |
separator | 分隔符,一次循环后在结尾增加的内容 |
foreach方式添加多条值
总共需要配置5个文件。大致流程:创建mybatis配置文件,创建映射配置文件,创建映射配置文件对应的接口类,创建数据库对应的实体类,创建测试类。
Mybatis配置文件(mybatis.xml):
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/qqfh?useUnicode=true&serverTimezone=GMT%2B8&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UsersDao.xml"/>
</mappers>
</configuration>
映射配置文件(UsersDao.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.qqfh.mybatis.dao.UsersDao">
<insert id="addcourses">
insert into course(Course_name,Teacher) value
<foreach collection="courses" item="course" separator=",">
(#{course.Course_name},#{course.teacher})
</foreach>
</insert>
</mapper>
映射文件对应的接口类(UsersDao.java):
package com.qqfh.mybatis.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.qqfh.mybatis.entity.Course;
public interface UsersDao {
void addcourses(@Param("courses")List<Course> list);
}
数据库对应的实体类(Course.java):
package com.qqfh.mybatis.entity;
public class Course {
private int Course_id;
private String Course_name;
private String Teacher;
private int Course_time;
private String Description;
//以下省略,各种get、set等
......
}
测试类(UserTest.java):
package com.qqfh.mybatis.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
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.qqfh.mybatis.dao.UsersDao;
import com.qqfh.mybatis.entity.Course;
public class UserTest {
public static SqlSessionFactory sqlsessionFactory = null;
public SqlSessionFactory getSqlSessionFactory() throws IOException {
if(sqlsessionFactory==null) {
String resource = "mybatis.xml";
InputStream is = Resources.getResourceAsStream(resource);
sqlsessionFactory = new SqlSessionFactoryBuilder().build(is);
}
return sqlsessionFactory;
}
public void test1() throws IOException {
SqlSession sqlsession = getSqlSessionFactory().openSession();
UsersDao userDao = sqlsession.getMapper(UsersDao.class);
List<Course> list = new ArrayList<Course>();
for (int i = 0; i < 20; i++) {
Course course = new Course();
course.setCourse_name("tom"+i);
course.setTeacher("teacher"+i);
list.add(course);
}
userDao.addcourses(list);
sqlsession.commit();
}
public static void main(String[] args) throws IOException {
new UserTest().test1();
}
}
开启allowMultiQueries,foreach方式添加多条语句
和“foreach方式添加多条值”几乎一样,区别在于这里是添加多条insert语句,在使用前需要在配置连接处增加allowMultiQueries=true属性。
MyBatis配置文件中需要添加“allowMultiQueries=true”(mybaits.xml):
<property name="url" value="jdbc:mysql://127.0.0.1:3306/qqfh?allowMultiQueries=true&useUnicode=true&serverTimezone=GMT%2B8&characterEncoding=utf8"/>
映射配置文件中修改为多条insert语句(UsersDao.xml):
<insert id="addcourses">
<foreach collection="courses" item="course" separator=";">
insert into course(Course_name,Teacher) value
(#{course.Course_name},#{course.teacher})
</foreach>
</insert>
通过ExecutorType批量新增
可以使用批处理提交方式批量新增,这样的方式可以不改动xml映射文件,只需要在测试类开启批量传递模式即可。
映射配置文件(UsersDao.xml):
<insert id="addCourse" parameterType="com.qqfh.mybatis.entity.Course">
insert into course(Course_name,Teacher) value(#{Course_name},#{Teacher})
</insert>
测试类部分代码(UsersTest.java):
public void test2() throws IOException {
//在此处开启批处理提交的方式
SqlSession sqlsession = getSqlSessionFactory().openSession(ExecutorType.BATCH);
UsersDao userDao = sqlsession.getMapper(UsersDao.class);
//通过循环批量传递数值
for (int i = 0; i < 20; i++) {
userDao.addCourse(new Course("apple"+i,"xiaomi"+i));
}
sqlsession.commit();
}
public static void main(String[] args) throws IOException {
new UserTest().test2();
}
修改数据
Mapper修改
Mapper.xml文件配置:
<update id="modifyStudent">
update students
<set>
<if test="sex != null">sex = #{sex},</if>
<if test="sex != null">age = #{age},</if>
<if test="sex != null">grade = #{grade},</if>
<if test="sex != null">major = #{major}</if>
</set>
where id = #{id}
</update>
Java文件中配置:
getSession().update("modifyStudent", user);
sqlsession.commit();
注解修改
通过注解的方式编写SQL修改语句:
@Update("update cake set title=#{title},cid=#{cid},image_path=#{imagePath},price=#{price},taste=#{taste},sweetness=#{sweetness},weight=#{weight},size=#{size},material=#{material},status=#{status} where id=#{id}")
void update(Cake cake);
删除数据
Mapper删除
Mapper.xml文件配置:
<delete id="delUser">
delete from students where id = #{id}
</delete>
Java文件中配置:
getSession().delete("delUser", new Users(id));
sqlsession.commit();
注解删除
通过注解的方式编写SQL删除语句:
@Delete("delete from catalog where id=#{id}")
void delete(int id);
查询数据
Mapper查询
Mapper.xml文件配置:
<select id="findUser" resultType="com.qqfh.students.entity.Users">
select * from students
<if test="id!=null">
where id = #{id}
</if>
</select>
Java文件中配置:
//查询所有用户,返回List对象
List<Users> list = getSession().selectList("findUser");
//查询单个用户
Users user = getSession().selectOne("findUser",new Users(id));
注解查询
通过注解的方式编写SQL查询语句:
@Select("select * from account where account=#{name}")
@Results(value={
@Result(id = true,column = "id",property = "id"),
@Result(column = "account",property = "name"),
@Result(column = "password",property = "password"),
@Result(column = "nick_name",property = "nickName")}
)
List<Account> selectByName(String name);
多表查询数据
Mapper多表查询
根据User的ID查找Users表和Address表中的数据。
Mapper.xml文件配置:
<select id="findUsers" resultMap="forUsers">
select * from users
<if test="id != null">
where id = #{id}
</if>
</select>
<resultMap id="forUsers" type="com.qqfh.entity.Users">
//明确指定主键为id,绑定id主键
<id property="id" column="id"></id>
<!--
collection表示多表查询
property属性表示Users表中的哪个字段需要从其他表获取
column属性表示Users表中的哪个字段是其他表的外键
ofType属性表示返回的数据存放的实体类
select表示数据来源,相当于指定和哪个表进行多表查询
-->
<collection property="addresses" column="id" ofType="com.qqfh.entity.Address" select="getAddress"></collection>
</resultMap>
<select id="getAddress" resultType="com.qqfh.entity.Address">
select * from address where userid = #{id}
</select>
Java文件中配置:
需要新建一个Address表对应的实体类,并且在Users表中包含List<Address>全局变量。
//查询单个用户
Users user = getSession().selectOne("findUser",new Users(id));
注解多表查询
通过注解的方式编写SQL多表查询语句:
@Select("select * from catalog where id=#{id}")
@Results(id = "all",value = {
@Result(column = "id",property = "id",id = true),
@Result(column = "title",property = "title"),
@Result(column = "pid",property = "pid"),
@Result(column = "info",property = "info"),
@Result(column = "id",property = "children",many = @Many(select = "selectByPid"))
})
Catalog select(int id);
@Select("select * from catalog where pid=#{pid}")
@ResultMap("all")
List<Catalog> selectByPid(int pid);
log4j日志记录
日志框架,可以对MyBatis的执行过程进行跟踪,能得到MyBatis详细的处理过程信息。
使用步骤:
- 加载log4j的jar包
- 在src/main/resources目录下增加log4j的配置文件“log4j.properties”
- 内容如下(模板文件在log4j的安装包目录下的examples文件夹,名称为sort1.properties):
//显示DEBUG格式日志(可以改为WARN或INFO),A1代表日志源
log4j.rootLogger=DEBUG,A1
//该日志源在控制台进行输出
log4j.appender.A1=org.apache.log4j.ConsoleAppender
//使用固定的格式
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
//具体的格式
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
- 上面的配置已经可以正常使用,在执行Mybatis相关操作时会有记录显示在console中。如果需要在指定位置检测自定义的内容,可以在Java文件中进行日志配置,内容如下:
Logger log = Logger.getLogger(UsersFindByIdServlet.class);
log.info("设置info信息,显示在console面板");