JavaWeb——Mybatis框架多表操作

1、mybatis插入数据返回主键
2、mybatis多表联合查询
3、mybatis动态sql

一、返回主键

在插入一条数据的时候 如果这条数据继续使用 当主键是自动生成的时候 主键不会返回
我们在mapper 中 可以使用一个函数
last_insert_id() 找到最后一次使用的插入的id 使用这个函数 不能直接使用 必须在一次 session 中 插入后使用
在mapper 中的 insert 标签内添加

主配置文件:

<?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>

	<!-- 配置别名 作用:在mapper映射文件内 不用写包名+类名 -->
	<typeAliases>
		<!-- type 需要配置别名的类 alias 别名 -->
		<!-- <typeAlias type="beer.onexone.cnf" alias="cnf"/> -->
		<!-- 也可以配置扫描包 该包下所有的类 默认添加别名 不区分大小写 -->
		<package name="beer.onexone.cnf"  />
		
	</typeAliases>

	<!-- default 表示默认的使用id -->
	<environments default="development">
		<environment id="development">
			<!-- 事务管理 type只有两个值 JDBC(支持事务) managed(不支持事务) -->
			<transactionManager type="JDBC" />
			<!-- 数据源 type 连接池的类型 POOLED jdbc连接池 UNPOOLED 不使用连接池 JNDI 其他连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql:///userinfo?characterEncoding=utf8" />
				<property name="username" value="root" />
				<property name="password" value="Qwertyuiop852963" />
			</dataSource>
		</environment>
	</environments>

	<!-- 用来管理映射文件 -->
	<mappers>
		
		<!-- <mapper resource="beer/onexone/entity/PersonMapper.xml"/> -->
  		<!-- <mapper  class="beer.onexone.mapper.PersonMapper"/> -->
		<!-- 单个映射文件 resourse 写xml的包名加上名字 调用session.insert  -->
		<!--也可以使用class来配置
						1、需要创建一个与接口名称与xml文件一致的接口类
						2、在接口中创建和mapper中对应的方法
						3、在mapper.xml文件中namespace必须指定接口的地址
						使用时调用session.getMapper()方法 -->
		<!-- 还可以使用packge标签来配置单个映射文件,可以只配置包名 -->
		<package name="beer.onexone.mapper"/>
		
	</mappers>
</configuration>

该方法配置文件:

<?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="beer.onexone.mapper.Fanhuizhujian">
  	<insert id="addCallback">
  			<selectKey keyColumn="id" keyProperty="id" resultType="int"  order="AFTER">
  				select last_insert_id()
  			</selectKey>
  				insert into person (sex,age,birthday,name) 
				values(#{sex},#{age},#{birthday},#{name})
  	</insert>
  </mapper>

方法接口:

package beer.onexone.mapper;

import beer.onexone.beans.Person;

public interface Fanhuizhujian {
		int addCallback(Person person);
}

测试方法:

package beer.onexone.main;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;

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 beer.onexone.beans.Person;
import beer.onexone.mapper.Fanhuizhujian;

public class MybatisCallback {
			
			@Test
			public void addCallback() throws IOException {
				//获取配置文件字节流
				InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml");
				//创建session工厂
				SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
				//开启session
				SqlSession openSession = build.openSession();
				//创建对象
				Person person = new Person( 1, 12, new Date(), "ww");
				//调用方法
				Fanhuizhujian mapper = openSession.getMapper(Fanhuizhujian.class);
				int addCallback = mapper.addCallback(person);
				if (addCallback>0) {
					System.out.println(person.getId());
				}
				
			}
}

二、Mybatis多表联合查询

数据库表:

1、一对一查询

主配置文件:

<?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>

	<!-- 配置别名 作用:在mapper映射文件内 不用写包名+类名 -->
	<typeAliases>
		<!-- type 需要配置别名的类 alias 别名 -->
		<!-- 也可以配置扫描包 该包下所有的类 默认添加别名 不区分大小写 -->
		<package name="beer.onexone.beans"  />
	</typeAliases>

	<!-- default 表示默认的使用id -->
	<environments default="development">
		<environment id="development">
			<!-- 事务管理 type只有两个值 JDBC(支持事务) managed(不支持事务) -->
			<transactionManager type="JDBC" />
			<!-- 数据源 type 连接池的类型 POOLED jdbc连接池 UNPOOLED 不使用连接池 JNDI 其他连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql:///userinfo?characterEncoding=utf8" />
				<property name="username" value="root" />
				<property name="password" value="Qwertyuiop852963" />
			</dataSource>
		</environment>
	</environments>

	<!-- 用来管理映射文件 -->
	<mappers>
		
		<!-- <mapper resource="beer/onexone/entity/PersonMapper.xml"/> -->
  		<!-- <mapper  class="beer.onexone.mapper.PersonMapper"/> -->
		<!-- 单个映射文件 resourse 写xml的包名加上名字 调用session.insert  -->
		<!--也可以使用class来配置
						1、需要创建一个与接口名称与xml文件一致的接口类
						2、在接口中创建和mapper中对应的方法
						3、在mapper.xml文件中namespace必须指定接口的地址
						使用时调用session.getMapper()方法 -->
		<!-- 还可以使用packge标签来配置单个映射文件,可以只配置包名 -->
		
		<package name="beer.onexone.mapper"/>
	</mappers>
</configuration>

子配置文件:

<?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="beer.onexone.mapper.Employees">
	<!-- 当数据库和POJO中的属性不一致时,配置resultMap
	若主配置文件写了别名,则type属性不用写全类名 -->
	<resultMap type="Employee" id="baseEmployee">
		<id column="e_id" property="id" />
		<result column="e_name" property="name" />
		<result column="e_age" property="age" />
		<result column="e_sal" property="salary" />
	</resultMap>

	<!-- 配置联合查询结果集 -->
	<resultMap type="Employee" id="unionRetrieve"
		extends="baseEmployee">
		<!-- association用来指定一对一查询 department 项目类中的一对一表示的名字 javaType Java中对应的类 -->
		<association property="department" javaType="Department">
			<id column="d_id" property="id" />
			<result column="d_name" property="name" />
			<result column="d_address" property="address" />
		</association>
	</resultMap>

	<select  id="findAllEmployees" resultMap="unionRetrieve">
		select * from employee e left join department d on d.d_id = e.e_depart_id
	</select>
</mapper>

接口文件

package beer.onexone.mapper;

import java.util.List;

import beer.onexone.beans.Employee;

public interface Employees{

		List<Employee>  findAllEmployees();
		
}

多对多查询

配置文件:

<?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="beer.onexone.mapper.TeacherMapper">
 				<!-- 根据所教科目查询学生 -->
 				<select id="findTeacherByClass" resultMap="teacherMapByclass">
 					select * from teacher t,student s,student_teacher st 
 					where t.t_class=#{class} and t.t_id = st.t_id and s.s_id = st.s_id
 				</select>
 				
 				<resultMap type="Teacher" id="teacherMapByclass">
 						<id column="t_id" property="id"/>
 						<result column="t_name" property="name" />
 						<result column="t_class" property="major" />
 						<!-- 相当于一对多使用collection -->
 						<collection property="students"  ofType="TeacherStudent">
 								<id column="s_t_id" property="id"/>
 								<association property="student" javaType="Student">
 											<id column="s_id" property="id"/>
 											<result column="s_name" property="name"/>
 											<result column="s_sex" property="sex"/>
 											<result column="s_age" property="age"/>
 								</association>
 						</collection>
 				</resultMap>
 </mapper> 

接口:

package beer.onexone.mapper;

import java.util.List;

import beer.onexone.beans.Teacher;

public interface TeacherMapper {
			
	//通过课程查询教师
	List<Teacher> findTeacherByClass(String major);
}

实体类:

			private int id;
			private String name;
			private int sex;
			private int age;
			private List<Teacher> teachers;
		private int id ;
		private String name;
		private String major;
		private List<Student> students;
		public Teacher() {
private int id;
private Student student;
private Teacher teacher;

动态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="beer.onexone.mapper.ChangeanleSQL">
	<select id="getStudentBySexOrNameOrAge" resultMap="getStudentBySexOrNameOrAgeMap">
	select * from student 
	<where>
			<if test="sex != null and sex != 0">
					or s_sex = #{sex}
			</if>
			<if test="name != null">
					or s_name = #{name}
			</if>
			<if test="age != null and age !=0">
			or s_age = #{age}
			</if>

	</where>
	</select>
	
	<resultMap type="student" id="getStudentBySexOrNameOrAgeMap">
		<id column="s_id" property="id"/>
		<result column="s_name" property="name"/>
			<result column="s_age" property="age"/>
				<result column="s_sex" property="sex"/>
	</resultMap>
</mapper>

接口:

package beer.onexone.mapper;

import java.util.List;

import beer.onexone.beans.Student;

public interface ChangeanleSQL {
		List<Student> getStudentBySexOrNameOrAge(Student student);
}

测试方法:

@Test
					public void getStudentBySexOrNameOrAge() throws Exception {
						//获取配置文件
						InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml");
						//获取工厂
						SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
						//开启session
						SqlSession openSession = build.openSession();
						//获取mapper
						ChangeanleSQL mapper = openSession.getMapper(ChangeanleSQL.class);
						//调用方法查询
						Student student = new Student();
						student.setSex(1);
						List<Student> findTeacherByClass = mapper.getStudentBySexOrNameOrAge(student);
						for (Student student2 : findTeacherByClass) {
							System.out.println(student2.getId());
						}
					}

trim标签,前缀后缀

foreach标签:

jingsongchan

发表评论

电子邮件地址不会被公开。 必填项已用*标注