一曙旭、搭建MySQL環(huán)境
創(chuàng)建maven項(xiàng)目
導(dǎo)入maven依賴
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
- 配置xml和properties文件的掃描方式
<build>
<resources>
<!--配置資源掃描-resources包下面的xml文件和properties文件都可以被掃描到-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<!--配置資源掃描-java包下面的xml文件和properties文件都可以被掃描到-->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
- 完整pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yaco</groupId>
<artifactId>mybatis</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>mybatis01</module>
<module>mybatis02</module>
<module>mybatis03</module>
</modules>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<resources>
<!--配置資源掃描-resources包下面的xml文件和properties文件都可以被掃描到-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<!--配置資源掃描-java包下面的xml文件和properties文件都可以被掃描到-->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
二恃逻、實(shí)現(xiàn)簡單的增刪改查
1均践、創(chuàng)建數(shù)據(jù)庫
創(chuàng)建一個簡單的用戶表,表中含有三個屬性坛吁,用戶id劳殖,用戶名和用戶密碼
CREATE DATABASE mybatis;
USE mybatis;
# 創(chuàng)建表
CREATE TABLE `user`(
`id` INT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(30) DEFAULT NULL,
`pwd` VARCHAR(30) DEFAULT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;
# 插入數(shù)據(jù)
INSERT INTO `user`(`id`,`name`,`pwd`) VALUES
(1,'張三','123456'),
(2,'李四','123456'),
(3,'狂神','123456')
2、創(chuàng)建mybatis-config.xml
配置文件
主要配置數(shù)據(jù)連接的相關(guān)信息拨脉,包括驅(qū)動器哆姻、url、連接數(shù)據(jù)庫的用戶名和密碼玫膀、是否啟動數(shù)據(jù)庫連接池等信息
使用mapper配置userMapper.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>
<!--配置別名-->
<typeAliases>
<typeAlias alias="User" type="com.yaco.pojo.User"></typeAlias>
</typeAliases>
<!--配置環(huán)境-->
<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://localhost:3306/mybatis? useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/yaco/dao/UserMapper.xml"/>
</mappers>
</configuration>
3矛缨、創(chuàng)建對應(yīng)的數(shù)據(jù)庫中的實(shí)體類
實(shí)體類對應(yīng)數(shù)據(jù)庫中User表中的字符名,此處與表中字段名完全一致帖旨,也可以不一致
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
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 String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
創(chuàng)建UserMapper的持久層接口
public interface UserMapper {
// 查
List<User> getUserList();
// 增
int addUser(User user);
// 刪
void deleteById(int id);
// 該
int update(User user);
// 查找一個
User findById(int id);
// 根據(jù)用戶名和密碼查詢箕昭,使用map
User findByNameAnsPwd(Map<String, Object> map);
// 模糊查詢
List<User> findUserLike(String value);
}
4、創(chuàng)建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="com.yaco.dao.UserMapper">
<update id="update" parameterType="User">
update user set name=#{name}, pwd=#{pwd} where id = #{id}
</update>
<delete id="deleteById">
delete from user where id = #{id}
</delete>
<select id="getUserList" resultType="User">
select * from user
</select>
<select id="findById" resultType="User" parameterType="int">
select * from user where id = #{id}
</select>
<select id="findByNameAnsPwd" resultType="User" parameterType="map">
select * from user where name=#{name} and pwd=#{pwd}
</select>
<select id="findUserLike" resultType="User">
select * from user where name like #{value}
</select>
<insert id="addUser" parameterType="User">
insert into user (id, name, pwd) values (#{id},#{name},#{pwd})
</insert>
</mapper>
5解阅、創(chuàng)建一個MybatisUtil工具類
MybatisUtil工具類用于獲取執(zhí)行映射文件中的sql語句的SqlSession
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
// 獲取SqlSessionFactory對象
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
6落竹、測試類
在test文件下做測試,保證包名與所測試的類包結(jié)構(gòu)一致
public class UserDaoTest {
@Test
public void testList() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper userDao = sqlSession.getMapper(UserMapper.class);
List<User> userList = userDao.getUserList();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
@Test
public void testFindOne() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper userDao = sqlSession.getMapper(UserMapper.class);
User user = userDao.findById(1);
System.out.println(user);
sqlSession.close();
}
@Test
public void testInsert() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper userDao = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setId(5);
user.setName("hj");
user.setPwd("123456");
int res = userDao.addUser(user);
if(res > 0) {
System.out.println("插入成工");
}
System.out.println(user);
// 插入要提交事務(wù)
sqlSession.commit();
sqlSession.close();
}
@Test
public void testUpdate() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper userDao = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setId(5);
user.setName("yaco");
user.setPwd("123456");
int res = userDao.update(user);
if(res > 0) {
System.out.println("更新成功");
}
System.out.println(user);
// 插入要提交事務(wù)
sqlSession.commit();
sqlSession.close();
}
@Test
public void testDelete() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper userDao = sqlSession.getMapper(UserMapper.class);
userDao.deleteById(5);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testMap() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper userDao = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "張三");
map.put("pwd","123456");
User user = userDao.findByNameAnsPwd(map);
System.out.println(user);
sqlSession.close();
}
@Test
public void testLike() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper userDao = sqlSession.getMapper(UserMapper.class);
List<User> users = userDao.findUserLike("%李%");
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
}
三瓮钥、使用Mybatis實(shí)現(xiàn)多對一查詢
1筋量、搭建數(shù)據(jù)表結(jié)構(gòu)
創(chuàng)建兩張表烹吵,分別式學(xué)生表和老師表,一個學(xué)生對應(yīng)一個老師桨武,一個老師可以對應(yīng)多名學(xué)生肋拔。
CREATE TABLE student(
id INT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(30) DEFAULT NULL
tid INT(20) DEFAULT NULL,
CONSTRAINT FOREIGN KEY(tid) REFERENCES teacher(id)
)ENGINE = INNODB DEFAULT CHARSET utf8
CREATE TABLE teacher(
id INT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(20),
)ENGINE = INNODB DEFAULT CHARSET utf8
添加一些數(shù)據(jù)
2、搭建實(shí)體類及映射環(huán)境
- 實(shí)體類
public class Student {
private int id;
private String name;
private Teacher teacher;
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;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", teacher=" + teacher +
'}';
}
}
public class Teacher {
private int id;
private String name;
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 + '\'' +
'}';
}
}
- StudentMapper持久層接口呀酸,查詢學(xué)生凉蜂,實(shí)現(xiàn)多對一的功能
public interface StudentMapper {
List<Student> selectStudentList();
List<Student> selectStudentList2();
Teacher selectTeacherById(int id);
}
3、使用嵌套查詢完成多對一查詢
<!--多對一的第一種方式: 使用嵌套查詢-->
<resultMap id="studentTeacher" type="Student">
<result property="id" column="sid" />
<result property="name" column="sname"/>
<association property="teacher" javaType="Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
</association>
</resultMap>
<select id="selectStudentList" resultMap="studentTeacher">
select s.id as sid, s.name as sname, t.id as tid, t.name as tname from student s, teacher t where s.tid = t.id
</select>
4性誉、使用子查詢完成多對一查詢
<!--多對一的第二種方式窿吩,使用子查詢-->
<resultMap id="studentTeacher2" type="Student">
<result property="id" column="id" />
<result property="name" column="name"/>
<association property="teacher" javaType="Teacher" select="selectTeacherById" column="tid"></association>
</resultMap>
<select id="selectStudentList2" resultMap="studentTeacher2">
select * from student
</select>
<select id="selectTeacherById" resultType="Teacher">
select * from teacher where id = #{id};
</select>
5、測試
public class MybatisTest {
@Test
public void test() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students = mapper.selectStudentList();
for (Student student : students) {
System.out.println(student);
}
sqlSession.close();
}
@Test
public void test2() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students = mapper.selectStudentList2();
for (Student student : students) {
System.out.println(student);
}
sqlSession.close();
}
}
測試輸出
// 嵌套查詢結(jié)果
Student{id=1, name='小明', teacher=Teacher{id=1, name='數(shù)學(xué)老師'}}
Student{id=2, name='小紅', teacher=Teacher{id=2, name='語文老師'}}
Student{id=3, name='小蘭', teacher=Teacher{id=3, name='英語老師'}}
Student{id=4, name='小宋', teacher=Teacher{id=1, name='數(shù)學(xué)老師'}}
Student{id=5, name='小麗', teacher=Teacher{id=2, name='語文老師'}}
Student{id=6, name='小叮', teacher=Teacher{id=3, name='英語老師'}}
// 子查詢結(jié)果
Student{id=1, name='小明', teacher=Teacher{id=1, name='數(shù)學(xué)老師'}}
Student{id=2, name='小紅', teacher=Teacher{id=2, name='語文老師'}}
Student{id=3, name='小蘭', teacher=Teacher{id=3, name='英語老師'}}
Student{id=4, name='小宋', teacher=Teacher{id=1, name='數(shù)學(xué)老師'}}
Student{id=5, name='小麗', teacher=Teacher{id=2, name='語文老師'}}
Student{id=6, name='小叮', teacher=Teacher{id=3, name='英語老師'}}
四错览、使用Mybatis實(shí)現(xiàn)一對多查詢
1纫雁、搭建實(shí)體類及映射環(huán)境
在上面多對一的情況下,學(xué)生實(shí)體類中有一個對應(yīng)得老師實(shí)體引用倾哺,一對多得情況轧邪,老師實(shí)體類也要有一個學(xué)生得引用,因?yàn)槭且粚Χ嗟藐P(guān)系羞海,這里用List存放學(xué)生集合
public class Student {
private int id;
private String name;
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 + '\'' +
'}';
}
}
public class Teacher {
private int id;
private String name;
List<Student> students;
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> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
@Override
public String toString() {
return "Teacher{" +
"id=" + id +
", name='" + name + '\'' +
", students=" + students +
'}';
}
}
- 創(chuàng)建持久層TeacherMapper接口
public interface TeacherMapper {
List<Teacher> selectTeacherById(@Param("tid") int tid);
}
2忌愚、使用嵌套查詢完成一對多查詢
<?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.yaco.dao.TeacherMapper">
<select id="selectTeacherById" resultMap="teacherStudent">
select t.id tid,t.name tname,s.id sid,s.name sname
from student s,teacher t
where s.tid = t.id and t.id = #{tid};
</select>
<resultMap id="teacherStudent" type="Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<collection property="students" ofType="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
</collection>
</resultMap>
</mapper>
3、測試
public class MybatisTest {
@Test
public void test() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
List<Teacher> teachers = mapper.selectTeacherById(1);
for (Teacher teacher : teachers) {
System.out.println(teacher);
}
}
}
用例輸出
Teacher{id=1, name='數(shù)學(xué)老師', students=[Student{id=1, name='小明'}, Student{id=4, name='小宋'}]}