1.mybatis概述
mybatis是近几年非常流行的数据访问层框架,能够简单高效的实现对数据层的访问
2.mybatis结构:
3.所需jar包
4.约束文件
5.导入约束
6.编写配置文件(两个)
创建表,创建bean
create database mybatisdb;
use mybatisdb;
create table user(
id int primary key auto_increment,
name varchar(255),
age int
);
insert into user values(null,‘aaa’,19),(null,‘bbb’,29),(null,‘ccc’,9);
实现增删改查(crud)
手动映射结果集
mybatis自动将查询结果封装到bean中,前提条件是bean属性名和查询的结果的列名相同,就会依次对应的存储,
如果查询结果的列名和bean的属性名不同,则需要手动的映射结果集
代码实现:
package cn.tedu.domain;
public class User {
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 + "]";
}
}
package cn.tedu.domain;
public class User02 {
private int uid;
private String uname;
private int uage;
public User02(int uid, String uname, int uage) {
super();
this.uid = uid;
this.uname = uname;
this.uage = uage;
}
public User02() {
super();
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public int getUage() {
return uage;
}
public void setUage(int uage) {
this.uage = uage;
}
@Override
public String toString() {
return "User [uid=" + uid + ", uname=" + uname + ", uage=" + uage + "]";
}
}
package cn.tedu.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.Before;
import org.junit.Test;
import cn.tedu.domain.User02;
//mybatis测试
public class Test01 {
private SqlSession session=null;
@Before
public void mx() throws IOException{
InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
session=factory.openSession();
}
/**
* mybatis入门测试
* @throws IOException
*/
@Test
public void test01() throws IOException{
/*//生成SqlSessionFactory
InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession session=factory.openSession();*/
//调用sql
List<User02> list = session.selectList("cn.tedu.UserMapper.selc01");
//打印结果
System.out.println(list);
}
/**
* 带有参数数字
* @throws IOException
*/
@Test
public void test02() throws IOException{
/*//生成SqlSessionFactory
InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession session=factory.openSession();*/
//执行sql
Map<String,Integer> map=new HashMap<String, Integer>();
map.put("min", 9);
map.put("max", 20);
List<User02> list = session.selectList("cn.tedu.UserMapper.selc02",map);
System.out.println(list);
}
/**
* 带有参数数字
* @throws IOException
*/
@Test
public void test03() throws IOException{
//接收一个bean
//User user=new User(4,"aaa",19);
//执行sql
List<User02> list = session.selectList("cn.tedu.UserMapper.selc03",9);
System.out.println(list);
}
/**
* 带有参数非数字
* @throws IOException
*/
@Test
public void test04() throws IOException{
//接收一个bean
User02 user=new User02(1,"aaa",19);
//执行sql
List<User02> list = session.selectList("cn.tedu.UserMapper.selc04",user);
System.out.println(list);
}
/**
* 带有参数非数字
* @throws IOException
*/
@Test
public void test05() throws IOException{
//接收一个bean
//User user=new User(1,"aaa",19);
String a="aaa";
//执行sql
List<User02> list = session.selectList("cn.tedu.UserMapper.selc05",a);
System.out.println(list);
}
/**
* 带有参数非数字
* @throws IOException
*/
@Test
public void test06() throws IOException{
Map< String, String> map=new HashMap<String, String>();
map.put("name", "aaa");
//执行sql
List<User02> list = session.selectList("cn.tedu.UserMapper.selc05",map);
System.out.println(list);
}
/**
* 升序降序区分#{}和${}
* select * from user order by ${cname};
* map.put("cname","age");
* #{}会在sql语句中添加''====>select * from user order by 'age';
* ${}不会在sql语句中添加''====>select * from user order by age;
*
*/
@Test
public void test07() throws IOException{
Map< String, String> map=new HashMap<String, String>();
map.put("cname","age");
//执行sql
List<User02> list = session.selectList("cn.tedu.UserMapper.selc06",map);
System.out.println(list);
}
}
package cn.tedu.test;
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 cn.tedu.domain.User;
import cn.tedu.domain.User02;
public class Test02 {
/*
* 删除操作
*/
@Test
public void test01() throws IOException{
//创建sqlsessionfactory
InputStream in=Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
//创建sqlsession
SqlSession session = factory.openSession();
//创建bean
User user=new User(2,"aaa",66);
session.update("cn.tedu.UserMapper.update01",user);
//提交
session.commit();
}
@Test
public void test02() throws IOException{
//创建sqlsessionfactory
InputStream in=Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
//创建sqlsession
SqlSession session = factory.openSession();
//创建bean
User user=new User(2,"acc",66);
session.update("cn.tedu.UserMapper.update02",user);
//提交
session.commit();
}
@Test
public void test03() throws IOException{
InputStream in=Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
SqlSession session=factory.openSession();
User user=new User(1,"ff",8);
session.update("cn.tedu.UserMapper.update03", user);
session.commit();
}
/**
* 引入了set标签
* @throws IOException
*/
@Test
public void test04() throws IOException{
InputStream in=Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
SqlSession session=factory.openSession();
User user=new User(1,"fffaa",3);
session.update("cn.tedu.UserMapper.update04", user);
session.commit();
}
@Test
public void test05() throws IOException{
InputStream in=Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
SqlSession session=factory.openSession();
User user=session.selectOne("cn.tedu.UserMapper.select01",8);
System.out.println(user);
}
/**
* select where标签的使用
* @throws IOException
*/
@Test
public void test06() throws IOException{
InputStream in=Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
SqlSession session=factory.openSession();
User user=new User(8,null,9);
//List<User> list=session.selectList("cn.tedu.UserMapper.select02", user);
//System.out.println(list);
User user2=session.selectOne("cn.tedu.UserMapper.select02", user);
System.out.println(user2);
}
@Test
public void test07() throws IOException{
InputStream in=Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
SqlSession session=factory.openSession();
User user=new User(0,"dddd",9);
session.insert("cn.tedu.UserMapper.insert01", user);
session.commit();
}
/**
* insert trim的使用
*/
@Test
public void test08() throws IOException{
InputStream in=Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
SqlSession session=factory.openSession();
User user=new User(2,"bbb",9);
session.insert("cn.tedu.UserMapper.insert02", user);
session.commit();
}
/**
* delete的使用
* @throws IOException
*/
@Test
public void test09() throws IOException{
InputStream in=Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
SqlSession session=factory.openSession();
//User user=new User(0,null,9);
session.delete("cn.tedu.UserMapper.delete01", 3);
session.commit();
}
/**
* delete where 标签
* @throws IOException
*/
@Test
public void test10() throws IOException{
InputStream in=Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
SqlSession session=factory.openSession();
User user=new User(4,null,9);
session.delete("cn.tedu.UserMapper.delete02",user);
session.commit();
}
/**
* user与user02的属性名不同造成异常错误
* @throws IOException
*/
@Test
public void test11() throws IOException{
InputStream in=Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
SqlSession session=factory.openSession();
User user=new User(10,"bbb",9);
User02 user2=session.selectOne("cn.tedu.userMapper2.select01", user);
System.out.println(user2);
}
}
配置文件:
<?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="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatisdb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<!-- <environment id="oracle">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatisdb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment> -->
</environments>
<!-- 配置映射文件 -->
<mappers>
<mapper resource="userMapper.xml"/>
<mapper resource="userMapper2.xml"/>
</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="cn.tedu.UserMapper">
<select id="selc01" resultType="cn.tedu.domain.User">
select * from user;
</select>
<select id="selc02" resultType="cn.tedu.domain.User">
select * from user where age between #{min} and #{max};
</select>
<select id="selc03" resultType="cn.tedu.domain.User">
select * from user where age=#{age};
</select>
<select id="selc04" resultType="cn.tedu.domain.User">
select * from user where name=#{name} and age=#{age};
</select>
<select id="selc05" resultType="cn.tedu.domain.User">
select * from user where name=#{name};
</select>
<select id="selc06" resultType="cn.tedu.domain.User">
select * from user order by ${cname};
</select>
<update id="update01">
update user set age = #{age} where id = #{id};
</update>
<update id="update02">
update user set name = #{name} where id = #{id};
</update>
<update id="update03">
update user set name = #{name},age=#{age} where id = #{id};
</update>
<update id="update04">
update user
<set>
<if test="name!=null">name=#{name},</if>
<if test="age!=0">age=#{age},</if>
</set>
where id=#{id};
</update>
<select id="select01" resultType="cn.tedu.domain.User">
select * from user where id=#{id};
</select>
<select id="select02" resultType="cn.tedu.domain.User">
select * from user
<where>
<if test="id!=0">and id=#{id} </if>
<if test="age!=0">and age=#{age} </if>
<if test="name!=null">and name=#{name} </if>
</where>
</select>
<insert id="insert01">
insert into user (id,name,age) values(0,#{name},#{age});
</insert>
<insert id="insert02">
insert into user
<trim prefix="(" suffix=")" suffixOverrides=",">
id,
<if test="name!=null">name,</if>
<if test="age!=0">age,</if>
</trim>
values
<trim prefix="(" suffix=")" suffixOverrides=",">
null,
<if test="name!=null">#{name},</if>
<if test="age!=0">#{age},</if>
</trim>
</insert>
<delete id="delete01">
delete from user where id=#{id};
</delete>
<delete id="delete02">
delete from user
<where>
<if test="id!=0">and id=#{id}</if>
<if test="name!=null">and #{name}</if>
<if test="age!=0">and #{age}</if>
</where>
</delete>
</mapper>
<?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="cn.tedu.userMapper2">
<resultMap type="cn.tedu.domain.User02" id="rm01">
<!--主键列配置 -->
<id column="id" property="uid"/>
<!-- 其它属性配置 -->
<result column="name" property="uname"/>
<result column="age" property="uage"/>
</resultMap>
<select id="select01" resultMap="rm01">
select * from user where id=#{id};
</select>
</mapper>
mybatis中的多表查询
一对一:
创建表:
create table room(id int primary key,name varchar(255));
insert into room values(1,‘梅花屋’),(2,‘兰花屋’),(3,‘桃花屋’);
create table grade(id int primary key,name varchar(255),rid int);
insert into grade values(999,‘向日葵班’,2),(888,‘玫瑰花班’,3),(777,‘菊花班’,1);
一对一的表中,一个表包含了另一个表的对应对象,使用resultmap 中的association标签来声明映射关系
一对多:
创建表:
create table dept(id int primary key,name varchar(255));
insert into dept values(1,‘财务部’),(2,‘行政部’),(3,‘人事部’),(4,‘销售部’);
create table emp(id int primary key,name varchar(255),deptid int);
insert into emp values(999,‘孙悟空’,4),(888,‘萨达姆’,3),(777,‘哈利波特’,1),(666,‘特朗普’,2),(555,‘新三胖’,3);
多对多:
创建表:
create table stu(id int primary key,name varchar(255));
insert into stu values(1,‘小新’),(2,‘小宝’),(3,‘小南’),(4,‘小文’);
create table teacher(id int primary key,name varchar(255));
insert into teacher values(999,‘孙悟空’),(888,‘猪八戒’),(777,‘萨达姆’),(666,‘哈利波特’);
create table stu_teacher(sid int,tid int);
insert into stu_teacher values(1,999),(1,888),(2,999),(2,777),(3,666),(4,888),(4,666);
代码实现:
package cn.tedu.domain;
import java.util.List;
public class Dept {
private int id;
private String name;
private List<Emp> list;
public Dept(int id, String name, List<Emp> list) {
super();
this.id = id;
this.name = name;
this.list = list;
}
public Dept() {
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 List<Emp> getList() {
return list;
}
public void setList(List<Emp> list) {
this.list = list;
}
@Override
public String toString() {
return "Dept [id=" + id + ", name=" + name + "]";
}
}
package cn.tedu.domain;
public class Emp {
private int id;
private String name;
private Dept dept;
public Emp() {
super();
}
public Emp(int id, String name, Dept dept) {
super();
this.id = id;
this.name = name;
this.dept = dept;
}
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 Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
@Override
public String toString() {
return "Emp [id=" + id + ", name=" + name + ", dept=" + dept + "]";
}
}
package cn.tedu.domain;
public class Grade {
private int id;
private String name;
private Room room;
public Grade(int id, String name, Room room) {
super();
this.id = id;
this.name = name;
this.room = room;
}
public Grade() {
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 Room getRoom() {
return room;
}
public void setRoom(Room room) {
this.room = room;
}
@Override
public String toString() {
return "Grade [id=" + id + ", name=" + name + ", room=" + room + "]";
}
}
package cn.tedu.domain;
public class Room {
private int id;
private String name;
private Grade grade;
public Room() {
super();
}
public Room(int id, String name, Grade grade) {
super();
this.id = id;
this.name = name;
this.grade = grade;
}
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 Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
@Override
public String toString() {
return "Room [id=" + id + ", name=" + name + ", grade=" + grade + "]";
}
}
package cn.tedu.domain;
import java.util.List;
public class Student {
private int id;
private String name;
private List<Teacher> teacherList;
public Student() {
super();
}
public Student(int id, String name, List<Teacher> teacherList) {
super();
this.id = id;
this.name = name;
this.teacherList = teacherList;
}
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 List<Teacher> getTeacherList() {
return teacherList;
}
public void setTeacherList(List<Teacher> teacherList) {
this.teacherList = teacherList;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", teacherList="
+ teacherList + "]";
}
}
package cn.tedu.domain;
import java.util.List;
public class Teacher {
private int id;
private String name;
private List<Student> stuList;
public Teacher() {
super();
}
public Teacher(int id, String name, List<Student> stuList) {
super();
this.id = id;
this.name = name;
this.stuList = stuList;
}
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 List<Student> getStuList() {
return stuList;
}
public void setStuList(List<Student> stuList) {
this.stuList = stuList;
}
@Override
public String toString() {
return "Teacher [id=" + id + ", name=" + name + ", stuList=" + stuList
+ "]";
}
}
package cn.tedu.test;
//一对一的多表查询
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.Before;
import org.junit.Test;
import cn.tedu.domain.Dept;
import cn.tedu.domain.Emp;
import cn.tedu.domain.Grade;
import cn.tedu.domain.Room;
import cn.tedu.domain.Student;
import cn.tedu.domain.Teacher;
public class Test01 {
private SqlSession session=null;
@Before
public void mx() throws IOException{
InputStream in=Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
session=factory.openSession();
}
/**
* 一对一测试
* @throws IOException
*/
@Test
public void test01() throws IOException{
//以部门为角度
/*List<Grade> grade=session.selectList("cn.tedu.o2oMapper.o2o");
System.out.println(grade);*/
//以教室为角度
List<Room> room=session.selectList("cn.tedu.o2oMapper.o2o");
System.out.println(room);
}
/**
* 一对多测试
* @throws IOException
*/
@Test
public void test02() throws IOException{
//部门为角度
/*List<Dept> dept=session.selectList("cn.tedu.o2oMapper.o2m1");
System.out.println(dept);*/
//员工为角度
List<Emp> emp=session.selectList("cn.tedu.o2oMapper.o2m1");
System.out.println(emp);
}
/**
* 多对多测试
* @throws IOException
*/
@Test
public void test03() throws IOException{
//教师角度
/*List<Teacher> teacher=session.selectList("cn.tedu.o2oMapper.o2m2");
System.out.println(teacher);*/
//学生角度
List<Student> stu=session.selectList("cn.tedu.o2oMapper.o2m2");
System.out.println(stu);
}
}
配置文件:
<?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="cn.tedu.o2oMapper">
<!--一对一 -->
<!-- <resultMap type="cn.tedu.domain.Grade" id="rm01">
<id column="gid" property="id"/>
<result column="gname" property="name"/>
<association property="room" javaType="cn.tedu.domain.Room">
<id column="rid" property="id"/>
<result column="rname" property="name"/>
</association>
</resultMap> -->
<resultMap type="cn.tedu.domain.Room" id="rm01">
<id column="rid" property="id"/>
<result column="rname" property="name"/>
<association property="grade" javaType="cn.tedu.domain.Grade">
<id column="gid" property="id"/>
<result column="gname" property="name"/>
</association>
</resultMap>
<select id="o2o" resultMap="rm01">
select grade.id as gid,grade.name as gname,room.id as rid,room.name as rname from grade inner join room on grade.rid=room.id;
</select>
<!--一对多 -->
<!-- <resultMap type="cn.tedu.domain.Emp" id="rm02">
<id column="eid" property="id"/>
<result column="ename" property="name"/>
<association property="dept" javaType="cn.tedu.domain.Dept">
<id column="did" property="id"/>
<result column="dname" property="name"/>
</association>
</resultMap> -->
<resultMap type="cn.tedu.domain.Dept" id="rm02">
<id column="did" property="id"/>
<result column="dname" property="name"/>
<collection property="list" ofType="cn.tedu.domain.Emp">
<id column="eid" property="id"/>
<result column="ename" property="name"/>
</collection>
</resultMap>
<select id="o2m1" resultMap="rm02">
select dept.id as did,dept.name as dname,emp.id as eid,emp.name as ename from dept inner join emp on dept.id=emp.deptid;
</select>
<!--多对多 -->
<!-- <resultMap type="cn.tedu.domain.Teacher" id="rm03">
<id column="tid" property="id"/>
<result column="tname" property="name"/>
<collection property="stuList" ofType="cn.tedu.domain.Student">
<id column="sid" property="id"/>
<result column="sname" property="name"/>
</collection>
</resultMap> -->
<resultMap type="cn.tedu.domain.Student" id="rm03">
<id column="sid" property="id"/>
<result column="sname" property="name"/>
<collection property="teacherList" ofType="cn.tedu.domain.Teacher">
<id column="tid" property="id"/>
<result column="tname" property="name"/>
</collection>
</resultMap>
<select id="o2m2" resultMap="rm03">
select
stu.id as sid,
stu.name as sname,
teacher.id as tid,
teacher.name as tname
from
stu
inner join stu_teacher on stu.id=stu_teacher.sid
inner join teacher on teacher.id=stu_teacher.tid;
</select>
</mapper>
<?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="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatisdb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件 -->
<mappers>
<mapper resource="o2oMapper.xml"/>
</mappers>
</configuration>
mybatis中的其它细节
a.别名标签
b.sql复用
<?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>
<!-- 别名标签的配置 -->
<typeAliases>
<typeAlias type="cn.tedu.domain.User" alias="Alias_User"/>
</typeAliases>
<!-- 配置数据源 -->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatisdb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件 -->
<mappers>
<mapper resource="userMapper.xml"/>
</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="cn.tedu.UserMapper">
<!--sql的复用 -->
<sql id="sele">
select * from
</sql>
<!-- <select id="select01" resultType="cn.tedu.domain.User"> -->
<!--此处可以使用别名标签 -->
<select id="select01" resultType="Alias_User">
select * from user;
</select>
<select id="select02" resultType="Alias_User">
<!--sql的复用 -->
<include refid="sele"/> user;
</select>
</mapper>
mybatis中的缓存机制
缓存机制可以减轻数据库的压力,原理是在第一查询时,将查询结果缓存起来,之后再查询同样的sql,不是真的去查询数据库,而是直接返回缓存中的结果
缓存可以降低数据库的压力,但是同时可能无法得到最新的结果
数据库缓存的实现:
通过第三方工具实现缓存,
Redis内存数据库—可以实现缓存
通过mybatis提供的数据据库实现缓存:
一级缓存:(一个sqlsession)
缓存只在一个事务中有效,即同一个事务中先后执行多次同一个查询,只在第一次真正去查库,并将结果缓存,之后的查询都将直接获取缓存中的结果。
如果是不同的事务,则缓存是隔离的。
二级缓存:(两个sqlsession且一个查询完要commit)
缓存在全局有效,一个事务缓存一个sql的结果会被缓存起来,之后只要缓存未被清除,则其它事务如果查询同一个sql,得到的将会是之前缓存的结果,二级缓存作用范围大,作用时间长,可能造成的危害更大,所以在开发中很少使用mybatis二级缓存。
mybatis的一级缓存:
默认是开启状态,且无法手动关闭。
sqlMapConfig.xml中配置二级缓存总开关
映射文件中配置二级缓存开关
想要被二级缓存的bean必须实现序列化接口
代码实现:
package cn.tedu.domain;
import java.io.Serializable;
//实现接口应用二级缓存
public class User implements Serializable{
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 + "]";
}
}
package cn.tedu.test;
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 cn.tedu.domain.User;
public class Test01 {
@Test
public void test01() throws IOException{
InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
SqlSession session = factory.openSession();
//selectOne只支持一个user
List<User> user=session.selectList("cn.tedu.UserMapper.select01");
System.out.println(user);
}
//一级查询(通过debug可测试出使用同一个缓存的sql)
@Test
public void test02() throws IOException{
InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
SqlSession session = factory.openSession();
List<User> user=session.selectList("cn.tedu.UserMapper.select03",5);
System.out.println(user);
List<User> user2=session.selectList("cn.tedu.UserMapper.select03",5);
System.out.println(user2);
}
//二级查询()
@Test
public void test03() throws IOException{
InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
SqlSession session1 = factory.openSession();
List<User> user=session1.selectList("cn.tedu.UserMapper.select03",5);
session1.commit();
SqlSession session2 = factory.openSession();
List<User> user2=session2.selectList("cn.tedu.UserMapper.select03",5);
session2.commit();
System.out.println(user);
System.out.println(user2);
}
}
配置文件:
<?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>
<!--开启二级缓存总开关 -->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- 别名标签的配置 -->
<typeAliases>
<typeAlias type="cn.tedu.domain.User" alias="Alias_User"/>
</typeAliases>
<!-- 配置数据源 -->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatisdb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件 -->
<mappers>
<mapper resource="userMapper.xml"/>
</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="cn.tedu.UserMapper">
<!--在映射文件中应用二级缓存 -->
<!-- <cache/> -->
<!--sql的复用 -->
<sql id="sele">
select * from
</sql>
<!-- <select id="select01" resultType="cn.tedu.domain.User"> -->
<!--此处可以使用别名标签 -->
<select id="select01" resultType="Alias_User">
select * from user;
</select>
<select id="select02" resultType="Alias_User">
<!--sql的复用 -->
<include refid="sele"/> user;
</select>
<select id="select03" resultType="cn.tedu.domain.User">
select * from user where id=#{id};
</select>
</mapper>
接口的使用
为了简化mybatis的使用,mybatis提供了接口化方式,自动化生成调用的过程
开发映射文件:
开发接口:
映射文件中声明的名称空间应该为该映射文件对应的处理接口的全路径名称。
接口中应该声明和映射文件中sql对应id相同名称的方法
方法接收的参数应该和sql中接收的参数一致
方法的返回值应该和sql中的返回值一致
代码实现:
package cn.tedu.domain;
public class User {
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 + "]";
}
}
package cn.tedu.mapper;
import java.util.List;
import cn.tedu.domain.User;
public interface UserMapper {
public User selectOne(int id);
//相当于selectList方法的和返回值
public List<User> selectAll();
}
package cn.tedu.test;
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 cn.tedu.domain.User;
import cn.tedu.mapper.UserMapper;
public class Test01 {
//面向接口编程
@Test
public void test01() throws IOException{
InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
SqlSession session = factory.openSession();
//获取mapper
UserMapper userMapper=session.getMapper(UserMapper.class);
//调用方法
User user=userMapper.selectOne(5);
System.out.println(user);
}
@Test
public void test02() throws IOException{
InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
SqlSession session = factory.openSession();
//获取mapper
UserMapper userMapper=session.getMapper(UserMapper.class);
//调用方法
List<User> list=userMapper.selectAll();
System.out.println(list);
}
}
<?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="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatisdb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件 -->
<mappers>
<mapper resource="userMapper.xml"/>
</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="cn.tedu.mapper.UserMapper">
<select id="selectOne" resultType="cn.tedu.domain.User">
select * from user where id=#{id};
</select>
<select id="selectAll" resultType="cn.tedu.domain.User">
select * from user;
</select>
</mapper>
ssm整合
1.导入相关的开发包
不可有重复的包(不同版本否则报错)
2.创建包结构
配置springmvc
sqlmapconfig.xml
applicationContext.xml
usermapper.xml
web.xml
制作一个resource文件
步骤:
web.xml
1.配置spring相关的监听器(不用ClassPathXmlApplicationContext去创建)(引入了applicationContext.xml)
2.配置springmv前端控制器(引入springmvc.xml)
3.配置主页
applicationcontext.xml
1.配置包扫描
2.注解方式的di
3.配置注解方式的aop
4.配置声明式的事务管理,并用注解管理
5.整合mybatis
5.1配置数据源
5.2配置sqlsessionfactory
5.3mybatis mapperbean扫描器,负责为mapperbean生成实现类
springmvc.xml
1.处理器映射器
2.配置视图解析器
sqlmapconfig.xml
基本的配置(利用了sqlsessionfactorybean自动扫描,无需映射)
usermapper.xml
1.名称空间
2.sql语句(参数返回值与map接口中的方法要对应)
代码实现:
package cn.tedu.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import cn.tedu.domain.User;
import cn.tedu.service.UserService;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService=null;
@RequestMapping("/query.action")
public String queryUser(){
userService.queryUser();
return "index";
}
@RequestMapping("/addUser.action")
public void addUser(){
userService.addUser(new User(0,"ddd",9));
}
}
package cn.tedu.domain;
public class User {
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 + "]";
}
}
package cn.tedu.mapper;
import cn.tedu.domain.User;
//不需要了,开启了扫描
//@Repository
public interface UserMapper {
public User selectOne(int id);
public void addUser(User user);
}
package cn.tedu.service;
import cn.tedu.domain.User;
public interface UserService {
void queryUser();
void addUser(User user);
}
package cn.tedu.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.tedu.domain.User;
import cn.tedu.mapper.UserMapper;
@Service
public class UserServiceImp implements UserService {
@Autowired
private UserMapper userMapper=null;
@Override
public void queryUser() {
User user=userMapper.selectOne(3);
System.out.println("queryUser....."+user);
}
@Transactional(rollbackFor=java.lang.Throwable.class)
@Override
public void addUser(User user) {
userMapper.addUser(user);
//int i=1/0;
}
}
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>SSMDemo1</display-name>
<!--配置spring相关的监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/applicationContext.xml</param-value>
</context-param>
<!--配置springmvc前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<!--配置主页 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
" >
<!--配置包扫描 -->
<context:component-scan base-package="cn.tedu.controller"></context:component-scan>
<context:component-scan base-package="cn.tedu.service"></context:component-scan>
<!-- 注解方式的DI -->
<context:annotation-config/>
<!--配置注解方式的aop -->
<aop:aspectj-autoproxy/>
<!--配置声明式事务管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--用注解管理事务 -->
<tx:annotation-driven/>
<!--整合mybatis -->
<!--配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///ssmdb"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
<!--配置sqlsessionfactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:/SqlMapConfig.xml"></property>
<property name="mapperLocations" value="classpath:/mappers/*.xml"></property>
</bean>
<!--mybatis mapperbean扫描器 负责为mapperbean生成实现类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.tedu.mapper"></property>
</bean>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
" >
<!--配置处理器映射器 -->
<context:component-scan base-package="cn.tedu.controller"></context:component-scan>
<mvc:annotation-driven/>
<!--配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
<?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="cn.tedu.mapper.UserMapper">
<select id="selectOne" resultType="cn.tedu.domain.User">
select * from user where id=#{id};
</select>
<insert id="addUser">
<!-- insert into user values(null,#{name},#{age}); -->
insert into user
<trim prefix="(" suffix=")" suffixOverrides=",">
id,
<if test="name!=null">name,</if>
<if test="age!=0">age,</if>
</trim>
values
<trim prefix="(" suffix=")" suffixOverrides=",">
null,
<if test="name!=null">#{name},</if>
<if test="age!=0">#{age},</if>
</trim>
;
</insert>
</mapper>
<?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>
</configuration>
主页:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
This is my JSP page. <br>
</body>
</html>