1、模糊查询
1.1、UserMapper
//模糊查询
List<User> getUserLike(String value);
1.2、UserMapper.xml
<select id="getUserLike" resultType="com.jin.pojo.User">
select * from user.user where name like "%"#{value}"%"
</select>
2、配置之属性优化
2.1、dp.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/user?useSSL=false&useUnicode=true&characterEncoding=UTF-8
username=root
password=admin
2.2、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 resource="dp.properties"/>
<typeAliases>
<typeAlias type="com.jin.pojo.User" alias="User"/>
</typeAliases>
<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="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/jin/dao/UserMapper.xml"/>
</mappers>
</configuration>
3、实体类别名
<!--可以给实体类起别名-->
1. <typeAlias type="com.kuang.pojo.User" alias="User"/> 别名是User 实体类较少时使用
2. <typeAlias type="com.kuang.pojo"/> 别名是类名小写 实体类较多时使用
4、映射器(mapper)
4.1、使用resource绑定
<mappers>
<mapper resource="com/kuang/dao/UserMapper.xml"/>
</mappers>
4.2、使用class文件绑定
<mappers>
<mapper class="com.kuang.dao.UserMapper"/>
</mappers>
注意点:
接口和它的Mapper配置文件必须同名
接口和它的Mapper配置文件必须在同一个包下
4.3、使用扫描包进行注入绑定
<mappers>
<package name="com.kuang.dao"/>
</mappers>
注意点:
接口和它的Mapper配置文件必须同名
接口和它的Mapper配置文件必须在同一个包下
5、结果集映射
<!--解决属性名和数据库字段名不一样
1.起别名法:select id,name,pwd as password from user.user where id = #{id}
2.resultMap
-->
<select id="getUserById" resultMap="UserMap">
select * from user.user where id = #{id}
</select>
<!--结果集映射-->
<resultMap id="UserMap" type="User">
<!--属性名和数据库字段名一样可以不用写-->
<!-- <result column="id" property="id"/>-->
<!-- <result column="name" property="name"/>-->
<result column="pwd" property="password"/>
</resultMap>
6、日志工厂
6.1、标准日志工厂
<settings>-->
<!--标准的日志工厂实现-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
6.2、Log4j日志
6.2.1、log4j.jar
<dependencies>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
6.2.2、log4j.properties
log4j.rootLogger = DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/file.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yyyy-MM-dd}][%c]%m%n
#日志输出的设置
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
6.2.3、日志配置
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
6.2.4、简单使用
package com.kuang.dao;
import com.kuang.pojo.User;
import com.kuang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class UserMapperTest {
static Logger logger=Logger.getLogger(UserMapperTest.class);
@Test
public void getUserById(){
SqlSession sqlSession= MybatisUtils.getSqlSession();
UserMapper mapper=sqlSession.getMapper(UserMapper.class);
User user=mapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
@Test
public void testLog4j(){
logger.info("info:进入了testLog4j");
logger.debug("debug:进入了testLog4j");
logger.error("error:进入了testLog4j");
}
}
7、分页
7.1、Limit分页
<select id="getUserByLimit" parameterType="map" resultMap="UserMap">
select * from user.user limit #{startIndex}, #{pageSize}
</select>
@Test
public void getUserByLimit(){
SqlSession sqlSession=MybatisUtils.getSqlSession();
UserMapper mapper=sqlSession.getMapper(UserMapper.class);
HashMap<String ,Integer> map=new HashMap<String, Integer>();
map.put("startIndex",1);
map.put("pageSize",2);
List<User> userList=mapper.getUserByLimit(map);
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
7.2、RowRounds分页
8、使用注解进行增删改查
8.1、UserMapper
package com.jin.dao;
import com.kuang.pojo.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
import java.util.Map;
public interface UserMapper {
@Select("select * from user")
List<User> getUserList();
//存在多个基本类型或String类型的参数,所有的参数必须加@Param注解
// User getUserById(@Param("id") int id,@Param("name")String name);
@Select("select * from user where id=#{id}")
User getUserById(@Param("id") int id);
@Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})")
int addUser(User user);
@Delete("delete from user where id=#{id}")
int deleteUser(int id);
@Update("update user set name=#{name},pwd=#{pwd} where id=#{id}")
int updateUser(User user);
}
8.2、测试
package com.kuang.dao;
import com.kuang.pojo.User;
import com.kuang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserMapperTest {
@Test
public void getUserList(){
SqlSession sqlSession=MybatisUtils.getSqlSession();
UserMapper mapper=sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
@Test
public void getUserById(){
SqlSession sqlSession=MybatisUtils.getSqlSession();
UserMapper mapper=sqlSession.getMapper(UserMapper.class);
User user=mapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
@Test
public void addUser(){
SqlSession sqlSession=MybatisUtils.getSqlSession();
UserMapper mapper=sqlSession.getMapper(UserMapper.class);
mapper.addUser(new User(6,"哈哈","333"));
sqlSession.commit();
sqlSession.close();
}
@Test
public void deleteUser(){
SqlSession sqlSession=MybatisUtils.getSqlSession();
UserMapper mapper=sqlSession.getMapper(UserMapper.class);
mapper.deleteUser(6);
sqlSession.commit();
sqlSession.close();
}
@Test
public void updateUser(){
SqlSession sqlSession=MybatisUtils.getSqlSession();
UserMapper mapper=sqlSession.getMapper(UserMapper.class);
mapper.updateUser(new User(5,"哈哈","666"));
sqlSession.commit();
sqlSession.close();
}
}
9、lombok
9.1、配置文件
<dependencies>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
</dependencies>
9.2、使用注解
package com.kuang.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private String pwd;
}
10、复杂查询
10.1、多对一
10.1.1、实体类
package com.kuang.pojo;
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
//多对一
private Teacher teacher;
}
package com.kuang.pojo;
import lombok.Data;
@Data
public class Teacher {
private int id;
private String name;
}
10.1.2、StudentMapper.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.kuang.dao.StudentMapper">
<!--方法一:按照查询嵌套处理-->
<select id="getStudent" resultMap="StudentTeacher">
select * from student
</select>
<resultMap id="StudentTeacher" type="Student">
<!--复杂的属性 我们需要单独处理 对象:association 集合:collection-->
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="Teacher">
select * from Teacher where id=#{tid}
</select>
<!--===============================================================================-->
<!--按照结果嵌套处理-->
<select id="getStudent2" resultMap="StudentTeacher2">
select s.id sid,s.name sname,t.name tname
from student s,teacher t
where s.tid=t.id
</select>
<resultMap id="StudentTeacher2" type="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="Teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
</mapper>
10.1.3、Test
package com.kuang.dao;
import com.kuang.pojo.Student;
import com.kuang.pojo.Teacher;
import com.kuang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class MyTest {
@Test
public void getStudent(){
SqlSession sqlSession=MybatisUtils.getSqlSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> studentList=studentMapper.getStudent();
for (Student student : studentList) {
System.out.println(student);
}
sqlSession.close();
}
@Test
public void getStudent2(){
SqlSession sqlSession=MybatisUtils.getSqlSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> studentList=studentMapper.getStudent2();
for (Student student : studentList) {
System.out.println(student);
}
sqlSession.close();
}
}
10.2、一对多
10.2.1、实体类
package com.kuang.pojo;
import lombok.Data;
import java.util.List;
@Data
public class Teacher {
private int id;
private String name;
//一对多
private List<Student> students;
}
package com.kuang.pojo;
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
private int tid;
}
10.2.2、TeacherMapper.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.kuang.dao.TeacherMapper">
<!--按结果嵌套查询-->
<select id="getTeacher" resultMap="TeacherStudent">
select s.id sid,s.name sname,t.name tname,t.id tid
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"/>
<!--复杂的属性 我们需要单独处理 对象:association 集合:collection–
javaType="":指定属性的类型
集合中的泛型信息,使用ofType获取
-->
<collection property="students" ofType="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
</collection>
</resultMap>
<!--按照查询嵌套处理-->
<select id="getTeacher2" resultMap="TeacherStudent2">
select * from teacher where id=#{tid}
</select>
<!--javaType 用来指定实体类中属性的类型
ofType 用来指定映射到List或者集合中的pojo类型,泛型中的约束类型
-->
<resultMap id="TeacherStudent2" type="Teacher">
<collection property="students" javaType="ArrayList" ofType="student" select="getStudentByTeacherId" column="id"/>
</resultMap>
<select id="getStudentByTeacherId" resultType="Student">
select * from user.student where tid=#{tid}
</select>
</mapper>
10.2.3、Test
package com.kuang.dao;
import com.kuang.pojo.Student;
import com.kuang.pojo.Teacher;
import com.kuang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class MyTest {
@Test
public void getTeacher(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
TeacherMapper teacherMapper=sqlSession.getMapper(TeacherMapper.class);
Teacher teacher =teacherMapper.getTeacher(1);
System.out.println(teacher);
sqlSession.close();
}
@Test
public void getTeacher2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
TeacherMapper teacherMapper=sqlSession.getMapper(TeacherMapper.class);
Teacher teacher =teacherMapper.getTeacher2(1);
System.out.println(teacher);
sqlSession.close();
}
}
11、动态SQL
动态SQL:动态SQL就是指根据不同的条件生成不同的SQL语句
11.1、where语句和IF语句
<select id="selectBlogIf" parameterType="map" resultType="blog">
select * from user.blog
<where>
<if test="title !=null">
title = #{title}
</if>
<if test="author !=null">
and author = #{author}
</if>
</where>
</select>
//IF查询
@Test
public void selectBlogIf(){
SqlSession sqlSession= MybatisUtils.getSqlSession();
BlogMapper blogMapper=sqlSession.getMapper(BlogMapper.class);
Map map=new HashMap();
//map.put("title","Mybatis如此简单");
map.put("author","张三");
List<Blog> blogList=blogMapper.selectBlogIf(map);
for (Blog blog : blogList) {
System.out.println(blog);
}
sqlSession.close();
}
11.2、choose语句
<select id="selectBlogChoose" parameterType="map" resultType="blog">
select * from user.blog
<where>
<choose>
<when test="title !=null">
title = #{title}
</when>
<when test="author != null">
and author = #{author}
</when>
<otherwise>
and views = #{views}
</otherwise>
</choose>
</where>
</select>
//Choose查询
@Test
public void selectBlogChoose(){
SqlSession sqlSession= MybatisUtils.getSqlSession();
BlogMapper blogMapper=sqlSession.getMapper(BlogMapper.class);
Map map=new HashMap();
map.put("title","Mybatis如此简单");
map.put("author","张三");
map.put("views",9999);
List<Blog> blogList=blogMapper.selectBlogChoose(map);
for (Blog blog : blogList) {
System.out.println(blog);
}
sqlSession.close();
}
11.3、set语句
<update id="updateBlogSet" parameterType="map">
update user.blog
<set>
<if test="title !=null">
title = #{title},
</if>
<if test="author !=null">
author = #{author}
</if>
</set>
where id = #{id}
</update>
//更新博客Set
@Test
public void updateBlogSet(){
SqlSession sqlSession= MybatisUtils.getSqlSession();
BlogMapper blogMapper=sqlSession.getMapper(BlogMapper.class);
Map map=new HashMap();
map.put("title","Spring如此简单2");
//map.put("author","王五");
map.put("id","c341ae8b3a3441ec936cb8c60fac7afb");
//map.put("views",9999);
blogMapper.updateBlogSet(map);
sqlSession.close();
}
11.4、foreach语句
<select id="getBlogForeach" parameterType="map" resultType="blog">
select * from User.blog
<where>
<foreach collection="ids" item="id" open="and (" close=")" separator="or">
id = #{id}
</foreach>
</where>
</select>
//查询博客Foreach
@Test
public void getBlogForeach(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class);
Map map=new HashMap();
ArrayList<String> ids=new ArrayList<String>();
ids.add("279284c4172f4adf8540d55e89d8b388");
ids.add("29f05fad7bbc4c67b8547846080634a1");
ids.add("312ee6623f8d4c339e841d055348a501");
map.put("ids",ids);
List<Blog> blogList = blogMapper.getBlogForeach(map);
for (Blog blog : blogList) {
System.out.println(blog);
}
sqlSession.close();
}
12、缓存
12.1、一级缓存
/*缓存失效:
* 1.查询不同的东西
* 2.增删改操作,可能会改变原来的数据,所以必定会刷新缓存
* 3.查询不同的Mapper.xml
* 4.手动清理缓存sqlSession.clearCache();
* 小结:一级缓存默认是开启的,只在一次SqlSession中有效,也就是拿到来连接到关闭连接这个区间段
* */
@Test
public void getUserById(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user=userMapper.getUserById(1);
System.out.println(user);
// sqlSession.clearCache();//手动清理缓存
System.out.println("=================================");
User user2=userMapper.getUserById(1);
System.out.println(user2);
System.out.println(user==user2);
sqlSession.close();
}
12.2、二级缓存
<!--显示的开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
<!--在当前Mapper.xml中使用二级缓存-->
<cache/><!--需要把实体类User序列化(implements Serializable)或下面的配置-->
<!-- <cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>-->
/*缓存顺序
* 1.先看二级缓存中有没有
* 2.再看一级缓存中有没有
* 3.查询数据库
* */
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
SqlSession sqlSession2 = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user=userMapper.getUserById(1);
System.out.println(user);
sqlSession.close();
System.out.println("user1==================================user2");
UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
User user2=userMapper2.getUserById(1);
System.out.println(user2);
User user3=userMapper2.getUserById(2);
System.out.println(user3);
System.out.println("user3==================================user4");
User user4=userMapper2.getUserById(2);
System.out.println(user4);
System.out.println(user==user2);
sqlSession2.close();
}
看二级缓存中有没有
- 2.再看一级缓存中有没有
- 3.查询数据库
- */
```java
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
SqlSession sqlSession2 = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user=userMapper.getUserById(1);
System.out.println(user);
sqlSession.close();
System.out.println("user1==================================user2");
UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
User user2=userMapper2.getUserById(1);
System.out.println(user2);
User user3=userMapper2.getUserById(2);
System.out.println(user3);
System.out.println("user3==================================user4");
User user4=userMapper2.getUserById(2);
System.out.println(user4);
System.out.println(user==user2);
sqlSession2.close();
}