前言:共同狂神老师的教学视频使用效果更佳:<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 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 ]"/>- jdk 8 +<br><transactionManager type="[ JDBC | MANAGED ]"/>
- MySQL 5.7.19<br><transactionManager type="[ JDBC | MANAGED ]"/>
- maven-3.6.1<br><transactionManager type="[ JDBC | MANAGED ]"/>
- IDEA<br><transactionManager type="[ JDBC | MANAGED ]"/>
学习前必要掌握:<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- JDBC<br><transactionManager type="[ JDBC | MANAGED ]"/>
- MySQL<br><transactionManager type="[ JDBC | MANAGED ]"/>
- Java 底子<br><transactionManager type="[ JDBC | MANAGED ]"/>
- Maven<br><transactionManager type="[ JDBC | MANAGED ]"/>
- Junit<br><transactionManager type="[ JDBC | MANAGED ]"/>
1.1、什么是MyBatis<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- MyBatis 是一款优秀的持久层框架<br><transactionManager type="[ JDBC | MANAGED ]"/>
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程<br><transactionManager type="[ JDBC | MANAGED ]"/>
- MyBatis 可以使用简朴的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类 【Plain Old Java Objects,平凡的 Java对象】映射成数据库中的记录。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- MyBatis 本是apache的一个开源项目ibatis, 2010年这个项目由apache 迁移到了google code,并且改名为MyBatis 。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 2013年11月迁移到Github<br><transactionManager type="[ JDBC | MANAGED ]"/>
- Maven仓库<br><transactionManager type="[ JDBC | MANAGED ]"/>
- <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 ]"/>- 即把数据(如内存中的对象)保存到可永世保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- JDBC就是一种持久化机制。文件IO也是一种持久化机制。<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 ]"/>
- 内存过于昂贵,与硬盘、光盘等外存相比,内存的代价要高2~3个数目级,而且维持成本也高,至少必要一直供电吧。所以即使对象不必要永世保存,也会由于内存的容量限制不能一直呆在内存中,必要持久化来缓存到外存。<br><transactionManager type="[ JDBC | MANAGED ]"/>
1.3、持久层<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>什么是持久层?<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 完成持久化工作的代码块 . ----> dao层 【DAO (Data Access Object) 数据访问对象】<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 大多数情况下特别是企业级应用,数据持久化往往也就意味着将内存中的数据保存到磁盘上加以固化,而持久化的实现过程则大多通过各种关系数据库来完成。<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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- Mybatis就是帮助程序猿将数据存入数据库中 , 和从数据库中取数据 .<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 传统的jdbc操纵 , 有很多重复代码块 .比如 : 数据取出时的封装 , 数据库的创建毗连等等... , 通过框架可以减少重复代码,提高开发效率 .<br><transactionManager type="[ JDBC | MANAGED ]"/>
- MyBatis 是一个半主动化的ORM框架 (Object Relationship Mapping) -->对象关系映射<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 所有的事情,不用Mybatis依旧可以做到,只是用了它,所有实现会更加简朴!技术没有高低之分,只有使用这个技术的人有高低之别<br><transactionManager type="[ JDBC | MANAGED ]"/>
- MyBatis的优点<br><transactionManager type="[ JDBC | MANAGED ]"/>
- <br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>- 简朴易学:本身就很小且简朴。没有任何第三方依赖,最简朴安装只要两个jar文件+配置几个sql映射文件就可以了,易于学习,易于使用,通过文档和源代码,可以比力完全的掌握它的设计思路和实现。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。sql写在xml里,便于统一管理和优化。通过sql语句可以满足操纵数据库的所有需求。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 排除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 提供xml标签,支持编写动态sql。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- .......<br><transactionManager type="[ JDBC | MANAGED ]"/>
<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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 1、搭建实验数据库<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 2、导入MyBatis相关 jar 包<br><transactionManager type="[ JDBC | MANAGED ]"/>
- <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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 3、编写MyBatis核心配置文件<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>- 查看帮助文档<br><transactionManager type="[ JDBC | MANAGED ]"/>
- <?xml version="1.0" encoding="UTF-8" ?><br><!DOCTYPE configuration<br> PUBLIC "-//mybatis.org//DTD Config 3.0//EN"<br> "https://mybatis.org/dtd/mybatis-3-config.dtd"><br><configuration><br> <environments default="development"><br> <environment id="development"><br> <transactionManager type="JDBC"/><br> <dataSource type="POOLED"><br> <property name="driver" value="com.mysql.jdbc.Driver"/><br> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"/><br> <property name="username" value="root"/><br> <property name="password" value="417020"/><br> </dataSource><br> </environment><br> </environments><br> <mappers><br> <mapper resource="org/mybatis/example/BlogMapper.xml"/><br> </mappers><br></configuration>
复制代码 <br><transactionManager type="[ JDBC | MANAGED ]"/> - 4、编写MyBatis工具类<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>- 查看帮助文档<br><transactionManager type="[ JDBC | MANAGED ]"/>
- package com.cherriesovo.utils;<br><br>import org.apache.ibatis.io.Resources;<br>import org.apache.ibatis.session.SqlSession;<br>import org.apache.ibatis.session.SqlSessionFactory;<br>import org.apache.ibatis.session.SqlSessionFactoryBuilder;<br>import java.io.IOException;<br>import java.io.InputStream;<br><br>public class MybatisUtils {<br><br> private static SqlSessionFactory sqlSessionFactory;<br><br> static {<br> try {<br> //第一步:获取sqlSessionFactory对象<br> String resource = "mybatis-config.xml";<br> InputStream inputStream = Resources.getResourceAsStream(resource);<br> sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);<br> } catch (IOException e) {<br> e.printStackTrace();<br> }<br> }<br><br> //从sqlSessionFactory中获取SqlSession实例<br> public static SqlSession getSession(){<br> return sqlSessionFactory.openSession();<br> }<br><br>}
复制代码 <br><transactionManager type="[ JDBC | MANAGED ]"/> - 5、创建实体类<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 6、编写Mapper接口类<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 7、编写Mapper.xml配置文件<br><transactionManager type="[ JDBC | MANAGED ]"/>
namespace 十分重要,不能写错,一个namespace绑定一个Dao/Mapper接口!<br><transactionManager type="[ JDBC | MANAGED ]"/>- <?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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 8、编写测试类<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>- Junit 包测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/> - 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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 9、运行测试,乐成的查询出来的我们的数据,ok!<br><transactionManager type="[ JDBC | MANAGED ]"/>
可能出现的题目:Maven静态资源过滤题目<br><transactionManager type="[ JDBC | MANAGED ]"/> 解决方案:在pom.xml中添加:<br><transactionManager type="[ JDBC | MANAGED ]"/>- <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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 先进性准备工作:MybatisUtils工具类、Mybatis-config.xml配置文件<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 编写实体类,接口,然后编写Mapper.xml配置文件(namespace绑定接口,里面的标签绑定方法,resultType是返回值类型)<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 编写测试类<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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 在UserMapper中添加对应方法<br><transactionManager type="[ JDBC | MANAGED ]"/>
- public interface UserMapper {<br> //查询指定id的用户<br> User selectUserbyID(int id);<br>}
复制代码 <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 在UserMapper.xml中添加Select语句<br><transactionManager type="[ JDBC | MANAGED ]"/>
- <?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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 测试类中测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
- @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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- UserMapper中添加对应方法<br><transactionManager type="[ JDBC | MANAGED ]"/>
- public interface UserMapper {<br> //插入用户<br> int addUser(User user);<br>}
复制代码 <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 在UserMapper.xml中添加insert语句<br><transactionManager type="[ JDBC | MANAGED ]"/>
- <?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 ]"/>- 测试类中测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
注意:增删改必须提交事务,否则无法乐成<br><transactionManager type="[ JDBC | MANAGED ]"/> - @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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- UserMapper中添加对应方法<br><transactionManager type="[ JDBC | MANAGED ]"/>
- public interface UserMapper {<br> //修改用户<br> int updateUser(User user);<br>}
复制代码 <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 在UserMapper.xml中添加update语句<br><transactionManager type="[ JDBC | MANAGED ]"/>
- <?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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 测试类中测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
- @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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- UserMapper中添加对应方法<br><transactionManager type="[ JDBC | MANAGED ]"/>
- public interface UserMapper {<br> //删除用户<br> int deleteUser(int id);<br>}
复制代码 <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 在UserMapper.xml中添加delete语句<br><transactionManager type="[ JDBC | MANAGED ]"/>
- <?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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 测试类中测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
- @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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 所有的增删改操纵都必要提交事务!<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 接口所有的平凡参数,尽量都写上@Param参数,尤其是多个参数时,必须写上!<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 偶然候根据业务的需求,可以考虑使用map传递参数!<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 为了规范操纵,在SQL的配置文件中,我们尽量将Parameter参数和resultType都写上!<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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- UserMapper中添加对应方法<br><transactionManager type="[ JDBC | MANAGED ]"/>
- public interface UserMapper {<br> //修改用户(使用map实现)<br> int updateUserbyMap(Map<String,Object> map);<br>}
复制代码 <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 在UserMapper.xml中添加delete语句<br><transactionManager type="[ JDBC | MANAGED ]"/>
- <?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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 测试类中测试<br><transactionManager type="[ JDBC | MANAGED ]"/>
- @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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- new一个对象必要知道所有的字段,而Map只必要知道所用的字段即可;<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 对象使用时配置文件中字段名必须和数据库一一对应,而Map可以恣意;<br><transactionManager type="[ JDBC | MANAGED ]"/>
- <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 ]"/>- <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 ]"/>- <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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- mybatis-config.xml 系统核心配置文件<br><transactionManager type="[ JDBC | MANAGED ]"/>
- MyBatis 的配置文件包罗了会深深影响 MyBatis 行为的设置和属性信息。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 能配置的内容如下:<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 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 ]"/>- <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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 配置MyBatis的多套运行环境,将SQL映射到多个差异的数据库上,必须指定此中一个为默认运行环境(通过default指定)<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 子元素节点:environment<br><transactionManager type="[ JDBC | MANAGED ]"/>
- <br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>- dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 毗连对象的资源。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 数据源是必须配置的。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 有三种内建的数据源类型<br><transactionManager type="[ JDBC | MANAGED ]"/>
- type="[UNPOOLED|POOLED|JNDI]")
复制代码 <br><transactionManager type="[ JDBC | MANAGED ]"/> - unpooled:这个数据源的实现只是每次被请求时打开和关闭毗连。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- pooled:这种数据源的实现利用“池”的概念将 JDBC 毗连对象构造起来 , 这是一种使得并发 Web 应用快速相应请求的盛行处理方式。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- jndi:这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 数据源也有很多第三方的实现,比如dbcp,c3p0,druid等等....<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 详情:点击查看官方文档<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 这两种事务管理器类型都不必要设置任何属性。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 详细的一套环境,通过设置id进行区别,id包管唯一!<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 子元素节点:transactionManager - [ 事务管理器 ]<br><transactionManager type="[ JDBC | MANAGED ]"/>
- <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码 <br><transactionManager type="[ JDBC | MANAGED ]"/> - 子元素节点:数据源(dataSource)<br><transactionManager type="[ JDBC | MANAGED ]"/>
<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 ]"/>- 映射器 : 定义映射SQL语句文件<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 既然 MyBatis 的行为其他元素已经配置完了,我们现在就要定义 SQL 映射语句了。但是首先我们必要告诉 MyBatis 到哪里去找到这些语句。Java 在主动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等。映射器是MyBatis中最核心的组件之一,在MyBatis 3之前,只支持xml映射器,即:所有的SQL语句都必须在xml文件中配置。而从MyBatis 3开始,还支持接口映射器,这种映射器方式允许以Java代码的方式注解定义SQL语句,非常简洁。<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 ]"/>
复制代码 Mapper文件<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 ]"/>- namespace中文意思:定名空间,作用如下:<br><transactionManager type="[ JDBC | MANAGED ]"/>
- <br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>- namespace的定名必须跟某个接口同名<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 接口中的方法与映射文件中sql语句id应该一一对应<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/>- namespace和子元素的id联合包管唯一, 区别差异的mapper<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 绑定DAO接口<br><transactionManager type="[ JDBC | MANAGED ]"/>
- namespace定名规则 : 包名+类名<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 ]"/>- 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 ]"/>- <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 ]"/>- <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 ]"/>- <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 ]"/>- //方式三<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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 设置(settings)相关 => 查看帮助文档<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 ]"/> - 一个配置完备的 settings 元素的示例如下:<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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以符合的方式转换成 Java 类型。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 你可以重写类型处理器或创建你本身的类型处理器来处理不支持的或非标准的类型。【了解即可】<br><transactionManager type="[ JDBC | MANAGED ]"/>
对象工厂<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。<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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- SqlSessionFactoryBuilder 的作用在于创建 SqlSessionFactory,创建乐成后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建 SqlSessionFactory 的方法中,而不要让其恒久存在。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- SqlSessionFactory 可以被认为是一个数据库毗连池,它的作用是创建 SqlSession 接口对象。由于 MyBatis 的本质就是 Java 对数据库的操纵,所以 SqlSessionFactory 的生命周期存在于整个 MyBatis 的应用之中,所以一旦创建了 SqlSessionFactory,就要恒久保存它,直至不再使用 MyBatis 应用,所以可以认为 SqlSessionFactory 的生命周期就等同于 MyBatis 的应用周期。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 由于 SqlSessionFactory 是一个对数据库的毗连池,所以它占据着数据库的毗连资源。如果创建多个 SqlSessionFactory,那么就存在多个数据库毗连池,如许不利于对数据库资源的控制,也会导致数据库毗连资源被斲丧光,出现系统宕机等情况,所以尽量避免发生如许的情况。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 因此在一般的应用中我们往往盼望 SqlSessionFactory 作为一个单例(只存在一个),让它在应用中被共享。所以说 SqlSessionFactory 的最佳作用域是应用作用域,就是说应用开始他就开始,应用结束他才结束。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 如果说 SqlSessionFactory 相当于数据库毗连池,那么 SqlSession 就相当于一个数据库毗连(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完备个请求后,应该关闭这条毗连,让它归还给 SqlSessionFactory,否则数据库资源就很快被泯灭精光,系统就会瘫痪,所以用 try...catch...finally... 语句来包管其准确关闭。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 所以 SqlSession 的最佳的作用域是请求或方法作用域。<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 ]"/>- 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 ]"/>- public interface UserMapper {<br> //查询指定id的用户<br> User selectUserbyID(int id);<br>}
复制代码 4、mapper映射文件<br><transactionManager type="[ JDBC | MANAGED ]"/>- <br><transactionManager type="[ JDBC | MANAGED ]"/> select * from user where id = #{id}<br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码 5、测试<br><transactionManager type="[ JDBC | MANAGED ]"/>- @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 ]"/>- User{id=1, name='英杰', password='null'}<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 查询出来发现 password 为空 . 阐明出现了题目!<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 ]"/>select id,name,pwd from user where id = #{id}<br><transactionManager type="[ JDBC | MANAGED ]"/>
- mybatis会根据这些查询的列名(会将列名转化为小写,数据库不区分巨细写) , 去对应的实体类中查找相应列名的set方法设值 , 由于找不到setPwd() , 所以password返回null ; 【主动映射】<br><transactionManager type="[ JDBC | MANAGED ]"/>
解决方案<br><transactionManager type="[ JDBC | MANAGED ]"/> 方案一:为列名指定别名 , 别名和java实体类的属性名一致;<br><transactionManager type="[ JDBC | MANAGED ]"/>- <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 ]"/>- <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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 实际上,在为一些比如毗连的复杂语句编写映射代码的时候,一份 resultMap 能够取代实现同等功能的长达数千行的代码。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- ResultMap 的设计思想是,对于简朴的语句根本不必要配置显式的结果映射,而对于复杂一点的语句只必要描述它们的关系就行了。<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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- SLF4J<br><transactionManager type="[ JDBC | MANAGED ]"/>
- Apache Commons Logging<br><transactionManager type="[ JDBC | MANAGED ]"/>
- Log4j 2<br><transactionManager type="[ JDBC | MANAGED ]"/>
- Log4j<br><transactionManager type="[ JDBC | MANAGED ]"/>
- JDK logging<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 ]"/>- <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 ]"/>- Log4j是Apache的一个开源项目<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 通过使用Log4j,我们可以控制日记信息输送的目的地:控制台,文本,GUI组件....<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 ]"/>- <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 ]"/>- #将等级为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 ]"/>- <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码 4、在程序中使用Log4j进行输出!<br><transactionManager type="[ JDBC | MANAGED ]"/>- //注意导包: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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 使用Log4j 输出日记<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 可以看到还生成了一个日记的文件 【必要修改file的日记级别】<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 ]"/>- #语法<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 ]"/>- 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 ]"/>- <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 ]"/>- @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 ]"/>- //选择全部用户RowBounds实现分页<br><transactionManager type="[ JDBC | MANAGED ]"/>List getUserByRowBounds();
复制代码 2、mapper文件<br><transactionManager type="[ JDBC | MANAGED ]"/>- <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 ]"/>- @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 ]"/><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.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 ]"/>- 第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class);<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface);<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 ]"/>
8.2、利用注解开发<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- mybatis最初配置信息是基于 XML ,映射语句(SQL)也是定义在 XML 中的。而到MyBatis 3提供了新的基于注解的配置。不幸的是,Java 注解的的表达力和灵活性十分有限。最强大的 MyBatis 映射并不能用注解来构建。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- sql 类型主要分成 :<br><transactionManager type="[ JDBC | MANAGED ]"/>
- <br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>- @select ()<br><transactionManager type="[ JDBC | MANAGED ]"/>
- @update ()<br><transactionManager type="[ JDBC | MANAGED ]"/>
- @Insert ()<br><transactionManager type="[ JDBC | MANAGED ]"/>
- @delete ()<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/> 注意:利用注解开发就不必要mapper.xml映射文件了 .<br><transactionManager type="[ JDBC | MANAGED ]"/> 1、我们在我们的接口中添加注解<br><transactionManager type="[ JDBC | MANAGED ]"/>- 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 ]"/>- <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码 3、我们去进行测试<br><transactionManager type="[ JDBC | MANAGED ]"/>- 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 ]"/>- 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 ]"/>- //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 ]"/>- @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 ]"/>- //添加用户<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 ]"/>- @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 ]"/>- //修改用户<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 ]"/>- @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 ]"/>- //删除用户<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 ]"/>- @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 ]"/>- 在方法只接受一个参数的情况下,可以不使用@Param。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 在方法接受多个参数的情况下,建议肯定要使用@Param注解给参数定名。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 如果参数是 JavaBean , 则不能使用@Param。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 不使用@Param注解时,参数只能有一个,并且是Javabean。<br><transactionManager type="[ JDBC | MANAGED ]"/>
#与$的区别<br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- #{} 的作用主要是替换预编译语句(PrepareStatement)中的占位符?,可以肯定程度防止sql注入 【保举使用】<br><transactionManager type="[ JDBC | MANAGED ]"/>
- INSERT INTO user (name) VALUES (#{name});<br><transactionManager type="[ JDBC | MANAGED ]"/>INSERT INTO user (name) VALUES (?);
复制代码 <br><transactionManager type="[ JDBC | MANAGED ]"/> - ${} 的作用是直接进行字符串替换<br><transactionManager type="[ JDBC | MANAGED ]"/>
- INSERT INTO user (name) VALUES ('${name}');<br><transactionManager type="[ JDBC | MANAGED ]"/>INSERT INTO user (name) VALUES ('kuangshen');
复制代码 <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 ]"/>- 多个门生对应一个老师<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 如果对于门生这边,就是一个多对一的征象,即从门生这边关联一个老师!<br><transactionManager type="[ JDBC | MANAGED ]"/>
数据库设计<br><transactionManager type="[ JDBC | MANAGED ]"/> - 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 ]"/>- <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 ]"/>- @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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 无论有没有需求,都应该写上,以备后来之需!<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 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 ]"/><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 ]"/> 1、给StudentMapper接口增加方法<br><transactionManager type="[ JDBC | MANAGED ]"/>- public interface StudentMapper {<br><transactionManager type="[ JDBC | MANAGED ]"/> List getStudents();<br><transactionManager type="[ JDBC | MANAGED ]"/>}
复制代码 2、编写对应的Mapper文件(Mapper文件肯定要先在核心配置文件中注册)<br><transactionManager type="[ JDBC | MANAGED ]"/>- <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 ]"/>- <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 ]"/>- @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 ]"/>- List<Student> getStudents2();
复制代码 2、编写对应的mapper文件<br><transactionManager type="[ JDBC | MANAGED ]"/>- <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 ]"/>- @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 ]"/>- 一个老师拥有多个门生<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 如果对于老师这边,就是一个一对多的征象,即从一个老师下面拥有一群门生(集合)!<br><transactionManager type="[ JDBC | MANAGED ]"/>
实体类编写<br><transactionManager type="[ JDBC | MANAGED ]"/> - @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 ]"/>}
复制代码- @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 ]"/>- 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 ]"/>- <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 ]"/>- <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码 4、测试<br><transactionManager type="[ JDBC | MANAGED ]"/>- @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 ]"/>- public Teacher getTeacher2(int id);
复制代码 2、编写接口对应的Mapper配置文件<br><transactionManager type="[ JDBC | MANAGED ]"/>- <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 ]"/>- @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 ]"/>- JavaType是用来指定pojo中属性的类型<br><transactionManager type="[ JDBC | MANAGED ]"/>
- ofType指定的是映射到list集合属性中pojo的类型。<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 ]"/>- 官网描述:<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 ]"/>- 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 ]"/>- 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 ]"/>- @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 ]"/>- public interface BlogMapper {<br><transactionManager type="[ JDBC | MANAGED ]"/> //新增一个博客<br><transactionManager type="[ JDBC | MANAGED ]"/> int addBlog(Blog 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 ]"/>
复制代码 5、mybatis核心配置文件,下划线驼峰主动转换<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 ]"/>
复制代码 6、插入初始数据<br><transactionManager type="[ JDBC | MANAGED ]"/>编写接口<br><transactionManager type="[ JDBC | MANAGED ]"/>- //新增一个博客<br><transactionManager type="[ JDBC | MANAGED ]"/>int addBlog(Blog blog);
复制代码 sql配置文件<br><transactionManager type="[ JDBC | MANAGED ]"/>- <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 ]"/>- @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 ]"/>- //动态sql<br><transactionManager type="[ JDBC | MANAGED ]"/>List selectBlogByIf(Map map);
复制代码 2、编写SQL语句<br><transactionManager type="[ JDBC | MANAGED ]"/>- <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 ]"/>- @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 ]"/>- <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 ]"/>2、sql配置文件<br><transactionManager type="[ JDBC | MANAGED ]"/>- <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 ]"/>- @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 ]"/>- //动态sql_choose<br><transactionManager type="[ JDBC | MANAGED ]"/> List selectBlogByChoose(Map map);
复制代码 2、sql配置文件<br><transactionManager type="[ JDBC | MANAGED ]"/>- <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 ]"/>- @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 ]"/>- <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 ]"/>- <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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 最好基于 单表来定义 sql 片断,提高片断的可重用性<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 在 sql 片断中不要包括 where<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 ]"/>- List<Blog> queryBlogForeach(Map map);
复制代码 2、编写SQL语句<br><transactionManager type="[ JDBC | MANAGED ]"/>- <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 ]"/>- @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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 存在内存中的临时数据。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能题目。<br><transactionManager type="[ JDBC | MANAGED ]"/>
2、为什么使用缓存?<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 减少和数据库的交互次数,减少系统开销,提高系统效率。<br><transactionManager type="[ JDBC | MANAGED ]"/>
3、什么样的数据能使用缓存?<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 经常查询并且不经常改变的数据。<br><transactionManager type="[ JDBC | MANAGED ]"/>
11.2、Mybatis缓存<br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- MyBatis包罗一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存<br><transactionManager type="[ JDBC | MANAGED ]"/>
- <br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/>- 默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为当地缓存)<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 二级缓存必要手动开启和配置,他是基于namespace级别的缓存。<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存<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 ]"/>- 与数据库同一次会话期间查询到的数据会放在当地缓存中。<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 ]"/>- //根据id查询用户<br><transactionManager type="[ JDBC | MANAGED ]"/>User queryUserById(@Param("id") int id);
复制代码 3、接口对应的Mapper文件<br><transactionManager type="[ JDBC | MANAGED ]"/>- <br><transactionManager type="[ JDBC | MANAGED ]"/> select * from user where id = #{id}<br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码 4、测试<br><transactionManager type="[ JDBC | MANAGED ]"/>- @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 ]"/>- @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 ]"/>- @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 ]"/>- //修改用户<br><transactionManager type="[ JDBC | MANAGED ]"/>int updateUser(Map map);
复制代码 编写SQL<br><transactionManager type="[ JDBC | MANAGED ]"/>- <br><transactionManager type="[ JDBC | MANAGED ]"/> update user set name = #{name} where id = #{id}<br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码 测试<br><transactionManager type="[ JDBC | MANAGED ]"/>- @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 ]"/>- @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 ]"/>- 二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存<br><transactionManager type="[ JDBC | MANAGED ]"/>
- 基于namespace级别的缓存,一个名称空间,对应一个二级缓存;<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查出的数据会放在本身对应的缓存(map)中;<br><transactionManager type="[ JDBC | MANAGED ]"/>
<br><transactionManager type="[ JDBC | MANAGED ]"/> 使用步调<br><transactionManager type="[ JDBC | MANAGED ]"/> 1、开启全局缓存 【mybatis-config.xml】<br><transactionManager type="[ JDBC | MANAGED ]"/>- <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码 2、去每个mapper.xml中配置使用二级缓存,这个配置非常简朴,添加即可;【xxxMapper.xml】<br><transactionManager type="[ JDBC | MANAGED ]"/>- [/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 ]"/><br><transactionManager type="[ JDBC | MANAGED ]"/>- 测试代码<br><transactionManager type="[ JDBC | MANAGED ]"/>
- @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 ]"/>- 只要开启了二级缓存,我们在同一个Mapper中的查询,可以在二级缓存中拿到数据<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 ]"/>- <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 ]"/>- <br><transactionManager type="[ JDBC | MANAGED ]"/> <br><transactionManager type="[ JDBC | MANAGED ]"/>
复制代码 编写ehcache.xml文件,如果在加载时未找到/ehcache.xml资源或出现题目,则将使用默认配置。<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 ]"/>免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |