Mybatis

什么是Mybatis

MyBatis是一款优秀的持久层框架,它支持定制SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生类型、接口和Java的POJO(Plain Old Java Objects,普通老式Java对象)为数据库中的记录。

一、第一个Mybatis程序

--1.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>
    <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?serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

--2.MybatisUtiles
public class MybatisUtiles {
    private static SqlSessionFactory sqlSessionFactory ;
    static {
        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();
    }

}

--3.User
public class User {
    private int id;
    private String name;
    private String des;
    private int card_id;
    ...
    省略无参有参构造和toString
}

--4.UserMapper
public interface UserMapper {
    List<User> getUser();
}

--UserMapper.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.syf.dao.UserMapper">
    <select id="getUser" resultType="com.syf.pojo.User">
        select * from user
    </select>
</mapper>

--5.userTest
public class userTest {

        @Test
        public void getUserTest(){
            SqlSession sqlSession = MybatisUtiles.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            List<User> user = mapper.getUser();
            for (User user1 : user) {
                System.out.println(user1);
            }

        }
}

二、配置解析 

mybatis中文文档http://www.mybatis.cn/archives/789.html

注意:在mybatis-config.xml文件中,各个配置属性是有顺序的,必须按照这个顺序进行配置

"(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,

reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)"

1.环境配置(environments)

2.属性(properties)

3.类型别名(typeAliases)

4.设置(settings)

5.映射器(mappers) 

6.生命周期和作用域

三、resultMap结果集映射

解决属性名和字段名不一致问题

只写不一致的字段也可以 

1.一对

四、日志工厂

LOG4J

1.导入依赖

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

2.log4j.properties

百度有很多

#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
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/rose.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

3.配置实现

4.简单使用

--
static  Logger logger = Logger.getLogger(userTest.class);

 

--有这么多方法可以实现
logger.debug("Start of the main() in TestLog4j");
logger.info("Just testing a log message with priority set to INFO");
logger.warn("Just testing a log message with priority set to WARN");
logger.error("Just testing a log message with priority set to ERROR");
logger.fatal("Just testing a log message with priority set to FATAL");
logger.log(Priority.WARN, "Testing a log message use a alternate form");

 5.运行级别

DEBUG < INFO < WARN < ERROR < FATAL

这里Log4j有一个规则:假设设置了级别为P,如果发生了一个级别Q比P高,则可以启动,否则屏蔽掉。

五、分页

Limit

//分页
    List<User> getUserByidLimit(Map<String,Integer> map);


 <!--分页-->
    <select id="getUserByidLimit" parameterType="map" resultType="com.syf.pojo.User">
        select * from user limit #{IndexSize},#{PageSize}
    </select>

 @Test
        public void getUserByidLimit(){
            SqlSession sqlSession = MybatisUtiles.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            Map<String,Integer> map = new HashMap();
            map.put("IndexSize",0);
            map.put("PageSize",1);
            List<User> list = mapper.getUserByidLimit(map);
            for (User user : list) {
                System.out.println(user);
            }
        }

RowBounds也可以实现,它是不使用sql语句实现,用java代码实现。

六、注解开发

七、大致执行流程

图中没有executor(sql语句处理)的执行过程

 八、Lombok

不建议使用,因为IDEA快捷键也能写

IDEA安装lombok插件

导入依赖

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>

常用的

九、复杂查询

--用到的表
CREATE TABLE `teacher` (
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO teacher(`id`, `name`) VALUES (1, '沈老师'); 

CREATE TABLE `student` (
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
`tid` INT(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fktid` (`tid`),
CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');

1.多对一

此处为嵌套结果的查询

Student.java

StudentMapper.java

StudentMapper.xml

2.一对多

Teacher.java

TeacherMapper.java

TeacherMapper.xml

结果,因为和一对多使用的是一个实体类,所以学生类里的老师的null

 

十、动态SQL语句

用到的数据

CREATE TABLE `blog`(
`id` VARCHAR(50) NOT NULL COMMENT '博客id',
`title` VARCHAR(100) NOT NULL COMMENT '博客标题',
`author` VARCHAR(30) NOT NULL COMMENT '博客作者',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`views` INT(30) NOT NULL COMMENT '浏览量'
)ENGINE=INNODB DEFAULT CHARSET=utf8

IDUtils.java 

//获取随机ID
public class IDUtils {
    public static String getId(){
        return UUID.randomUUID().toString().replaceAll("-","");
    }
}

添加数据 

@Test
    public void addBlogTest() {
        SqlSession sqlSession = MybatisUtiles.getSqlSession();
        BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
        Blog blog = new Blog();
        blog.setId(IDUtils.getId());
        blog.setTitle("Mybatis");
        blog.setAuthor("Rose");
        blog.setCreateTime(new Date());
        blog.setViews(9999);
        new Date();
        mapper.addBlog(blog);

        blog.setId(IDUtils.getId());
        blog.setTitle("Java");
        mapper.addBlog(blog);

        blog.setId(IDUtils.getId());
        blog.setTitle("Spring");
        mapper.addBlog(blog);

        blog.setId(IDUtils.getId());
        blog.setTitle("微服务");
        mapper.addBlog(blog);

        sqlSession.close();
    }

Blog.java  

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Blog {
    private String id;
    private  String title;
    private  String author;
    private Date createTime;
    private  int views;
}

BlogMapper.java 

public interface BlogMapper {
    //插入数据
    int addBlog(Blog blog);
}

 BlogMapper.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.syf.dao.BlogMapper">
    <insert id="addBlog" parameterType="com.syf.pojo.Blog">
        insert into blog values (#{id},#{title},#{author},#{createTime},#{views})
    </insert>

</mapper>

1.if语句

2.choose(when、otherwise)


 

3.trim(where、set)

1).where 

改良上边的代码,上边的是用 1=1 来替代的。

where元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除

2).set

3).trim(修剪)

prefix 前缀

preffixOverrides 前缀覆盖

suffix 后缀

sufffixOverrides 后缀覆盖

3.foreach


4.SQL片段

可以将一部分功能抽取出来,方便复用

 十一、缓存

1.简介

2.Mybatis缓存

3.一级缓存

缓存失效的情况

小结

一级缓存是默认开启的,只在一次SqlSeesion中有效

4.二级缓存

 

步骤 

小结

当使用的是默认缓存的时候 

必须要序列化,实体类实现Serializable

5.自定义缓存(Ehcache)

很少人用,现在redis比较火

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值