MyBatis 基础讲解

MyBatis 基础讲解

简介:本文中讲解为一个小项目,其中从test1-test7包中的内容分别是,xml方式、注解方式(接口模式)、字段名称不对应的配置、一对一关系映射、一对多关系映射、动态sql和模糊查询--多条件查询、缓存机制

 

1、项目清单

2、bean包

package com.atguigu.day03_mybaits.bean;

import java.util.List;

public class Classes {

	private int id;
	private String name;
	private Teacher teacher;
	private List<Student> students;

	public Classes(int id, String name, Teacher teacher, List<Student> students) {
		super();
		this.id = id;
		this.name = name;
		this.teacher = teacher;
		this.students = students;
	}

	public Classes(int id, String name, Teacher teacher) {
		super();
		this.id = id;
		this.name = name;
		this.teacher = teacher;
	}

	public Classes() {
		super();
	}

	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;
	}

	public Teacher getTeacher() {
		return teacher;
	}

	public void setTeacher(Teacher teacher) {
		this.teacher = teacher;
	}

	public List<Student> getList() {
		return students;
	}

	public void setList(List<Student> students) {
		this.students = students;
	}

	@Override
	public String toString() {
		return "Classes [id=" + id + ", name=" + name + ", teacher=" + teacher
				+ ", students=" + students + "]";
	}

}
package com.atguigu.day03_mybaits.bean;
/**
 * 多条件查询封装类
 */
public class ConditionUser {

	private String name;
	private int minAge;
	private int maxAge;

	public ConditionUser(String name, int minAge, int maxAge) {
		super();
		this.name = name;
		this.minAge = minAge;
		this.maxAge = maxAge;
	}

	public ConditionUser() {
		super();
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getMinAge() {
		return minAge;
	}

	public void setMinAge(int minAge) {
		this.minAge = minAge;
	}

	public int getMaxAge() {
		return maxAge;
	}

	public void setMaxAge(int maxAge) {
		this.maxAge = maxAge;
	}

	@Override
	public String toString() {
		return "ConditionUser [name=" + name + ", minAge=" + minAge
				+ ", maxAge=" + maxAge + "]";
	}

}
package com.atguigu.day03_mybaits.bean;

import java.io.Serializable;

public class CUser implements Serializable {

	private int id;
	private String name;
	private int age;

	public CUser(int id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public CUser() {
		super();
	}

	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;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
}
package com.atguigu.day03_mybaits.bean;

public class Order {

	private int id;
	private String orderNo;
	private float price;

	public Order(int id, String orderNo, float price) {
		super();
		this.id = id;
		this.orderNo = orderNo;
		this.price = price;
	}

	public Order() {
		super();
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getOrderNo() {
		return orderNo;
	}

	public void setOrderNo(String orderNo) {
		this.orderNo = orderNo;
	}

	public float getPrice() {
		return price;
	}

	public void setPrice(float price) {
		this.price = price;
	}

	@Override
	public String toString() {
		return "Order [id=" + id + ", orderNo=" + orderNo + ", price=" + price
				+ "]";
	}

}
package com.atguigu.day03_mybaits.bean;

public class PUser {

	private String id;
	private String name;
	private String sex;

	public PUser(String id, String name, String sex) {
		super();
		this.id = id;
		this.name = name;
		this.sex = sex;
	}

	public PUser() {
		super();
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	@Override
	public String toString() {
		return "PUser [id=" + id + ", name=" + name + ", sex=" + sex + "]";
	}

}
package com.atguigu.day03_mybaits.bean;

public class Student {

	private int id;
	private String name;

	public Student(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	public Student() {
		super();
	}

	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;
	}

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + "]";
	}

}
package com.atguigu.day03_mybaits.bean;

public class Teacher {

	private int id;
	private String name;

	public Teacher(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	public Teacher() {
		super();
	}

	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;
	}

	@Override
	public String toString() {
		return "Teacher [id=" + id + ", name=" + name + "]";
	}

}
package com.atguigu.day03_mybaits.bean;

import java.io.Serializable;

public class User {
//shift+alt+s
	private int id;
	private String name;
	private int age;
	
	public User(int id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}
	public User() {
		super();
	}
	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;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
	}

	
}

 

3、test1(xml方式)

package com.atguigu.day03_mybaits.test1;

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

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.atguigu.day03_mybaits.bean.User;

/**
 * xml方式测试用例
 */
public class Test {

	public static void main(String[] args) throws IOException {
		String resource = "conf.xml"; 
		InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
		SqlSession session = factory.openSession();
		String statement = "com.atguigu.day03_mybaits.test1.userMapper.addUser";
		session.insert(statement, new User(-1, "刘志华", 27));
		session.commit();
	}
	@org.junit.Test
	public void deleteUser(){
		String resource = "conf.xml"; 
		InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
		SqlSession session = factory.openSession();
		String statement = "com.atguigu.day03_mybaits.test1.userMapper.deleteUser";
		System.out.println(session.delete(statement, 6));;
		session.commit();
	}
	@org.junit.Test
	public void getAllUser(){
		String resource = "conf.xml"; 
		InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
		SqlSession session = factory.openSession();
		String statement = "com.atguigu.day03_mybaits.test1.userMapper.getAllUsers";
		List<User> l =session.selectList(statement);
		System.out.println(l);
	}
}
<?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 是随意的 ,只是多个namespace 不能重复而已-->
<mapper namespace="com.atguigu.day03_mybaits.test1.userMapper">
	<!-- 
		CRUD操作
	 -->
	 <insert id="addUser" parameterType="com.atguigu.day03_mybaits.bean.User">
	 	insert into users(name, age) values(#{name}, #{age})
	 </insert>
	  <!-- #{id} id随意写,因为只有一个参数传入 -->
	 <delete id="deleteUser" parameterType="int">
	 	delete from users where id=#{id}
	 </delete>
	 <!-- #{name} 必须写的是User的属因名称 -->
	 <update id="updateUser" parameterType="com.atguigu.day03_mybaits.bean.User">
	 	update users set name=#{name},age=#{age} where id=#{id}
	 </update>
	 
	 <select id="getUser" parameterType="int" resultType="com.atguigu.day03_mybaits.bean.User">
	 	select * from users where id=#{id}
	 </select>
	 <!-- 
	 List<User> l =session.selectList(statement)方法中就是要查找一个list,此处只要写好了是User类型的List即可  
	 -->
	 <select id="getAllUsers" resultType="com.atguigu.day03_mybaits.bean.User">
	 	select * from users
	 </select>
</mapper>

 

4、test2(注解方式)

package com.atguigu.day03_mybaits.test2;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.atguigu.day03_mybaits.bean.User;
/**
 * 注解方式(接口)测试用例
 */
public class Test {
@org.junit.Test	
public void getAllUser(){
	String resource = "conf.xml"; 
	InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);
	SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
	SqlSession session = factory.openSession();
	//下面 就是xml文件和注解方式的差别
	UserMapper mapper = session.getMapper(UserMapper.class);
	List<User> l = mapper.getAllUser();
	System.out.println(l);
	
}
}
package com.atguigu.day03_mybaits.test2;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import com.atguigu.day03_mybaits.bean.User;
/**
 *注解方式:
 *1.在接口中输入sql语句 
 *2.参数一定要写入表明
 *3.返回值的类型一定要确定
 *4.在conf.xml中一定要配置<mapper class="com.atguigu.day03_mybaits.test2.UserMapper"/>
 */
public interface UserMapper {
	@Select("select * from Users where id = #{id}")
	public User getUser(int id);

	@Insert("insert into users(name, age) values(#{name}, #{age})")
	public int addUser(User user);

	@Update("update users set name=#{name},age=#{age} where id=#{id}")
	public int updateUser(User user);

	@Delete("delete from users where id=#{id}")
	public int deleteUser(int id);

	@Select("select * from users")
	public List<User> getAllUser();
}

 

5、test3(字段名称不对应的配置)

package com.atguigu.day03_mybaits.test3;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.atguigu.day03_mybaits.bean.Order;
import com.atguigu.day03_mybaits.bean.User;
/**
 * 字段名称不对应的测试 
 */
public class Test {
@org.junit.Test	
public void getAllUser(){
	String resource = "conf.xml"; 
	InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);
	SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
	SqlSession session = factory.openSession();
	Order o =session.selectOne("com.atguigu.day03_mybaits.test3.orderMapper.getOrder", 1);
	System.out.println(o);
}
@org.junit.Test	
public void getAllUser2(){
	String resource = "conf.xml"; 
	InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);
	SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
	SqlSession session = factory.openSession();
	Order o =session.selectOne("com.atguigu.day03_mybaits.test3.orderMapper.getOrder2", 2);
	System.out.println(o);
}
}
<?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.atguigu.day03_mybaits.test3.orderMapper">
	 <!-- javaBean和数据库字段不对应,使用sql重启别名 -->
	 <select id="getOrder" parameterType="int" resultType="Order">
	 	select order_id id,order_no orderNo,order_price price from orders where order_id=#{id}
	 </select>
	 <!-- 第二种方法,使用 resultMap 用来封装一系列映射   -->
	 <select id="getOrder2" resultType="Order" resultMap="getOrder2Map">
	 	select * from orders where order_id=#{id}
	 </select>
	 <resultMap type="Order" id="getOrder2Map">
	 <id property="id" column="order_id"/>
	 <result property="orderNo" column="order_no"/>
	 <result property="price" column="order_price"/>
	 </resultMap>
</mapper>

 

6、test4(一对一关系映射)

package com.atguigu.day03_mybaits.test4;

import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.atguigu.day03_mybaits.bean.Classes;
import com.atguigu.day03_mybaits.bean.Order;
/**
 * 一对一关系映射
 */
public class Test {
@org.junit.Test	
public void getAllClasses(){
	String resource = "conf.xml"; 
	InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);
	SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
	SqlSession session = factory.openSession();
	Classes c =session.selectOne("com.atguigu.day03_mybaits.test4.classMapper.getClass", 1);
	System.out.println(c);
}
@org.junit.Test	
public void getAllClasses2(){
	String resource = "conf.xml"; 
	InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);
	SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
	SqlSession session = factory.openSession();
	Classes c =session.selectOne("com.atguigu.day03_mybaits.test4.classMapper.getClass2", 1);
	System.out.println(c);
}
}
<?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.atguigu.day03_mybaits.test4.classMapper">
	<!--
		方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集 封装联表查询的数据(去除重复的数据) select * from class
		c, teacher t where c.teacher_id=t.t_id and c.c_id=1
	-->
	<select id="getClass" parameterType="int" resultMap="ClassResultMap">
		select *
		from class c, teacher t where c.teacher_id=t.t_id and c.c_id=#{id}
	</select>
	<resultMap type="_Classes" id="ClassResultMap">
		<id property="id" column="c_id" />
		<result property="name" column="c_name" />
		<!-- association 实现关联了一 ‘个’ 对象 -->
		<association property="teacher" javaType="_Teacher">
			<id property="id" column="t_id" />
			<result property="name" column="t_name" />
		</association>
	</resultMap>

	<!--
		方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型 SELECT * FROM class WHERE c_id=1;
		SELECT * FROM teacher WHERE t_id=1 //1 是上一个查询得到的teacher_id的值
	-->

	<select id="getClass2" parameterType="int" resultMap="ClassResultMap2">
		select * from class where c_id=#{id}
 </select>
	<resultMap type="_Classes" id="ClassResultMap2">
		<id property="id" column="c_id" />
		<result property="name" column="c_name" />
		<association property="teacher" column="teacher_id"
			select="getTeacher">
		</association>
	</resultMap>

	<select id="getTeacher" parameterType="int" resultType="_Teacher">
		SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
 </select>


</mapper>

 

7、test5(一对多关系映射)

package com.atguigu.day03_mybaits.test5;

import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.atguigu.day03_mybaits.bean.Classes;
import com.atguigu.day03_mybaits.bean.Order;
/**
 * 一对多关系映射
 */
public class Test {
@org.junit.Test	
public void getAllClasses(){
	String resource = "conf.xml"; 
	InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);
	SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
	SqlSession session = factory.openSession();
	Classes c =session.selectOne("com.atguigu.day03_mybaits.test5.classMapper.getClass3", 1);
	System.out.println(c);
}
@org.junit.Test	
public void getAllClasses2(){
	String resource = "conf.xml"; 
	InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);
	SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
	SqlSession session = factory.openSession();
	Classes c =session.selectOne("com.atguigu.day03_mybaits.test5.classMapper.getClass4", 1);
	System.out.println(c);
}
}
<?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.atguigu.day03_mybaits.test5.classMapper">
<!-- 
方式一: 嵌套结果: 使用嵌套结果映射来处理重复的联合结果的子集
SELECT * FROM class c, teacher t,student s WHERE c.teacher_id=t.t_id AND c.C_id=s.class_id AND  c.c_id=1
 -->
<select id="getClass3" parameterType="int" resultMap="ClassResultMap3">
	select * from class c, teacher t,student s where c.teacher_id=t.t_id and c.C_id=s.class_id and  c.c_id=#{id}
</select>
<resultMap type="_Classes" id="ClassResultMap3">
	<id property="id" column="c_id"/>
	<result property="name" column="c_name"/>
	<association property="teacher" column="teacher_id" javaType="_Teacher">
		<id property="id" column="t_id"/>
		<result property="name" column="t_name"/>
	</association>

	<!-- ofType指定students集合中的对象类型 -->
	<collection property="students" ofType="_Student">
		<id property="id" column="s_id"/>
		<result property="name" column="s_name"/>
	</collection>
</resultMap>

<!-- 
	方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型
		SELECT * FROM class WHERE c_id=1;
		SELECT * FROM teacher WHERE t_id=1   //1 是上一个查询得到的teacher_id的值
		SELECT * FROM student WHERE class_id=1  //1是第一个查询得到的c_id字段的值
 -->
 <select id="getClass4" parameterType="int" resultMap="ClassResultMap4">
	select * from class where c_id=#{id}
 </select>
 <resultMap type="_Classes" id="ClassResultMap4">
	<id property="id" column="c_id"/>
	<result property="name" column="c_name"/>
	<association property="teacher" column="teacher_id" javaType="_Teacher" >
	<id property="id" column="t_id"/>
		<result property="name" column="t_name"/>
	</association>
	<collection property="students" ofType="_Student" column="c_id" select="getStudent"></collection>
 </resultMap>
 
 <select id="getTeacher2" parameterType="int" resultType="_Teacher">
	SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
 </select>
 <select id="getStudent" parameterType="int" resultType="_Student">
	SELECT s_id id, s_name name FROM student WHERE class_id=#{id}
 </select>
 </mapper>

8、test6(动态sql和模糊查询--多条件查询)

package com.atguigu.day03_mybaits.test6;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
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.atguigu.day03_mybaits.bean.Classes;
import com.atguigu.day03_mybaits.bean.ConditionUser;
import com.atguigu.day03_mybaits.bean.Order;
import com.atguigu.day03_mybaits.bean.User;
/**
 * 动态sql和模糊查询--多条件查询
 */
public class Test {
@org.junit.Test	
public void getUser() throws IOException{
	Reader reader = Resources.getResourceAsReader("conf.xml");
	SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
	SqlSession sqlSession = sessionFactory.openSession();
	String statement = "com.atguigu.day03_mybaits.test6.userMapper.getUser";
	List<User> list = sqlSession.selectList(statement, new ConditionUser("%null%", 1, 12));
	System.out.println(list);
}
}
<?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.atguigu.day03_mybaits.test6.userMapper">
<select id="getUser" parameterType="com.atguigu.day03_mybaits.bean.ConditionUser" resultType="com.atguigu.day03_mybaits.bean.User">
			<!-- ‘<’ 这个符号不能写 使用<代替 -->
			select * from d_user where age>=#{minAge} and age<=#{maxAge}
			<!-- 此处注意单引号和双引号的位置 如果传入的name是null的情况,要使用此方法判断,防止数据查询问题 -->
		<if test='name!="%null%"'>and name like #{name}</if>
	</select>
 </mapper>

9、test7(缓存机制)

package com.atguigu.day03_mybaits.test7;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
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.atguigu.day03_mybaits.bean.Classes;
import com.atguigu.day03_mybaits.bean.ConditionUser;
import com.atguigu.day03_mybaits.bean.Order;
import com.atguigu.day03_mybaits.bean.User;
import com.atguigu.day03_mybaits.util.MybatisUtils;
/**
 * 一级缓存 session级别的缓存
 */
public class Test {
	@org.junit.Test
	public void testCache1() throws IOException {
		Reader reader = Resources.getResourceAsReader("conf.xml");
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
		SqlSession session = sessionFactory.openSession();
		String statement = "com.atguigu.mybatis.test7.userMapper.getUser";
		User user = session.selectOne(statement, 1);
		System.out.println(user);
		/*
		 * 一级缓存默认就会被使用,sql只调用了一次
		 */
		user = session.selectOne(statement, 1);
		System.out.println(user);
		/*
		 1. 必须是同一个Session,如果session对象已经close()过了就不可能用了 
		 */
		/*
		session = MybatisUtils.getSession();
		user = session.selectOne(statement, 1);
		System.out.println(user);
		*/
		
		/*
		 2. 查询条件是一样的
		 */
		/*
		user = session.selectOne(statement, 2);
		System.out.println(user);
		*/
		
		/*
		 3. 没有执行过session.clearCache()清理缓存
		 */
		/*
		session.clearCache(); 
		user = session.selectOne(statement, 2);
		System.out.println(user);
		*/
		
		/*
		 4. 没有执行过增删改的操作(这些操作都会清理缓存)
		 */
		/*
		session.update("com.atguigu.mybatis.test8.userMapper.updateUser",
				new User(2, "user", 23));
		user = session.selectOne(statement, 2);
		System.out.println(user);
		*/
	}
}
package com.atguigu.day03_mybaits.test7;

import java.io.IOException;
import java.io.Reader;
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.atguigu.day03_mybaits.bean.User;
import com.atguigu.day03_mybaits.util.MybatisUtils;
/**
 * Mybatis二级缓存
 * 1.添加一个<cache>在userMapper.xml中
 * <cache 
          eviction="FIFO"  //回收策略为先进先出
          flushInterval="60000" //自动刷新时间60s
          size="512" //最多缓存512个引用对象
          readOnly="true"/> //只读
          
 * 2.基于SqlSessionFactory的二级缓存,open不同的session
 */
public class Test2 {
	@Test
	public void testCache2() throws IOException {
		String statement = "com.atguigu.mybatis.test7.userMapper.getUser";
		/**
		 * 没有加入<cache>sql发送了两次
		 * 注意此处要session.commit();二级缓存才能体现出来.
		 * User 最好序列化
		 */
		SqlSessionFactory sessionFactory = MybatisUtils.getFactory();
		SqlSession session = sessionFactory.openSession();
		SqlSession session2 = sessionFactory.openSession();
		
		User user = session.selectOne(statement, 1);
		session.commit();
		System.out.println("user="+user);
		user = session2.selectOne(statement, 1);
		System.out.println("user2="+user);
	}
}
<?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.atguigu.mybatis.test7.userMapper">
<cache 
          eviction="FIFO" 
          flushInterval="60000" 
          size="512" 
          readOnly="true"/> 
	<select id="getUser" parameterType="int" resultType="_User">
		select * from users where id=#{id}
	</select>

	<update id="updateUser" parameterType="_User">
		update users set
		name=#{name}, age=#{age} where id=#{id}
	</update>
</mapper>

10、util包(工具包)

package com.atguigu.day03_mybaits.util;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.atguigu.day03_mybaits.test1.Test;

public class MybatisUtils {

	public static SqlSessionFactory getFactory() {
		String resource = "conf.xml";
		InputStream is = Test.class.getClassLoader().getResourceAsStream(
				resource);
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
		return factory;
	}
}

 

11、conf.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 resource="db.properties">
	<!-- 
	<property name="username" value="12345"/>
	如果配置了这个,将会把properties的内容替换掉
	 -->
	</properties>
	
	<!-- 配置实体类的别名 -->
	<typeAliases>
	<!-- 下面两者前者是别名,后者是让在xml中省去了包名的写,可直接写入简单类名就行了 -->
		<typeAlias type="com.atguigu.day03_mybaits.bean.User" alias="_User"/> 
		<typeAlias type="com.atguigu.day03_mybaits.bean.Classes" alias="_Classes"/> 
		<typeAlias type="com.atguigu.day03_mybaits.bean.Teacher" alias="_Teacher"/> 
		<typeAlias type="com.atguigu.day03_mybaits.bean.Student" alias="_Student"/> 
		<package name="com.atguigu.day03_mybaits.bean"/>
	</typeAliases>
<!-- 
	development : 开发模式
	work : 工作模式
 -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${driver}" />
				<property name="url" value="${url}" />
				<property name="username" value="${name}" />
				<property name="password" value="${password}" />
			</dataSource>
		</environment>
	</environments>
	
	<mappers>
		<mapper resource="com/atguigu/day03_mybaits/test1/userMapper.xml"/>
		<mapper class="com.atguigu.day03_mybaits.test2.UserMapper"/>
		<mapper resource="com/atguigu/day03_mybaits/test3/orderMapper.xml"/>
		<mapper resource="com/atguigu/day03_mybaits/test4/ClassMapper.xml"/>
		<mapper resource="com/atguigu/day03_mybaits/test5/ClassMapper.xml"/>
		<mapper resource="com/atguigu/day03_mybaits/test6/userMapper.xml"/>
		<mapper resource="com/atguigu/day03_mybaits/test7/userMapper.xml"/>
		
	</mappers>
</configuration>

 

12、db.properties配置信息

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybaits
name=lzh
password=123456

13、log4j.xml配置信息

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
	<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n" />
		</layout>
	</appender>
	<logger name="java.sql">
		<level value="debug" />
	</logger>
	<logger name="org.apache.ibatis">
		<level value="debug" />
	</logger>
	<root>
		<level value="debug" />
		<appender-ref ref="STDOUT" />
	</root>
</log4j:configuration>

 

14、lib包以及学习word文档下载

MyBaits环境搭建jar以及教学word下载地址

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值