MyBatis

MyBatis学习笔记,记录了MyBatis的两种写法以及传参的过程等。

MyBatis简介

什么是MyBatis?

MyBatis是一个开源的第三方Java持久层框架,用于定制化SQL、存储过程以及高级映射。可用于ORM模型的实现。

什么是ORM模型?

ORM模型是一种通过映射表,把Java对象和数据库二维表之间建立关系的程序技术。通过映射表映射,实现对象的存储和读取。

使用场景
  • 更佳关注SQL优化的项目:例如开发时数据量小、生产环境数据量大。
  • 需求频繁更新改动的项目:Mybatis隐藏了底层的实现,使开发人员跟专注于业务实现。
下载和安装
实现基础的mybatis案例
  1. 在Eclipse中新建Maven项目。
  2. 访问mvnrepository.com查询以下包的依赖安装代码,并插入pom.xml文件的标签内:
    • mybatis包(3.4.3版本)
    • MySQL Connector包(5.1.41。6以下版本)
    • Junit(4.12版本。如果没有测试文件可以不导入此包)
  3. 配置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&amp;serverTimezone=GMT%2B8&amp;characterEncoding=utf8"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
      </dataSource>
    </environment>
  </environments>
  <!--映射配置文件的路径-->
  <mappers>
    <mapper resource="mapper/usersMapper.xml"/>
  </mappers>
</configuration>
  1. 创建数据库
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;
  1. 创建com.qqfh.entity包,创建Users类,新增全局变量,和数据库的字段一一对应。
  2. 在src/main/resources目录下创建mapper文件夹
  3. 在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>
  1. 在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的流程如下:

  1. 获取mybatis配置文件。
  2. 获取配置文件的输入流(InputStream)。
  3. 通过输入流构建工厂(SqlSessionFactory)。
  4. 通过工厂openSession()方法获得SqlSession对象。
  5. 通过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&amp;serverTimezone=GMT%2B8&amp;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语句的方式也不一样。

  1. 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>
  1. 需要通过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);
    }
}
  1. 编写包含注解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);
}
  1. 在业务执行类中,调用方法执行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]}
ListArrays.asList(1,2)#{collection[0]}或#{list[0]}
Arraynew 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&amp;serverTimezone=GMT%2B8&amp;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&amp;useUnicode=true&amp;serverTimezone=GMT%2B8&amp;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详细的处理过程信息。
使用步骤:

  1. 加载log4j的jar包
  2. 在src/main/resources目录下增加log4j的配置文件“log4j.properties”
  3. 内容如下(模板文件在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
  1. 上面的配置已经可以正常使用,在执行Mybatis相关操作时会有记录显示在console中。如果需要在指定位置检测自定义的内容,可以在Java文件中进行日志配置,内容如下:
Logger log = Logger.getLogger(UsersFindByIdServlet.class);
log.info("设置info信息,显示在console面板");
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值