ToB企服应用市场:ToB评测及商务社交产业平台

标题: 狂神说Java——Mybatis学习笔记 [打印本页]

作者: 梦见你的名字    时间: 2024-5-13 17:11
标题: 狂神说Java——Mybatis学习笔记
前言:共同狂神老师的教学视频使用效果更佳:<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. https://www.bilibili.com/video/BV1NE411Q7Nx/?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click&vd_source=4c3c519d33c113799489c7417a0a4c0e
复制代码
1、简介<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
环境阐明:<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>学习前必要掌握:<br><transactionManager type="[ JDBC | MANAGED ]"/>1.1、什么是MyBatis<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><dependency><br>    <groupId>org.mybatis</groupId><br>    <artifactId>mybatis</artifactId><br>    <version>3.5.6</version><br></dependency><br>
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>1.2、持久化<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>持久化是将程序数据在持久状态和瞬时状态间转换的机制。<br><transactionManager type="[ JDBC | MANAGED ]"/>为什么必要持久化服务呢?那是由于内存本身的缺陷引起的<br><transactionManager type="[ JDBC | MANAGED ]"/>1.3、持久层<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>什么是持久层?<br><transactionManager type="[ JDBC | MANAGED ]"/>1.4、为什么必要Mybatis<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>2、第一个Mybatis程序<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>思路流程:搭建环境-->导入Mybatis--->编写代码--->测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
代码演示<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. CREATE DATABASE `mybatis`;<br><br>USE `mybatis`;<br><br>DROP TABLE IF EXISTS `user`;<br><br>CREATE TABLE `user` (<br>`id` int(20) NOT NULL,<br>`name` varchar(30) DEFAULT NULL,<br>`pwd` varchar(30) DEFAULT NULL,<br>PRIMARY KEY (`id`)<br>) ENGINE=InnoDB DEFAULT CHARSET=utf8;<br><br>insert  into `user`(`id`,`name`,`pwd`) values (1,'英杰','123456'),(2,'张三','abcdef'),(3,'李四','987654');
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <dependency><br>        <groupId>org.mybatis</groupId><br>        <artifactId>mybatis</artifactId><br>        <version>3.5.6</version><br>    </dependency><br>    <dependency><br>        <groupId>mysql</groupId><br>        <artifactId>mysql-connector-java</artifactId><br>        <version>5.1.47</version><br>    </dependency><br>    <dependency><br>        <groupId>junit</groupId><br>        <artifactId>junit</artifactId><br>        <version>4.12</version><br>    </dependency>
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. package com.cherriesovo.pojo;<br><br>public class User {<br><br>    private int id;  //id<br>    private String name;   //姓名<br>    private String pwd;   //密码<br><br>    public User() {<br>    }<br><br>    public User(int id, String name, String pwd) {<br>        this.id = id;<br>        this.name = name;<br>        this.pwd = pwd;<br>    }<br><br>    public int getId() {<br>        return id;<br>    }<br><br>    public void setId(int id) {<br>        this.id = id;<br>    }<br><br>    public String getName() {<br>        return name;<br>    }<br><br>    public void setName(String name) {<br>        this.name = name;<br>    }<br><br>    public String getPwd() {<br>        return pwd;<br>    }<br><br>    public void setPwd(String pwd) {<br>        this.pwd = pwd;<br>    }<br><br>    @Override<br>    public String toString() {<br>        return "User{" +<br>                "id=" + id +<br>                ", name='" + name + '\'' +<br>                ", pwd='" + pwd + '\'' +<br>                '}';<br>    }<br><br>}
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. package com.cherriesovo.dao;<br><br>import com.cherriesovo.pojo.User;<br><br>import java.util.List;<br><br>public interface UserMapper {<br>    List<User> selectUser();<br>}
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>namespace 十分重要,不能写错,一个namespace绑定一个Dao/Mapper接口!<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <?xml version="1.0" encoding="UTF-8" ?><br><!DOCTYPE mapper<br>        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"<br>        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><br><mapper namespace="com.cherriesovo.dao.UserMapper"><br>    <select id="selectUser" resultType="com.cherriesovo.pojo.User"><br>        select * from user<br>    </select><br></mapper>
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. public class UserDaoTest {<br>    @Test<br>    public void SelectUser(){<br>        //从工具类中获取SQLSession<br>        SqlSession session = MybatisUtils.getSession();<br>        <br>        //从SQLSession获取mapper<br>        UserMapper mapper = session.getMapper(UserMapper.class);<br>        //执行查询<br>        List<User> users = mapper.selectUser();<br>        for (User user : users) {<br>            System.out.println(user);<br>        }<br><br>        //关闭连接<br>        session.close();<br>    }<br>}
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>
可能出现的题目:Maven静态资源过滤题目<br><transactionManager type="[ JDBC | MANAGED ]"/>
解决方案:在pom.xml中添加:<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <build><br>    <resources><br>        <resource><br>            <directory>src/main/java</directory><br>            <includes><br>                <include>**/*.properties</include><br>                <include>**/*.xml</include><br>            </includes><br>            <filtering>false</filtering><br>        </resource><br>        <resource><br>            <directory>src/main/resources</directory><br>            <includes><br>                <include>**/*.properties</include><br>                <include>**/*.xml</include><br>            </includes><br>            <filtering>false</filtering><br>        </resource><br>    </resources><br></build>
复制代码
整体思路:<br><transactionManager type="[ JDBC | MANAGED ]"/>3、CRUD<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>3.1、需求:根据id查询用户<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. public interface UserMapper {<br>    //查询指定id的用户<br>    User selectUserbyID(int id);<br>}
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <?xml version="1.0" encoding="UTF-8" ?><br><!DOCTYPE mapper<br>        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"<br>        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><br><br><br><br><mapper namespace="com.cherriesovo.dao.UserMapper"><br><br><br>    <select id="selectUserbyID" resultType="com.cherriesovo.pojo.User"><br>        select * from user where id = #{id}<br>    </select><br></mapper>
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br>    public void selectUserbyID(){<br>        SqlSession session = MybatisUtils.getSession();<br>        UserMapper mapper = session.getMapper(UserMapper.class);<br>        User user = mapper.selectUserbyID(1);<br>        System.out.println(user);<br>        session.close();<br>    }
复制代码
3.2、需求:给数据库增加一个用户<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. public interface UserMapper {<br>     //插入用户<br>    int addUser(User user);<br>}
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <?xml version="1.0" encoding="UTF-8" ?><br><!DOCTYPE mapper<br>        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"<br>        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><br><br><br><br><mapper namespace="com.cherriesovo.dao.UserMapper"><br><br><br>    <insert id="addUser" parameterType="com.cherriesovo.pojo.User"><br>        insert into user(id,name,pwd) values (#{id},#{name},#{pwd})<br>    </insert><br></mapper>
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>
注意:增删改必须提交事务,否则无法乐成<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br>    public void addUser(){<br>        SqlSession session = MybatisUtils.getSession();<br>        UserMapper mapper = session.getMapper(UserMapper.class);<br>        int i = mapper.addUser(new User(4,"小猫","123456"));<br>        //注意:增加、删除、修改必须提交事务<br>        session.commit();   //提交事务<br>        session.close();<br>    }
复制代码
3.3、需求:修改用户的信息<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. public interface UserMapper {<br>     //修改用户<br>    int updateUser(User user);<br>}
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <?xml version="1.0" encoding="UTF-8" ?><br><!DOCTYPE mapper<br>        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"<br>        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><br><br><br><br><mapper namespace="com.cherriesovo.dao.UserMapper"><br><br><br>    <update id="updateUser" parameterType="com.cherriesovo.pojo.User"><br>        update user set name = #{name},pwd = #{pwd} where id = #{id}<br>    </update><br></mapper>
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br>    public void updateUser(){<br>        SqlSession session = MybatisUtils.getSession();<br>        UserMapper mapper = session.getMapper(UserMapper.class);<br>        int i = mapper.updateUser(new User(4,"二狗子","666666"));<br>        //注意:增加、删除、修改必须提交事务<br>        session.commit();   //提交事务<br>        session.close();<br>    }
复制代码
3.4、需求:根据id删除一个用户<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. public interface UserMapper {<br>     //删除用户<br>    int deleteUser(int id);<br>}
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <?xml version="1.0" encoding="UTF-8" ?><br><!DOCTYPE mapper<br>        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"<br>        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><br><br><br><br><mapper namespace="com.cherriesovo.dao.UserMapper"><br><br><br>    <delete id="deleteUser" parameterType="int"><br>        delete from user where id = #{id}<br>    </delete><br></mapper>
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br>    public void deleteUser(){<br>        SqlSession session = MybatisUtils.getSession();<br>        UserMapper mapper = session.getMapper(UserMapper.class);<br>        mapper.deleteUser(4);<br>        //注意:增加、删除、修改必须提交事务<br>        session.commit();   //提交事务<br>        session.close();<br>    }
复制代码
注意:只有查询必要resultType,增删改不必要,此中parameterType为int型的可以省略。<br><transactionManager type="[ JDBC | MANAGED ]"/>小结:<br><transactionManager type="[ JDBC | MANAGED ]"/>3.5、万能的Map<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>使用Map的好处:不必要知道数据库里面有什么,只必要去查对应的字段。如果我们的实体类或者数据表中的字段过多,我们应该考虑使用map。<br><transactionManager type="[ JDBC | MANAGED ]"/>
使用Map的方式修改用户信息<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. public interface UserMapper {<br>     //修改用户(使用map实现)<br>    int updateUserbyMap(Map<String,Object> map);<br>}
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <?xml version="1.0" encoding="UTF-8" ?><br><!DOCTYPE mapper<br>        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"<br>        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><br><br><br><br><mapper namespace="com.cherriesovo.dao.UserMapper"><br><br><br>    <update id="updateUserbyMap" parameterType="map"><br>        update user set pwd = #{password} where id = #{userid}<br>    </update><br></mapper>
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br>    public void updateUserbyMap(){<br>        SqlSession session = MybatisUtils.getSession();<br>        UserMapper mapper = session.getMapper(UserMapper.class);<br><br>        Map<String, Object> map = new HashMap<String, Object>();<br>        map.put("password","55555");<br>        map.put("userid",2);<br>        mapper.updateUserbyMap(map);<br><br>        //注意:增加、删除、修改必须提交事务<br>        session.commit();   //提交事务<br>        session.close();<br>    }
复制代码
Map和对象的使用区别:<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br>    <update id="updateUserbyMap" parameterType="map"><br>        update user set pwd = #{password} where id = #{userid}<br>    </update><br><br><br>    <update id="updateUser" parameterType="com.cherriesovo.pojo.User"><br>        update user set name = #{name},pwd = #{pwd} where id = #{id}<br>    </update>
复制代码
3.6、模糊查询<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>方式一:在Java代码中添加sql通配符%%。<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1.         <br>    <select id="selectUserbyLike" resultType="com.cherriesovo.pojo.User"><br>        select * from user where name like #{value}<br>    </select><br>        <br>    //3、执行查询<br>        List<User> users = mapper.selectUserbyLike("%李%");
复制代码
方式二:在sql语句中拼接通配符,会引起sql注入<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1.     <br>        <select id="selectUserbyLike" resultType="com.cherriesovo.pojo.User"><br>        select * from user where name like "%"#{value}"%"<br>    </select><br><br>        //3、执行查询<br>    List<User> users = mapper.selectUserbyLike("李");
复制代码
4、配置解析<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>4.1、核心配置文件<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. configuration(配置)<br>properties(属性)<br>settings(设置)<br>typeAliases(类型别名)<br>typeHandlers(类型处理器)<br>objectFactory(对象工厂)<br>plugins(插件)<br>environments(环境配置)<br>environment(环境变量)<br>transactionManager(事务管理器)<br>dataSource(数据源)<br>databaseIdProvider(数据库厂商标识)<br>mappers(映射器)<br>
复制代码
4.2、environments元素<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <environments default="development"><br> <environment id="development"><br>   <transactionManager type="JDBC"><br>     <property name="..." value="..."/><br>   </transactionManager><br>   <dataSource type="POOLED"><br>     <property name="driver" value="${driver}"/><br>     <property name="url" value="${url}"/><br>     <property name="username" value="${username}"/><br>     <property name="password" value="${password}"/><br>   </dataSource><br> </environment><br></environments>
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>4.3、映射器(mappers)<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>mappers<br><transactionManager type="[ JDBC | MANAGED ]"/>引入资源方式<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
Mapper文件<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>MyBatis 的真正强大在于它的映射语句,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简朴。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 为聚焦于 SQL 而构建,以尽可能地为你减少麻烦。<br><transactionManager type="[ JDBC | MANAGED ]"/>4.4、属性(Properties)(重要)<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>数据库这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元向来传递,此中Java 属性文件的优先级更高。<br><transactionManager type="[ JDBC | MANAGED ]"/>我们来优化我们的配置文件:<br><transactionManager type="[ JDBC | MANAGED ]"/>第一步 :在资源目录下新建一个db.properties<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. driver=com.mysql.jdbc.Driver<br><transactionManager type="[ JDBC | MANAGED ]"/>url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8<br><transactionManager type="[ JDBC | MANAGED ]"/>username=root<br><transactionManager type="[ JDBC | MANAGED ]"/>password=417020
复制代码
第二步 : 将文件导入properties 配置文件(必要放置在标签中的最上方)<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1.         <br><transactionManager type="[ JDBC | MANAGED ]"/>   
复制代码
4.5、typeAliases别名(重要)<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>   
复制代码
当如许配置时,User可以用在任何使用com.kuang.pojo.User的地方。<br><transactionManager type="[ JDBC | MANAGED ]"/>也可以指定一个包名,MyBatis 会在包名下面搜索必要的 Java Bean,比如:<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
每一个在包 com.kuang.pojo 中的 Java Bean(类),在没有注解的情况下,会使用 Bean(类) 的首字母小写的非限定类名来作为它的别名。<br><transactionManager type="[ JDBC | MANAGED ]"/>例如:User的别名就是user<br><transactionManager type="[ JDBC | MANAGED ]"/>若有注解,则别名为其注解值。见下面的例子:<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. //方式三<br><transactionManager type="[ JDBC | MANAGED ]"/>@Alias("user")<br><transactionManager type="[ JDBC | MANAGED ]"/>public class User {<br><transactionManager type="[ JDBC | MANAGED ]"/>  ...<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
去官网查看一下Mybatis默认的一些类型别名!<br><transactionManager type="[ JDBC | MANAGED ]"/>4.6、设置(sittings)(重要)<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
类型处理器<br><transactionManager type="[ JDBC | MANAGED ]"/>对象工厂<br><transactionManager type="[ JDBC | MANAGED ]"/>4.7、作用域(Scope)和生命周期<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>我们目前已经讨论过的差异作用域和生命周期类是至关重要的,由于错误的使用会导致非常严重的并发题目。<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>程序开始执行后,SqlSessionFactoryBuilder 读取配置文件来生产SqlSessionFactory;SqlSessionFactory 生产SqlSession,SqlSession获取SqlMapper,每一个SqlMapper都对应着一个详细的业务。<br><transactionManager type="[ JDBC | MANAGED ]"/>作用域理解<br><transactionManager type="[ JDBC | MANAGED ]"/>学会了Crud,和基本的配置及原理,后面就可以学习些业务开发。。。<br><transactionManager type="[ JDBC | MANAGED ]"/>5、ResultMap<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>作用:解决实体类属性名和数据库字段名不一致的题目<br><transactionManager type="[ JDBC | MANAGED ]"/>环境:新建一个项目,将之前的项目拷贝过来<br><transactionManager type="[ JDBC | MANAGED ]"/>1、查看之前的数据库的字段名<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>2、Java中的实体类设计<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. public class User {<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>    private int id;  //id<br><transactionManager type="[ JDBC | MANAGED ]"/>    private String name;   //姓名<br><transactionManager type="[ JDBC | MANAGED ]"/>    private String password;   //密码和数据库名不一样!<br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>   //构造<br><transactionManager type="[ JDBC | MANAGED ]"/>   //set/get<br><transactionManager type="[ JDBC | MANAGED ]"/>   //toString()<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
3、接口<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. public interface UserMapper {<br>    //查询指定id的用户<br>    User selectUserbyID(int id);<br>}
复制代码
4、mapper映射文件<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>  select * from user where id = #{id}<br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
5、测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>    public void selectUserbyID(){<br><transactionManager type="[ JDBC | MANAGED ]"/>        SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>        UserMapper mapper = session.getMapper(UserMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/>        User user = mapper.selectUserbyID(3);<br><transactionManager type="[ JDBC | MANAGED ]"/>        System.out.println(user);<br><transactionManager type="[ JDBC | MANAGED ]"/>        session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>    }
复制代码
结果:<br><transactionManager type="[ JDBC | MANAGED ]"/>分析:<br><transactionManager type="[ JDBC | MANAGED ]"/>
解决方案<br><transactionManager type="[ JDBC | MANAGED ]"/>
方案一:为列名指定别名 , 别名和java实体类的属性名一致;<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>  select id , name , pwd as password from user where id = #{id}<br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
方案二:使用结果集映射->ResultMap 【保举】<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1.         <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>            <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>        select * from user where id = #{id}<br><transactionManager type="[ JDBC | MANAGED ]"/>   
复制代码
ResultMap<br><transactionManager type="[ JDBC | MANAGED ]"/>
主动映射<br><transactionManager type="[ JDBC | MANAGED ]"/>6、日记<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>6.1、日记工厂<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>思考:我们在测试SQL的时候,要是能够在控制台输出 SQL 的话,是不是就能够有更快的排错效率?<br><transactionManager type="[ JDBC | MANAGED ]"/>如果一个 数据库相关的操纵出现了题目,我们可以根据输出的SQL语句快速排查题目。<br><transactionManager type="[ JDBC | MANAGED ]"/>对于以往的开发过程,我们会经常使用到debug模式来调治,跟踪我们的代码执行过程。但是现在使用Mybatis是基于接口,配置文件的源代码执行过程。因此,我们必须选择日记工具来作为我们开发,调治程序的工具。<br><transactionManager type="[ JDBC | MANAGED ]"/>Mybatis内置的日记工厂提供日记功能,详细的日记实现有以下几种工具:<br><transactionManager type="[ JDBC | MANAGED ]"/>详细选择哪个日记实现工具由MyBatis的内置日记工厂确定。它会使用最先找到的(按上文罗列的次序查找)。如果一个都未找到,日记功能就会被禁用。<br><transactionManager type="[ JDBC | MANAGED ]"/>6.2、标准日记实现<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>指定 MyBatis 应该使用哪个日记记录实现。如果此设置不存在,则会主动发现日记记录实现。<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>       <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
测试,可以看到控制台有大量的输出!我们可以通过这些输出来判断程序到底哪里出了Bug。<br><transactionManager type="[ JDBC | MANAGED ]"/>6.3、log4J<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>简介:<br><transactionManager type="[ JDBC | MANAGED ]"/>使用步调:<br><transactionManager type="[ JDBC | MANAGED ]"/>1、导入log4j的包<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>   log4j<br><transactionManager type="[ JDBC | MANAGED ]"/>   log4j<br><transactionManager type="[ JDBC | MANAGED ]"/>   1.2.17<br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
2、配置文件编写<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. #将等级为DEBUG的日记信息输出到console和file这两个目的地,console和file的定义在下面的代码<br><transactionManager type="[ JDBC | MANAGED ]"/>log4j.rootLogger=DEBUG,console,file<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>#控制台输出的相关设置<br><transactionManager type="[ JDBC | MANAGED ]"/>log4j.appender.console = org.apache.log4j.ConsoleAppender<br><transactionManager type="[ JDBC | MANAGED ]"/>log4j.appender.console.Target = System.out<br><transactionManager type="[ JDBC | MANAGED ]"/>log4j.appender.console.Threshold=DEBUG<br><transactionManager type="[ JDBC | MANAGED ]"/>log4j.appender.console.layout = org.apache.log4j.PatternLayout<br><transactionManager type="[ JDBC | MANAGED ]"/>log4j.appender.console.layout.ConversionPattern=[%c]-%m%n<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>#文件输出的相关设置<br><transactionManager type="[ JDBC | MANAGED ]"/>log4j.appender.file = org.apache.log4j.RollingFileAppender<br><transactionManager type="[ JDBC | MANAGED ]"/>log4j.appender.file.File=./log/cherriesovo.log<br><transactionManager type="[ JDBC | MANAGED ]"/>log4j.appender.file.MaxFileSize=10mb<br><transactionManager type="[ JDBC | MANAGED ]"/>log4j.appender.file.Threshold=DEBUG<br><transactionManager type="[ JDBC | MANAGED ]"/>log4j.appender.file.layout=org.apache.log4j.PatternLayout<br><transactionManager type="[ JDBC | MANAGED ]"/>log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>#日记输出级别<br><transactionManager type="[ JDBC | MANAGED ]"/>log4j.logger.org.mybatis=DEBUG<br><transactionManager type="[ JDBC | MANAGED ]"/>log4j.logger.java.sql=DEBUG<br><transactionManager type="[ JDBC | MANAGED ]"/>log4j.logger.java.sql.Statement=DEBUG<br><transactionManager type="[ JDBC | MANAGED ]"/>log4j.logger.java.sql.ResultSet=DEBUG<br><transactionManager type="[ JDBC | MANAGED ]"/>log4j.logger.java.sql.PreparedStatement=DEBUG
复制代码
3、setting设置日记实现<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
4、在程序中使用Log4j进行输出!<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1.         //注意导包:org.apache.log4j.Logger<br><transactionManager type="[ JDBC | MANAGED ]"/>        static Logger logger = Logger.getLogger(UserDaoTest.class);<br><transactionManager type="[ JDBC | MANAGED ]"/>    @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>    public void selectUserbyID(){<br><transactionManager type="[ JDBC | MANAGED ]"/>        logger.info("info:进入selectUser方法");<br><transactionManager type="[ JDBC | MANAGED ]"/>        logger.debug("debug:进入selectUser方法");<br><transactionManager type="[ JDBC | MANAGED ]"/>        logger.error("error: 进入selectUser方法");<br><transactionManager type="[ JDBC | MANAGED ]"/>        SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>        UserMapper mapper = session.getMapper(UserMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/>        User user = mapper.selectUserbyID(3);<br><transactionManager type="[ JDBC | MANAGED ]"/>        System.out.println(user);<br><transactionManager type="[ JDBC | MANAGED ]"/>        session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>    }
复制代码
5、测试,看控制台输出!<br><transactionManager type="[ JDBC | MANAGED ]"/>7、分页<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>思考:为什么必要分页?<br><transactionManager type="[ JDBC | MANAGED ]"/>在学习mybatis等持久层框架的时候,会经常对数据进行增删改查操纵,使用最多的是对数据库进行查询操纵,如果查询大量数据的时候,我们往往使用分页进行查询,也就是每次处理小部分数据,如许对数据库压力就在可控范围内。<br><transactionManager type="[ JDBC | MANAGED ]"/>7.1、Limit分页<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. #语法<br><transactionManager type="[ JDBC | MANAGED ]"/>SELECT * FROM table LIMIT stratIndex,pageSize<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15  <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>#为了检索从某一个偏移量到最后一个结束所有的记录行,可以指定第二个参数为 -1:   <br><transactionManager type="[ JDBC | MANAGED ]"/>SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.  <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>#如果只给定一个参数,它表现返回最大的记录行数目:   <br><transactionManager type="[ JDBC | MANAGED ]"/>SELECT * FROM table LIMIT 5; //检索前 5 个记录行  <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>#换句话说,LIMIT n 等价于 LIMIT 0,n。
复制代码
步调:<br><transactionManager type="[ JDBC | MANAGED ]"/>1、接口<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. public interface UserMapper {  <br><transactionManager type="[ JDBC | MANAGED ]"/>    //分页查询<br><transactionManager type="[ JDBC | MANAGED ]"/>    List selectUserbyIDLimit(Map map);<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
2、修改Mapper.xml文件<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1.         <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>        select * from user limit #{startnum},#{endnum};<br><transactionManager type="[ JDBC | MANAGED ]"/>   
复制代码
3、修改测试类<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>    public void selectUserbyIDLimit(){<br><transactionManager type="[ JDBC | MANAGED ]"/>        SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>        UserMapper mapper = session.getMapper(UserMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>        Map map = new HashMap();<br><transactionManager type="[ JDBC | MANAGED ]"/>        map.put("startnum",1);<br><transactionManager type="[ JDBC | MANAGED ]"/>        map.put("endnum",3);<br><transactionManager type="[ JDBC | MANAGED ]"/>        List users = mapper.selectUserbyIDLimit(map);<br><transactionManager type="[ JDBC | MANAGED ]"/>        for (User user : users) {<br><transactionManager type="[ JDBC | MANAGED ]"/>            System.out.println(user);<br><transactionManager type="[ JDBC | MANAGED ]"/>        }<br><transactionManager type="[ JDBC | MANAGED ]"/>        session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>    }
复制代码
7.2、RowBounds分页<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>我们除了使用Limit在SQL层面实现分页,也可以使用RowBounds在Java代码层面实现分页,固然此种方式作为了解即可。我们来看下怎样实现的!<br><transactionManager type="[ JDBC | MANAGED ]"/>步调:<br><transactionManager type="[ JDBC | MANAGED ]"/>1、mapper接口<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. //选择全部用户RowBounds实现分页<br><transactionManager type="[ JDBC | MANAGED ]"/>List getUserByRowBounds();
复制代码
2、mapper文件<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>select * from user<br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
3、测试类<br><transactionManager type="[ JDBC | MANAGED ]"/>在这里,我们必要使用RowBounds类<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>public void testUserByRowBounds() {<br><transactionManager type="[ JDBC | MANAGED ]"/>   SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   int currentPage = 2;  //第几页<br><transactionManager type="[ JDBC | MANAGED ]"/>   int pageSize = 2;  //每页表现几个<br><transactionManager type="[ JDBC | MANAGED ]"/>   RowBounds rowBounds = new RowBounds((currentPage-1)*pageSize,pageSize);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   //通过session.**方法进行传递rowBounds,[此种方式现在已经不保举使用了]<br><transactionManager type="[ JDBC | MANAGED ]"/>   List users = session.selectList("com.kuang.mapper.UserMapper.getUserByRowBounds", null, rowBounds);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   for (User user: users){<br><transactionManager type="[ JDBC | MANAGED ]"/>       System.out.println(user);<br><transactionManager type="[ JDBC | MANAGED ]"/>  }<br><transactionManager type="[ JDBC | MANAGED ]"/>   session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
7.3、PageHelper<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>了解即可,可以本身尝试使用.<br><transactionManager type="[ JDBC | MANAGED ]"/>会了简朴的结果集映射,后面我们就可以实现一对多和多对一操纵了!!!<br><transactionManager type="[ JDBC | MANAGED ]"/>8、使用注解开发<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
面向接口编程<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>8.1、关于接口的理解<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>三个面向区别<br><transactionManager type="[ JDBC | MANAGED ]"/>8.2、利用注解开发<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
注意:利用注解开发就不必要mapper.xml映射文件了 .<br><transactionManager type="[ JDBC | MANAGED ]"/>
1、我们在我们的接口中添加注解<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. public interface UserMapper {<br><transactionManager type="[ JDBC | MANAGED ]"/>    //查询所有用户<br><transactionManager type="[ JDBC | MANAGED ]"/>    @Select("select * from user")<br><transactionManager type="[ JDBC | MANAGED ]"/>    List selectUser();<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
2、在mybatis的核心配置文件中注入<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
3、我们去进行测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. public class UserDaoTest {<br><transactionManager type="[ JDBC | MANAGED ]"/>    @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>    public void selectUser(){<br><transactionManager type="[ JDBC | MANAGED ]"/>        SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>        UserMapper mapper = session.getMapper(UserMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/>        List users = mapper.selectUser();<br><transactionManager type="[ JDBC | MANAGED ]"/>        for (User user : users) {<br><transactionManager type="[ JDBC | MANAGED ]"/>            System.out.println(user);<br><transactionManager type="[ JDBC | MANAGED ]"/>        }<br><transactionManager type="[ JDBC | MANAGED ]"/>        session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>    }<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
4、利用Debug查看本质<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>5、本质上利用了jvm的动态署理机制<br><transactionManager type="[ JDBC | MANAGED ]"/>6、Mybatis详细的执行流程<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>8.3、使用注释实现增删改查<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
准备工作<br><transactionManager type="[ JDBC | MANAGED ]"/>
改造MybatisUtils工具类的getSession( ) 方法,重载实现事务主动提交。<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. public static SqlSession getSession(){<br><transactionManager type="[ JDBC | MANAGED ]"/>        return sqlSessionFactory.openSession(true); //设置事务主动提交<br><transactionManager type="[ JDBC | MANAGED ]"/>    }
复制代码
【注意】确保实体类和数据库字段对应<br><transactionManager type="[ JDBC | MANAGED ]"/>
查询<br><transactionManager type="[ JDBC | MANAGED ]"/>
1、编写接口方法注解<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1.         //id查询用户<br><transactionManager type="[ JDBC | MANAGED ]"/>    @Select("select * from user where id = #{id}")<br><transactionManager type="[ JDBC | MANAGED ]"/>    User selectUserById(@Param("id") int id);
复制代码
2、测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1.         @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>    public void selectUserbyId(){<br><transactionManager type="[ JDBC | MANAGED ]"/>        SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>        UserMapper mapper = session.getMapper(UserMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>        User user = mapper.selectUserById(1);<br><transactionManager type="[ JDBC | MANAGED ]"/>        System.out.println(user);<br><transactionManager type="[ JDBC | MANAGED ]"/>                session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>    }
复制代码
增加<br><transactionManager type="[ JDBC | MANAGED ]"/>
1、编写接口方法注解<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1.         //添加用户<br><transactionManager type="[ JDBC | MANAGED ]"/>    @Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})")<br><transactionManager type="[ JDBC | MANAGED ]"/>    int insertUser(User user);
复制代码
2、测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1.         @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>    public void insertUser(){<br><transactionManager type="[ JDBC | MANAGED ]"/>        SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>        UserMapper mapper = session.getMapper(UserMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>        int saber = mapper.insertUser(new User(5, "Saber", "234567"));<br><transactionManager type="[ JDBC | MANAGED ]"/>        session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>    }
复制代码
修改<br><transactionManager type="[ JDBC | MANAGED ]"/>
1、编写接口方法注解<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1.         //修改用户<br><transactionManager type="[ JDBC | MANAGED ]"/>    @Update("update user set name = #{name},pwd = #{pwd} where id = #{id}")<br><transactionManager type="[ JDBC | MANAGED ]"/>    int updateUser(User user);
复制代码
2、测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1.         @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>    public void updateUser(){<br><transactionManager type="[ JDBC | MANAGED ]"/>        SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>        UserMapper mapper = session.getMapper(UserMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>        int archer = mapper.updateUser(new User(5, "Archer", "123456"));<br><transactionManager type="[ JDBC | MANAGED ]"/>        session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>    }
复制代码
删除<br><transactionManager type="[ JDBC | MANAGED ]"/>
1、编写接口方法注解<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1.         //删除用户<br><transactionManager type="[ JDBC | MANAGED ]"/>    @Delete("delete from user where id = #{id}")<br><transactionManager type="[ JDBC | MANAGED ]"/>    int deleteUser(@Param("id") int id);
复制代码
2、测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1.         @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>    public void deleteUser(){<br><transactionManager type="[ JDBC | MANAGED ]"/>        SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>        UserMapper mapper = session.getMapper(UserMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>        int saber = mapper.deleteUser(4);<br><transactionManager type="[ JDBC | MANAGED ]"/>        session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>    }
复制代码
关于@Param<br><transactionManager type="[ JDBC | MANAGED ]"/>
@Param注解用于给方法参数起一个名字。以下是总结的使用原则:<br><transactionManager type="[ JDBC | MANAGED ]"/>
#与$的区别<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>
使用注解和配置文件协同开发,才是MyBatis的最佳实践!<br><transactionManager type="[ JDBC | MANAGED ]"/>
9、多对一<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>9.1、多对一的处理<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>多对一的理解:<br><transactionManager type="[ JDBC | MANAGED ]"/>
数据库设计<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. CREATE TABLE `teacher` (<br><transactionManager type="[ JDBC | MANAGED ]"/>`id` INT(10) NOT NULL,<br><transactionManager type="[ JDBC | MANAGED ]"/>`name` VARCHAR(30) DEFAULT NULL,<br><transactionManager type="[ JDBC | MANAGED ]"/>PRIMARY KEY (`id`)<br><transactionManager type="[ JDBC | MANAGED ]"/>) ENGINE=INNODB DEFAULT CHARSET=utf8<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师');<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>CREATE TABLE `student` (<br><transactionManager type="[ JDBC | MANAGED ]"/>`id` INT(10) NOT NULL,<br><transactionManager type="[ JDBC | MANAGED ]"/>`name` VARCHAR(30) DEFAULT NULL,<br><transactionManager type="[ JDBC | MANAGED ]"/>`tid` INT(10) DEFAULT NULL,<br><transactionManager type="[ JDBC | MANAGED ]"/>PRIMARY KEY (`id`),<br><transactionManager type="[ JDBC | MANAGED ]"/>KEY `fktid` (`tid`),<br><transactionManager type="[ JDBC | MANAGED ]"/>CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)<br><transactionManager type="[ JDBC | MANAGED ]"/>) ENGINE=INNODB DEFAULT CHARSET=utf8<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1');<br><transactionManager type="[ JDBC | MANAGED ]"/>INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1');<br><transactionManager type="[ JDBC | MANAGED ]"/>INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1');<br><transactionManager type="[ JDBC | MANAGED ]"/>INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1');<br><transactionManager type="[ JDBC | MANAGED ]"/>INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');
复制代码
搭建测试环境<br><transactionManager type="[ JDBC | MANAGED ]"/>
1、IDEA安装Lombok插件<br><transactionManager type="[ JDBC | MANAGED ]"/>2、引入Maven依赖<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/> org.projectlombok<br><transactionManager type="[ JDBC | MANAGED ]"/> lombok<br><transactionManager type="[ JDBC | MANAGED ]"/> 1.16.10<br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
3、在代码中增加注解<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Data //GET,SET,ToString,有参,无参构造<br><transactionManager type="[ JDBC | MANAGED ]"/>public class Teacher {<br><transactionManager type="[ JDBC | MANAGED ]"/>   private int id;<br><transactionManager type="[ JDBC | MANAGED ]"/>   private String name;<br><transactionManager type="[ JDBC | MANAGED ]"/>}<br><transactionManager type="[ JDBC | MANAGED ]"/>@Data<br><transactionManager type="[ JDBC | MANAGED ]"/>public class Student {<br><transactionManager type="[ JDBC | MANAGED ]"/>   private int id;<br><transactionManager type="[ JDBC | MANAGED ]"/>   private String name;<br><transactionManager type="[ JDBC | MANAGED ]"/>   //多个门生可以是同一个老师,即多对一<br><transactionManager type="[ JDBC | MANAGED ]"/>   private Teacher teacher;<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
4、编写实体类对应的Mapper接口 【两个】<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. public interface StudentMapper {<br><transactionManager type="[ JDBC | MANAGED ]"/>}<br><transactionManager type="[ JDBC | MANAGED ]"/>public interface TeacherMapper {<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
5、编写Mapper接口对应的 mapper.xml配置文件 【两个】<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
按查询嵌套处理<br><transactionManager type="[ JDBC | MANAGED ]"/>
1、给StudentMapper接口增加方法<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. public interface StudentMapper {<br><transactionManager type="[ JDBC | MANAGED ]"/>    List getStudents();<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
2、编写对应的Mapper文件(Mapper文件肯定要先在核心配置文件中注册)<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>        select * from student<br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>        select * from teacher where id = #{tid}<br><transactionManager type="[ JDBC | MANAGED ]"/>   
复制代码
3、编写完毕去Mybatis配置文件中,注册Mapper!<br><transactionManager type="[ JDBC | MANAGED ]"/>4、注意点阐明:<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>  select * from teacher where id = #{id} and name = #{name}<br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
5、测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>    public void selectStudentTeacher(){<br><transactionManager type="[ JDBC | MANAGED ]"/>        SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>        StudentMapper mapper = session.getMapper(StudentMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/>        List students = mapper.getStudents();<br><transactionManager type="[ JDBC | MANAGED ]"/>        for (Student student : students) {<br><transactionManager type="[ JDBC | MANAGED ]"/>            System.out.println(student);<br><transactionManager type="[ JDBC | MANAGED ]"/>        }<br><transactionManager type="[ JDBC | MANAGED ]"/>                session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>    }
复制代码
按结果嵌套处理<br><transactionManager type="[ JDBC | MANAGED ]"/>
1、接口方法编写<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. List<Student> getStudents2();
复制代码
2、编写对应的mapper文件<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>        select s.id sid,s.name sname,t.name tname from<br><transactionManager type="[ JDBC | MANAGED ]"/>        student s,teacher t<br><transactionManager type="[ JDBC | MANAGED ]"/>        where s.tid = t.id;<br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>            <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>   
复制代码
3、编写完毕去Mybatis配置文件中,注册Mapper!<br><transactionManager type="[ JDBC | MANAGED ]"/>4、测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>    public void selectStudentTeacher2(){<br><transactionManager type="[ JDBC | MANAGED ]"/>        SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>        StudentMapper mapper = session.getMapper(StudentMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/>        List students = mapper.getStudents2();<br><transactionManager type="[ JDBC | MANAGED ]"/>        for (Student student : students) {<br><transactionManager type="[ JDBC | MANAGED ]"/>            System.out.println(student);<br><transactionManager type="[ JDBC | MANAGED ]"/>        }<br><transactionManager type="[ JDBC | MANAGED ]"/>                session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>    }
复制代码
小结<br><transactionManager type="[ JDBC | MANAGED ]"/>
按照查询进行嵌套处理就像SQL中的子查询<br><transactionManager type="[ JDBC | MANAGED ]"/>按照结果进行嵌套处理就像SQL中的联表查询<br><transactionManager type="[ JDBC | MANAGED ]"/>9.2、一对多的处理<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>一对多的理解:<br><transactionManager type="[ JDBC | MANAGED ]"/>
实体类编写<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Data<br><transactionManager type="[ JDBC | MANAGED ]"/>public class Teacher {<br><transactionManager type="[ JDBC | MANAGED ]"/>    private int id;<br><transactionManager type="[ JDBC | MANAGED ]"/>    private String name;<br><transactionManager type="[ JDBC | MANAGED ]"/>    private List students;<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
  1. @Data<br><transactionManager type="[ JDBC | MANAGED ]"/>public class Student {<br><transactionManager type="[ JDBC | MANAGED ]"/>    private int id;<br><transactionManager type="[ JDBC | MANAGED ]"/>    private String name;<br><transactionManager type="[ JDBC | MANAGED ]"/>    private int tid;<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
按结果嵌套处理<br><transactionManager type="[ JDBC | MANAGED ]"/>
1、TeacherMapper接口编写方法<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. public interface TeacherMapper {<br><transactionManager type="[ JDBC | MANAGED ]"/>    //查询某个老师以及其对应的所有门生的信息<br><transactionManager type="[ JDBC | MANAGED ]"/>    Teacher selectTeachers(int id);<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
2、编写接口对应的Mapper配置文件<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>        select s.id sid,s.name sname,t.name tname ,t.id tid from<br><transactionManager type="[ JDBC | MANAGED ]"/>        student s,teacher t<br><transactionManager type="[ JDBC | MANAGED ]"/>        where s.tid = t.id and t.id = #{id}<br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>                        <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>            <br><transactionManager type="[ JDBC | MANAGED ]"/>            <br><transactionManager type="[ JDBC | MANAGED ]"/>            <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>   
复制代码
3、将Mapper文件注册到MyBatis-config文件中<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
4、测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>    public void selectTeacher(){<br><transactionManager type="[ JDBC | MANAGED ]"/>        SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>        TeacherMapper mapper = session.getMapper(TeacherMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/>        Teacher teacher = mapper.selectTeachers(1);<br><transactionManager type="[ JDBC | MANAGED ]"/>        System.out.println(teacher);<br><transactionManager type="[ JDBC | MANAGED ]"/>        session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>    }
复制代码
按查询嵌套处理<br><transactionManager type="[ JDBC | MANAGED ]"/>
1、TeacherMapper接口编写方法<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. public Teacher getTeacher2(int id);
复制代码
2、编写接口对应的Mapper配置文件<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>select * from teacher where id = #{id}<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>  select * from student where tid = #{id}<br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
3、将Mapper文件注册到MyBatis-config文件中<br><transactionManager type="[ JDBC | MANAGED ]"/>4、测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>public void testGetTeacher2(){<br><transactionManager type="[ JDBC | MANAGED ]"/>   SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>   TeacherMapper mapper = session.getMapper(TeacherMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/>   Teacher teacher = mapper.getTeacher2(1);<br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(teacher.getName());<br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(teacher.getStudents());<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
小结<br><transactionManager type="[ JDBC | MANAGED ]"/>
1、关联-association<br><transactionManager type="[ JDBC | MANAGED ]"/>2、集合-collection<br><transactionManager type="[ JDBC | MANAGED ]"/>3、所以association是用于一对一和多对一,而collection是用于一对多的关系<br><transactionManager type="[ JDBC | MANAGED ]"/>4、JavaType和ofType都是用来指定对象类型的<br><transactionManager type="[ JDBC | MANAGED ]"/>注意阐明:<br><transactionManager type="[ JDBC | MANAGED ]"/>1、包管SQL的可读性,尽量通俗易懂<br><transactionManager type="[ JDBC | MANAGED ]"/>2、根据实际要求,尽量编写性能更高的SQL语句<br><transactionManager type="[ JDBC | MANAGED ]"/>3、注意属性名和字段不一致的题目<br><transactionManager type="[ JDBC | MANAGED ]"/>4、注意一对多和多对一 中:字段和属性对应的题目<br><transactionManager type="[ JDBC | MANAGED ]"/>5、尽量使用Log4j,通过日记来查看本身的错误<br><transactionManager type="[ JDBC | MANAGED ]"/>10、动态SQL<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
介绍<br><transactionManager type="[ JDBC | MANAGED ]"/>
什么是动态SQL:动态SQL指的是根据差异的查询条件 , 生成差异的Sql语句.<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. 官网描述:<br><transactionManager type="[ JDBC | MANAGED ]"/>MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或别的类似框架的经验,你就能体会到根据差异条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。<br><transactionManager type="[ JDBC | MANAGED ]"/>固然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在恣意 SQL 映射语句中的强大的动态 SQL 语言得以改进这种情形。<br><transactionManager type="[ JDBC | MANAGED ]"/>动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素必要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰别的大部分元素。<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>  -------------------------------<br><transactionManager type="[ JDBC | MANAGED ]"/>  - if<br><transactionManager type="[ JDBC | MANAGED ]"/>  - choose (when, otherwise)<br><transactionManager type="[ JDBC | MANAGED ]"/>  - trim (where, set)<br><transactionManager type="[ JDBC | MANAGED ]"/>  - foreach<br><transactionManager type="[ JDBC | MANAGED ]"/>  -------------------------------
复制代码
我们之前写的 SQL 语句都比力简朴,如果有比力复杂的业务,我们必要写复杂的 SQL 语句,往往必要拼接,而拼接 SQL ,稍微不注意,由于引号,空格等缺失可能都会导致错误。<br><transactionManager type="[ JDBC | MANAGED ]"/>那么怎么去解决这个题目呢?这就要使用 mybatis 动态SQL,通过 if, choose, when, otherwise, trim, where, set, foreach等标签,可组合成非常灵活的SQL语句,从而在提高 SQL 语句的准确性的同时,也大大提高了开发人员的效率。<br><transactionManager type="[ JDBC | MANAGED ]"/>
搭建环境<br><transactionManager type="[ JDBC | MANAGED ]"/>
新建一个数据库表:blog<br><transactionManager type="[ JDBC | MANAGED ]"/>字段:id,title,author,create_time,views<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. CREATE TABLE `blog` (<br><transactionManager type="[ JDBC | MANAGED ]"/>`id` varchar(50) NOT NULL COMMENT '博客id',<br><transactionManager type="[ JDBC | MANAGED ]"/>`title` varchar(100) NOT NULL COMMENT '博客标题',<br><transactionManager type="[ JDBC | MANAGED ]"/>`author` varchar(30) NOT NULL COMMENT '博客作者',<br><transactionManager type="[ JDBC | MANAGED ]"/>`create_time` datetime NOT NULL COMMENT '创建时间',<br><transactionManager type="[ JDBC | MANAGED ]"/>`views` int(30) NOT NULL COMMENT '欣赏量'<br><transactionManager type="[ JDBC | MANAGED ]"/>) ENGINE=InnoDB DEFAULT CHARSET=utf8
复制代码
1、创建Mybatis底子工程<br><transactionManager type="[ JDBC | MANAGED ]"/>2、IDutil工具类<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. public class IDUtil {<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   public static String genId(){<br><transactionManager type="[ JDBC | MANAGED ]"/>       return UUID.randomUUID().toString().replaceAll("-","");<br><transactionManager type="[ JDBC | MANAGED ]"/>  }<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
3、实体类编写 【注意set方法作用】<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Data<br><transactionManager type="[ JDBC | MANAGED ]"/>public class Blog {<br><transactionManager type="[ JDBC | MANAGED ]"/>    private String id;<br><transactionManager type="[ JDBC | MANAGED ]"/>    private String title;<br><transactionManager type="[ JDBC | MANAGED ]"/>    private String author;<br><transactionManager type="[ JDBC | MANAGED ]"/>    private Date createTime;<br><transactionManager type="[ JDBC | MANAGED ]"/>    private int views;<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
4、编写Mapper接口及xml文件<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. public interface BlogMapper {<br><transactionManager type="[ JDBC | MANAGED ]"/>    //新增一个博客<br><transactionManager type="[ JDBC | MANAGED ]"/>    int addBlog(Blog blog);<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
5、mybatis核心配置文件,下划线驼峰主动转换<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>    <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
6、插入初始数据<br><transactionManager type="[ JDBC | MANAGED ]"/>编写接口<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. //新增一个博客<br><transactionManager type="[ JDBC | MANAGED ]"/>int addBlog(Blog blog);
复制代码
sql配置文件<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>  insert into blog (id, title, author, create_time, views)<br><transactionManager type="[ JDBC | MANAGED ]"/>  values (#{id},#{title},#{author},#{createTime},#{views});<br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
初始化博客方法<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>public void addInitBlog(){<br><transactionManager type="[ JDBC | MANAGED ]"/>   SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>   BlogMapper mapper = session.getMapper(BlogMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   Blog blog = new Blog();<br><transactionManager type="[ JDBC | MANAGED ]"/>   blog.setId(IDUtil.genId());<br><transactionManager type="[ JDBC | MANAGED ]"/>   blog.setTitle("Mybatis如此简朴");<br><transactionManager type="[ JDBC | MANAGED ]"/>   blog.setAuthor("狂神说");<br><transactionManager type="[ JDBC | MANAGED ]"/>   blog.setCreateTime(new Date());<br><transactionManager type="[ JDBC | MANAGED ]"/>   blog.setViews(9999);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   mapper.addBlog(blog);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   blog.setId(IDUtil.genId());<br><transactionManager type="[ JDBC | MANAGED ]"/>   blog.setTitle("Java如此简朴");<br><transactionManager type="[ JDBC | MANAGED ]"/>   mapper.addBlog(blog);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   blog.setId(IDUtil.genId());<br><transactionManager type="[ JDBC | MANAGED ]"/>   blog.setTitle("Spring如此简朴");<br><transactionManager type="[ JDBC | MANAGED ]"/>   mapper.addBlog(blog);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   blog.setId(IDUtil.genId());<br><transactionManager type="[ JDBC | MANAGED ]"/>   blog.setTitle("微服务如此简朴");<br><transactionManager type="[ JDBC | MANAGED ]"/>   mapper.addBlog(blog);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
初始化数据完毕!<br><transactionManager type="[ JDBC | MANAGED ]"/>10.1、if 语句<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>需求:根据作者名字和博客名字来查询博客!如果作者名字为空,那么只根据博客名字查询,反之,则根据作者名来查询<br><transactionManager type="[ JDBC | MANAGED ]"/>1、编写接口类<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. //动态sql<br><transactionManager type="[ JDBC | MANAGED ]"/>List selectBlogByIf(Map map);
复制代码
2、编写SQL语句<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1.         <br><transactionManager type="[ JDBC | MANAGED ]"/>        select * from blog where 1=1<br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>            and title = #{title}<br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>            and author = #{author}<br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>   
复制代码
3、测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>    public void testQueryBlogIf(){<br><transactionManager type="[ JDBC | MANAGED ]"/>        SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>        BlogMapper mapper = session.getMapper(BlogMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/>        HashMap map = new HashMap();<br><transactionManager type="[ JDBC | MANAGED ]"/>//        map.put("title","Mybatis如此简朴");<br><transactionManager type="[ JDBC | MANAGED ]"/>        map.put("author","狂神说");<br><transactionManager type="[ JDBC | MANAGED ]"/>        List blogs = mapper.selectBlogByIf(map);<br><transactionManager type="[ JDBC | MANAGED ]"/>        for (Blog blog : blogs) {<br><transactionManager type="[ JDBC | MANAGED ]"/>            System.out.println(blog);<br><transactionManager type="[ JDBC | MANAGED ]"/>        }<br><transactionManager type="[ JDBC | MANAGED ]"/>        session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>    }
复制代码
如许写我们可以看到,如果 author 即是 null,那么查询语句为 select * from user where title=#{title},但是如果title为空呢?那么查询语句为 select * from user where and author=#{author},这是错误的 SQL 语句,怎样解决呢?请看下面的 where 语句!<br><transactionManager type="[ JDBC | MANAGED ]"/>10.2、where语句<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>修改上面的SQL语句;<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1.         <br><transactionManager type="[ JDBC | MANAGED ]"/>        select * from blog<br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>            <br><transactionManager type="[ JDBC | MANAGED ]"/>                title = #{title}<br><transactionManager type="[ JDBC | MANAGED ]"/>            <br><transactionManager type="[ JDBC | MANAGED ]"/>            <br><transactionManager type="[ JDBC | MANAGED ]"/>                and author = #{author}<br><transactionManager type="[ JDBC | MANAGED ]"/>            <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>   
复制代码
这个“where”标签会知道如果它包罗的标签中有返回值的话,它就插入一个‘where’。别的,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。<br><transactionManager type="[ JDBC | MANAGED ]"/>10.3、set语句<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>同理,上面的对于查询 SQL 语句包罗 where 关键字,如果在进行更新操纵的时候,含有 set 关键词,我们怎么处理呢?<br><transactionManager type="[ JDBC | MANAGED ]"/>1、编写接口方法<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. int updateBlog(Map map);
复制代码
2、sql配置文件<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>  update blog<br><transactionManager type="[ JDBC | MANAGED ]"/>     <br><transactionManager type="[ JDBC | MANAGED ]"/>         <br><transactionManager type="[ JDBC | MANAGED ]"/>            title = #{title},<br><transactionManager type="[ JDBC | MANAGED ]"/>         <br><transactionManager type="[ JDBC | MANAGED ]"/>         <br><transactionManager type="[ JDBC | MANAGED ]"/>            author = #{author}<br><transactionManager type="[ JDBC | MANAGED ]"/>         <br><transactionManager type="[ JDBC | MANAGED ]"/>     <br><transactionManager type="[ JDBC | MANAGED ]"/>  where id = #{id};<br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
3、测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>    public void testQueryBlogSet(){<br><transactionManager type="[ JDBC | MANAGED ]"/>        SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>        BlogMapper mapper = session.getMapper(BlogMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/>        HashMap map = new HashMap();<br><transactionManager type="[ JDBC | MANAGED ]"/>        map.put("title","学习如此简朴");<br><transactionManager type="[ JDBC | MANAGED ]"/>        map.put("author","英杰");<br><transactionManager type="[ JDBC | MANAGED ]"/>        map.put("id","03e6c34b8b98496f8770e649e8cbbb3e");<br><transactionManager type="[ JDBC | MANAGED ]"/>        mapper.updateBlog(map);<br><transactionManager type="[ JDBC | MANAGED ]"/>        session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>    }
复制代码
10.4、choose语句<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>偶然候,我们不想用到所有的查询条件,只想选择此中的一个,查询条件有一个满足即可,使用 choose 标签可以解决此类题目,类似于 Java 的 switch 语句<br><transactionManager type="[ JDBC | MANAGED ]"/>1、编写接口方法<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. //动态sql_choose<br><transactionManager type="[ JDBC | MANAGED ]"/>    List selectBlogByChoose(Map map);
复制代码
2、sql配置文件<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>        select * from blog<br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>            <br><transactionManager type="[ JDBC | MANAGED ]"/>                <br><transactionManager type="[ JDBC | MANAGED ]"/>                    title = #{title}<br><transactionManager type="[ JDBC | MANAGED ]"/>                <br><transactionManager type="[ JDBC | MANAGED ]"/>                <br><transactionManager type="[ JDBC | MANAGED ]"/>                    and author = #{author}<br><transactionManager type="[ JDBC | MANAGED ]"/>                <br><transactionManager type="[ JDBC | MANAGED ]"/>                <br><transactionManager type="[ JDBC | MANAGED ]"/>                    views = #{views}<br><transactionManager type="[ JDBC | MANAGED ]"/>                <br><transactionManager type="[ JDBC | MANAGED ]"/>            <br><transactionManager type="[ JDBC | MANAGED ]"/>        <br><transactionManager type="[ JDBC | MANAGED ]"/>   
复制代码
3、测试类<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>    public void testQueryBlogChoose(){<br><transactionManager type="[ JDBC | MANAGED ]"/>        SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>        BlogMapper mapper = session.getMapper(BlogMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/>        HashMap map = new HashMap();<br><transactionManager type="[ JDBC | MANAGED ]"/>        map.put("title","学习如此简朴");<br><transactionManager type="[ JDBC | MANAGED ]"/>        map.put("author","狂神说");<br><transactionManager type="[ JDBC | MANAGED ]"/>        map.put("views","9999");<br><transactionManager type="[ JDBC | MANAGED ]"/>        List blogs = mapper.selectBlogByChoose(map);<br><transactionManager type="[ JDBC | MANAGED ]"/>        for (Blog blog : blogs) {<br><transactionManager type="[ JDBC | MANAGED ]"/>            System.out.println(blog);<br><transactionManager type="[ JDBC | MANAGED ]"/>        }<br><transactionManager type="[ JDBC | MANAGED ]"/>        session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>    }   
复制代码
10.5、SQL片断<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>偶然候可能某个 sql 语句我们用的特别多,为了增加代码的重用性,简化代码,我们必要将这些代码抽取出来,然后使用时直接调用。<br><transactionManager type="[ JDBC | MANAGED ]"/>提取SQL片断:<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>      title = #{title}<br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>      and author = #{author}<br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
引用SQL片断:<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>  select * from blog<br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>       <br><transactionManager type="[ JDBC | MANAGED ]"/>       <br><transactionManager type="[ JDBC | MANAGED ]"/>       <br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
注意:<br><transactionManager type="[ JDBC | MANAGED ]"/>10.6、Foreach<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>将数据库中前三个数据的id修改为1,2,3;<br><transactionManager type="[ JDBC | MANAGED ]"/>需求:我们必要查询 blog 表中 id 分别为1,2,3的博客信息<br><transactionManager type="[ JDBC | MANAGED ]"/>1、编写接口<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. List<Blog> queryBlogForeach(Map map);
复制代码
2、编写SQL语句<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>  select * from blog<br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>       <br><transactionManager type="[ JDBC | MANAGED ]"/>       <br><transactionManager type="[ JDBC | MANAGED ]"/>          id=#{id}<br><transactionManager type="[ JDBC | MANAGED ]"/>       <br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
3、测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>public void testQueryBlogForeach(){<br><transactionManager type="[ JDBC | MANAGED ]"/>   SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>   BlogMapper mapper = session.getMapper(BlogMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   HashMap map = new HashMap();<br><transactionManager type="[ JDBC | MANAGED ]"/>   List ids = new ArrayList();<br><transactionManager type="[ JDBC | MANAGED ]"/>   ids.add(1);<br><transactionManager type="[ JDBC | MANAGED ]"/>   ids.add(2);<br><transactionManager type="[ JDBC | MANAGED ]"/>   ids.add(3);<br><transactionManager type="[ JDBC | MANAGED ]"/>   map.put("ids",ids);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   List blogs = mapper.queryBlogForeach(map);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(blogs);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
小结:其实动态 sql 语句的编写往往就是一个拼接的题目,为了包管拼接准确,我们最好首先要写原生的 sql 语句出来,然后在通过 mybatis 动态sql 对照着改,防止堕落。多在实践中使用才是纯熟掌握它的本领。<br><transactionManager type="[ JDBC | MANAGED ]"/>动态SQL在开发中大量的使用,肯定要纯熟掌握!<br><transactionManager type="[ JDBC | MANAGED ]"/>11、缓存<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>11.1、什么是缓存<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>1、什么是缓存 [ Cache ]?<br><transactionManager type="[ JDBC | MANAGED ]"/>2、为什么使用缓存?<br><transactionManager type="[ JDBC | MANAGED ]"/>3、什么样的数据能使用缓存?<br><transactionManager type="[ JDBC | MANAGED ]"/>11.2、Mybatis缓存<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>11.3、一级缓存<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>一级缓存也叫当地缓存:<br><transactionManager type="[ JDBC | MANAGED ]"/>
测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
1、在mybatis中加入日记,方便测试结果<br><transactionManager type="[ JDBC | MANAGED ]"/>2、编写接口方法<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. //根据id查询用户<br><transactionManager type="[ JDBC | MANAGED ]"/>User queryUserById(@Param("id") int id);
复制代码
3、接口对应的Mapper文件<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>  select * from user where id = #{id}<br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
4、测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>public void testQueryUserById(){<br><transactionManager type="[ JDBC | MANAGED ]"/>   SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>   UserMapper mapper = session.getMapper(UserMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   User user = mapper.queryUserById(1);<br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(user);<br><transactionManager type="[ JDBC | MANAGED ]"/>   User user2 = mapper.queryUserById(1);<br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(user2);<br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(user==user2);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
5、结果分析<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>
一级缓存失效的四种情况<br><transactionManager type="[ JDBC | MANAGED ]"/>
一级缓存是SqlSession级别的缓存,是一直开启的,我们关闭不了它;<br><transactionManager type="[ JDBC | MANAGED ]"/>一级缓存失效情况:没有使用到当前的一级缓存,效果就是,还必要再向数据库中发起一次查询请求!<br><transactionManager type="[ JDBC | MANAGED ]"/>1、sqlSession差异<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>public void testQueryUserById(){<br><transactionManager type="[ JDBC | MANAGED ]"/>   SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>   SqlSession session2 = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>   UserMapper mapper = session.getMapper(UserMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/>   UserMapper mapper2 = session2.getMapper(UserMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   User user = mapper.queryUserById(1);<br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(user);<br><transactionManager type="[ JDBC | MANAGED ]"/>   User user2 = mapper2.queryUserById(1);<br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(user2);<br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(user==user2);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>   session2.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
观察结果:发现发送了两条SQL语句!<br><transactionManager type="[ JDBC | MANAGED ]"/>结论:每个sqlSession中的缓存相互独立<br><transactionManager type="[ JDBC | MANAGED ]"/>2、sqlSession相同,查询条件差异<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>public void testQueryUserById(){<br><transactionManager type="[ JDBC | MANAGED ]"/>   SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>   UserMapper mapper = session.getMapper(UserMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/>   UserMapper mapper2 = session.getMapper(UserMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   User user = mapper.queryUserById(1);<br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(user);<br><transactionManager type="[ JDBC | MANAGED ]"/>   User user2 = mapper2.queryUserById(2);<br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(user2);<br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(user==user2);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
观察结果:发现发送了两条SQL语句!很正常的理解<br><transactionManager type="[ JDBC | MANAGED ]"/>结论:当前缓存中,不存在这个数据<br><transactionManager type="[ JDBC | MANAGED ]"/>3、sqlSession相同,两次查询之间执行了增删改操纵!<br><transactionManager type="[ JDBC | MANAGED ]"/>增加方法<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. //修改用户<br><transactionManager type="[ JDBC | MANAGED ]"/>int updateUser(Map map);
复制代码
编写SQL<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>  update user set name = #{name} where id = #{id}<br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>public void testQueryUserById(){<br><transactionManager type="[ JDBC | MANAGED ]"/>   SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>   UserMapper mapper = session.getMapper(UserMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   User user = mapper.queryUserById(1);<br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(user);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   HashMap map = new HashMap();<br><transactionManager type="[ JDBC | MANAGED ]"/>   map.put("name","kuangshen");<br><transactionManager type="[ JDBC | MANAGED ]"/>   map.put("id",4);<br><transactionManager type="[ JDBC | MANAGED ]"/>   mapper.updateUser(map);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   User user2 = mapper.queryUserById(1);<br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(user2);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(user==user2);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
观察结果:查询在中间执行了增删改操纵后,重新执行了<br><transactionManager type="[ JDBC | MANAGED ]"/>结论:由于增删改操纵可能会对当前数据产生影响<br><transactionManager type="[ JDBC | MANAGED ]"/>4、sqlSession相同,手动清除一级缓存<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>public void testQueryUserById(){<br><transactionManager type="[ JDBC | MANAGED ]"/>   SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>   UserMapper mapper = session.getMapper(UserMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   User user = mapper.queryUserById(1);<br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(user);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   session.clearCache();//手动清除缓存<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   User user2 = mapper.queryUserById(1);<br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(user2);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(user==user2);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
一级缓存就是一个map<br><transactionManager type="[ JDBC | MANAGED ]"/>11.4、二级缓存<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
二级缓存<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>
使用步调<br><transactionManager type="[ JDBC | MANAGED ]"/>
1、开启全局缓存 【mybatis-config.xml】<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
2、去每个mapper.xml中配置使用二级缓存,这个配置非常简朴,添加即可;【xxxMapper.xml】<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. [/code]3、代码测试<br><transactionManager type="[ JDBC | MANAGED ]"/>[list]<br><transactionManager type="[ JDBC | MANAGED ]"/>[*]所有的实体类先实现序列化接口<br><transactionManager type="[ JDBC | MANAGED ]"/>[/list][code]public class User implements Serializable {<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>    private int id;  //id<br><transactionManager type="[ JDBC | MANAGED ]"/>    private String name;   //姓名<br><transactionManager type="[ JDBC | MANAGED ]"/>    private String password;   //密码
复制代码
<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. @Test<br><transactionManager type="[ JDBC | MANAGED ]"/>public void testQueryUserById(){<br><transactionManager type="[ JDBC | MANAGED ]"/>   SqlSession session = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/>   SqlSession session2 = MybatisUtils.getSession();<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   UserMapper mapper = session.getMapper(UserMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/>   UserMapper mapper2 = session2.getMapper(UserMapper.class);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   User user = mapper.queryUserById(1);<br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(user);<br><transactionManager type="[ JDBC | MANAGED ]"/>   session.close();<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   User user2 = mapper2.queryUserById(1);<br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(user2);<br><transactionManager type="[ JDBC | MANAGED ]"/>   System.out.println(user==user2);<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   session2.close();<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码
结论<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>
缓存原理图<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>
EhCache<br><transactionManager type="[ JDBC | MANAGED ]"/>
第三方缓存实现--EhCache: 查看百度百科<br><transactionManager type="[ JDBC | MANAGED ]"/>Ehcache是一种广泛使用的java分布式缓存,用于通用缓存;<br><transactionManager type="[ JDBC | MANAGED ]"/>要在应用程序中使用Ehcache,必要引入依赖的jar包<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   org.mybatis.caches<br><transactionManager type="[ JDBC | MANAGED ]"/>   mybatis-ehcache<br><transactionManager type="[ JDBC | MANAGED ]"/>   1.1.0<br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
在mapper.xml中使用对应的缓存即可<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
编写ehcache.xml文件,如果在加载时未找到/ehcache.xml资源或出现题目,则将使用默认配置。<br><transactionManager type="[ JDBC | MANAGED ]"/>
  1. <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/>   <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码
合理的使用缓存,可以让我们程序的性能大大提升!<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4