3.Mybatis进阶

Mybatis 进阶

【学习目标】
1,能够独立使用 paramType 属性传入参数
a, 独立使用 parameterType 属性传入一个参数
b, 独立使用 parameterType 属性传入多个个参数
2,能够理解 ResultMap 标签的作用
a, 独立使用 ResultMap 标签完成结果集到 pojo 对象的映射
b, 独立使用 ResultMap 标签解决数据库字段映射到 pojo 对象属性名不一致的问题
3,能够独立使用 sql 标签完成 sql 语句的提取
a, 独立使用 sql 标签完成在同一个 mapper.xml 文件内,公用 sql 语句的书写
b, 独立使用 sql 标签完成在多个 mapper.xml 文件内,公用 sql 语句的书写
4,能够独立使用 mybatis 中的动态 sql 功能
a, 独立使用 if 标签完成 sql 中条件不固定的动态 sql 书写
b, 独立使用 choose,when,otherwise 这组标签完成条件选择的动态 sql 书写
c, 独立使用 where 标签解决 sql 语句中出现 where 时候的语法问题
d, 独立使用 set 标签解决 sql 语句中出现 set 时候的语法问题
e, 独立使用 foreach 标签完成迭代功能
5,能够独立使用 mybatis 中的高级查询
a, 独立使用标签完成一对一查询
b, 独立使用标签完成一对多查询
6,能够独立编写 mybatis 和 spring 整合的代码
a, 独立编写 sqlSessionFactory 在 spring 中的配置
b, 独立编写 MapperScannerConfigurer 在 spring 中的配置
c, 说出 mybatis 和 spring 整合之后,在 service 中使用 mapper 接口的流程
d, 说出 mybatis 和 spring 整合之后的事务机制

  1. 输入映射和输出映射
    Mapper.xml 映射文件中定义了操作数据库的 sql,每个 sql 是一个 statement,
    映射文件是 mybatis 的核心。
    1.1. 环境准备
  2. 复制昨天的工程,如下图
  3. 只保留 Mapper 接口开发相关的文件,其他的删除
    最终效果如下图:
  4. 如下图修改 SqlMapConfig.xml 配置文件。Mapper 映射器只保留包扫描的方式
<?xml version="1.0" encoding="UTF-8" ?> 1.2. parameterType(输入类型) 1.2.1. 传递简单类型 参考第一天内容。 使用#{}占位符,或者${}进行 sql 拼接。 1.2.2. 传递 pojo 对象 参考第一天的内容。 Mybatis 使用 ognl 表达式解析对象字段的值,#{}或者${}括号中的值为 pojo 属性 名称。 1.2.3. 传递 pojo 包装对象 开发中可以使用 pojo 传递查询条件。 查询条件可能是综合的查询条件,不仅包括用户查询条件还包括其它的查询 条件(比如查询用户信息的时候,将用户购买商品信息也作为查询条件),这时 可以使用包装对象传递输入参数。 包装对象:Pojo 类中的一个属性是另外一个 pojo。 需求:根据用户名模糊查询用户信息,查询条件放到 QueryVo 的 user 属性中。 1.2.3.1. 编写 QueryVo public class QueryVo { // 包含其他的 pojo private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } } 1.2.3.2. Sql 语句 SELECT * FROM user WHERE username LIKE '%张%' 1.2.3.3. Mapper.xml 文件 在 UserMapper.xml 中配置 sql,如下图。 SELECT * FROM `user` WHERE username LIKE '%${user.username}%' 1.2.3.4. Mapper 接口 在 UserMapper 接口中添加方法,如下图: /** * * @Title: queryUserByQueryVo * @Description: TODO(根据包装类查询用户) * @param queryVo * @return */ List queryUserByQueryVo(QueryVo queryVo); 1.2.3.5. 测试方法 在 UserMapeprTest 增加测试方法,如下: @Test public void testQueryUserByQueryVo() { // mybatis 和 spring 整合,整合之后,交给 spring 管理 SqlSession sqlSession = this.sqlSessionFactory.openSession(); // 创建 Mapper 接口的动态代理对象,整合之后,交给 spring 管理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 使用 userMapper 执行查询,使用包装对象 QueryVo queryVo = new QueryVo(); // 设置 user 条件 User user = new User(); user.setUsername("张"); // 设置到包装对象中 queryVo.setUser(user); // 执行查询 List list = userMapper.queryUserByQueryVo(queryVo); for (User u : list) { System.out.println(u); } // mybatis 和 spring 整合,整合之后,交给 spring 管理 sqlSession.close(); } 1.2.3.6. 效果 测试结果如下图: 1.3. resultType(输出类型) 1.3.1. 输出简单类型 需求:查询用户表数据条数 sql:SELECT count(*) FROM `user` 1.3.1.1. Mapper.xml 文件 在 UserMapper.xml 中配置 sql: SELECT count(*) FROM `user` 1.3.1.2. Mapper 接口 在 UserMapper 添加方法,: /** * * @Title: queryUserCount * @Description: TODO(这里用一句话描述这个方法的作用) * @return */ int queryUserCount(); 1.3.1.3. 测试方法 在 UserMapeprTest 增加测试方法,如下: @Test public void testQueryUserCount() { // mybatis 和 spring 整合,整合之后,交给 spring 管理 SqlSession sqlSession = this.sqlSessionFactory.openSession(); // 创建 Mapper 接口的动态代理对象,整合之后,交给 spring 管理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 使用 userMapper 执行查询用户数据条数 int count = userMapper.queryUserCount(); System.out.println(count); // mybatis 和 spring 整合,整合之后,交给 spring 管理 sqlSession.close(); } 1.3.1.4. 效果 测试结果如下图: 注意:输出简单类型必须查询出来的结果集有一条记录,最终将第一个字段的值 转换为输出类型。 1.3.2. 输出 pojo 对象 参考第一天内容 1.3.3. 输出 pojo 列表 参考第一天内容。 1.4. resultMap resultType 可以指定将查询结果映射为 pojo,但需要 pojo 的属性名和 sql 查 询的列名一致方可映射成功。 如果 sql 查询字段名和 pojo 的属性名不一致,可以通过 resultMap 将字段名 和属性名作一个对应关系 ,resultMap 实质上还需要将查询结果映射到 pojo 对 象中。 resultMap 可以实现将查询结果映射为复杂类型的 pojo,比如在查询结果映 射对象中包括 pojo 和 list 实现一对一查询和一对多查询。 需求:查询订单表 order 的所有数据 sql:SELECT id, user_id, number, createtime, note FROM `order` 1.4.1. 声明 pojo 对象 数据库表如下图: Order 对象: public class Order { // 订单 id private int id; // 用户 id private Integer userId; // 订单号 private String number; // 订单创建时间 private Date createtime; // 备注 private String note; //get/set。。。 } 1.4.2. Mapper.xml 文件 创建 OrderMapper.xml 配置文件,如下: <?xml version="1.0" encoding="UTF-8" ?> SELECT id, user_id, number, createtime, note FROM `orders` 1.4.3. Mapper 接口 编写接口如下: public interface OrderMapper { /** * 查询所有订单 * * @return */ List queryOrderAll(); } 1.4.4. 测试方法 编写测试方法 OrderMapperTest 如下: public class OrderMapperTest { private SqlSessionFactory sqlSessionFactory; @Before public void init() throws Exception { InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testQueryAll() { // 获取 sqlSession SqlSession sqlSession = this.sqlSessionFactory.openSession(); // 获取 OrderMapper OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class); // 执行查询 List list = orderMapper.queryOrderAll(); for (Order order : list) { System.out.println(order); } } } 1.4.5. 效果 测试效果如下图: 发现 userId 为 null 解决方案:使用 resultMap 1.4.6. 使用 resultMap 由于上边的 mapper.xml 中 sql 查询列(user_id)和 Order 类属性(userId)不一致,所 以查询结果不能映射到 pojo 中。 需要定义 resultMap,把 orderResultMap 将 sql 查询列(user_id)和 Order 类属性 (userId)对应起来 改造 OrderMapper.xml,如下: <?xml version="1.0" encoding="UTF-8" ?> SELECT id, user_id, number, createtime, note FROM `orders` 1.4.7. 效果 只需要修改 Mapper.xml 就可以了,再次测试结果如下: 2. 动态 sql 通过 mybatis 提供的各种标签方法实现动态拼接 sql。 需求:根据性别和名字查询用户 查询 sql: SELECT id, username, birthday, sex, address FROM `user` WHERE sex = 1 AND username LIKE '%张%' 2.1. If 标签 2.1.1. Mapper.xml 文件 UserMapper.xml 配置 sql,如下: SELECT id, username, birthday, sex, address FROM `user` WHERE sex = #{sex} AND username LIKE '%${username}%' 2.1.2. Mapper 接口 编写 Mapper 接口: /** * * @Title: queryUserByWhere * @Description: 根据条件查询用户 * @param user * @return */ List queryUserByWhere(User user); 2.1.3. 测试方法 在 UserMapperTest 添加测试方法,如下: @Test public void testQueryUserByWhere() { // mybatis 和 spring 整合,整合之后,交给 spring 管理 SqlSession sqlSession = this.sqlSessionFactory.openSession(); // 创建 Mapper 接口的动态代理对象,整合之后,交给 spring 管理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 使用 userMapper 执行根据条件查询用户 User user = new User(); user.setSex("1"); user.setUsername("张"); List list = userMapper.queryUserByWhere(user); for (User u : list) { System.out.println(u); } // mybatis 和 spring 整合,整合之后,交给 spring 管理 sqlSession.close(); } 2.1.4. 效果 测试效果如下图: 如果注释掉 user.setSex("1"),测试结果如下图: 测试结果二很显然不合理。 按照之前所学的,要解决这个问题,需要编写多个 sql,查询条件越多,需要编 写的 sql 就更多了,显然这样是不靠谱的。 解决方案,使用动态 sql 的 if 标签 2.1.5. 使用 if 标签 改造 UserMapper.xml,如下: SELECT id, username, birthday, sex, address FROM `user` WHERE 1=1 AND sex = #{sex} AND username LIKE '%${username}%' 注意字符串类型的数据需要要做不等于空字符串校验。 2.1.6. 效果 如上图所示,测试 OK 2.2. Where 标签 上面的 sql 还有 where 1=1 这样的语句,很麻烦 可以使用 where 标签进行改造 改造 UserMapper.xml,如下 SELECT id, username, birthday, sex, address FROM `user` AND sex = #{sex} AND username LIKE '%${username}%' 2.2.1. 效果 测试效果如下图: 2.3. Sql 片段 Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用 的目的。 把上面例子中的 id, username, birthday, sex, address 提取出来,作为 sql 片段,如下: SELECT FROM `user` AND sex = #{sex} AND username LIKE '%${username}%' id, username, birthday, sex, address 如果要使用别的 Mapper.xml 配置的 sql 片段,可以在 refid 前面加上对应的 Mapper.xml 的 namespace 例如下图 2.4. foreach 标签 向 sql 传递数组或 List,mybatis 使用 foreach 解析,如下: 根据多个 id 查询用户信息 查询 sql: SELECT * FROM user WHERE id IN (1,10,24) 2.4.1. 改造 QueryVo 如下代码,在 pojo 中定义 list 属性 ids 存储多个用户 id,并添加 getter/setter 方 法 public class QueryVo { // 包含其他的 pojo private User user; private List ids; public List getIds() { return ids; } public void setIds(List ids) { this.ids = ids; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } } 2.4.2. Mapper.xml 文件 UserMapper.xml 添加 sql,如下: SELECT * FROM `user` #{item} 在 UserMapper 接口中添加如下方法 List queryUserByIds(QueryVo queryVo); 测试方法如下图: @Test public void testQueryUserByIds() { // mybatis 和 spring 整合,整合之后,交给 spring 管理 SqlSession sqlSession = this.sqlSessionFactory.openSession(); // 创建 Mapper 接口的动态代理对象,整合之后,交给 spring 管理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 使用 userMapper 执行根据条件查询用户 QueryVo queryVo = new QueryVo(); List ids = new ArrayList<>(); ids.add(1); ids.add(10); ids.add(24); queryVo.setIds(ids); List list = userMapper.queryUserByIds(queryVo); for (User u : list) { System.out.println(u); } // mybatis 和 spring 整合,整合之后,交给 spring 管理 sqlSession.close(); } 2.4.3. 效果 测试效果如下图: 3. 关联查询 3.1. 商品订单数据模型 用户表:user 记录了购买商品的 用户信息 Id:唯一标识一个用 户 订单表:orders 记录了用户创建的订单 创建用户:user_id(外键) 订单号 创建时间 订单状态 一对一:一个订单只能由一个 用户创建 一对多:一个用户可以创建多 个订单 3.2. 一对一查询 需求:查询所有订单信息,关联查询下单用户信息。 注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联 查询用户信息为一对一查询。如果从用户信息出发查询用户下的订单信息则为一 对多查询,因为一个用户可以下多个订单。 sql 语句: SELECT o.id, o.user_id userId, o.number, o.createtime, o.note, u.username, u.address FROM `orders` o LEFT JOIN `user` u ON o.user_id = u.id 3.2.1. 方法一:使用 resultType 使用 resultType,改造订单 pojo 类,此 pojo 类中包括了订单信息和用户信息 这样返回对象的时候,mybatis 自动把用户信息也注入进来了 3.2.1.1. 改造 pojo 类 OrderUser 类继承 Order 类后 OrderUser 类包括了 Order 类的所有字段,只需要定 义用户的信息字段即可,如下: public class OrderUser extends Order{ private String username; private String address; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } } 3.2.1.2. Mapper.xml 在 UserMapper.xml 添加 sql,如下 SELECT o.id, o.user_id userId, o.number, o.createtime, o.note, u.username, u.address FROM `orders` o LEFT JOIN `user` u ON o.user_id = u.id 3.2.1.3. Mapper 接口 在 UserMapper 接口添加方法,如下代码: /** * * @Title: queryOrderUser * @Description: TODO(一对一关联,查询订单同时包含用户信息) * @return */ List queryOrderUser(); 3.2.1.4. 测试方法: 在 UserMapperTest 添加测试方法,如下: @Test public void testQueryOrderUser() { // mybatis 和 spring 整合,整合之后,交给 spring 管理 SqlSession sqlSession = this.sqlSessionFactory.openSession(); // 创建 Mapper 接口的动态代理对象,整合之后,交给 spring 管理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 使用 userMapper 执行根据条件查询用户 List list = userMapper.queryOrderUser(); for (OrderUser ou : list) { System.out.println(ou); } // mybatis 和 spring 整合,整合之后,交给 spring 管理 sqlSession.close(); } 3.2.1.5. 效果 测试结果如下图: 3.2.1.6. 小结 定义专门的 pojo 类作为输出类型,其中定义了 sql 查询结果集所有的字段。 此方法较为简单,企业中使用普遍。 3.2.2. 方法二:使用 resultMap 使用 resultMap,定义专门的 resultMap 用于映射一对一查询结果。 3.2.2.1. 改造 pojo 类 在 Order 类中加入 User 属性,user 属性中用于存储关联查询的用户信息,因 为订单关联查询用户是一对一关系,所以这里使用单个 User 对象存储关联查询 的用户信息。 改造 Order 如下代码: public class Order { // 订单 id private int id; // 用户 id private Integer userId; // 订单号 private String number; // 订单创建时间 private Date createtime; // 备注 private String note; private User user; //get/set。。。 } 3.2.2.2. Mapper.xml 这里 resultMap 指定 orderUserResultMap,如下: SELECT o.id, o.user_id, o.number, o.createtime, o.note, u.username, u.address FROM `orders` o LEFT JOIN `user` u ON o.user_id = u.id 3.2.2.3. Mapper 接口 编写 UserMapper 如下代码: /** * * @Title: queryOrderUserResultMap * @Description: TODO(一对一关联,查询订单,订单内部包含用户属性 ) * @return */ List queryOrderUserResultMap(); 3.2.2.4. 测试方法 在 UserMapperTest 增加测试方法,如下: @Test public void testQueryOrderUserResultMap() { // mybatis 和 spring 整合,整合之后,交给 spring 管理 SqlSession sqlSession = this.sqlSessionFactory.openSession(); // 创建 Mapper 接口的动态代理对象,整合之后,交给 spring 管理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 使用 userMapper 执行根据条件查询用户 List list = userMapper.queryOrderUserResultMap(); for (Order o : list) { System.out.println(o); } // mybatis 和 spring 整合,整合之后,交给 spring 管理 sqlSession.close(); } 3.2.2.5. 效果 测试效果如下图: 3.3. 一对多查询 案例:查询所有用户信息及用户关联的订单信息。 用户信息和订单信息为一对多关系。 sql 语句: SELECT u.id, u.username, u.birthday, u.sex, u.address, o.id oid, o.number, o.createtime, o.note FROM `user` u LEFT JOIN `orders` o ON u.id = o.user_id 3.3.1. 修改 pojo 类 在 User 类中加入 List orders 属性,如下图: 3.3.2. Mapper.xml 在 UserMapper.xml 添加 sql,如下: SELECT u.id, u.username, u.birthday, u.sex, u.address, o.id oid, o.number, o.createtime, o.note FROM `user` u LEFT JOIN `orders` o ON u.id = o.user_id 3.3.3. Mapper 接口 编写 UserMapper 接口,如下图: 3.3.4. 测试方法 在 UserMapperTest 增加测试方法,如下 @Test public void testQueryUserOrder() { // mybatis 和 spring 整合,整合之后,交给 spring 管理 SqlSession sqlSession = this.sqlSessionFactory.openSession(); // 创建 Mapper 接口的动态代理对象,整合之后,交给 spring 管理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 使用 userMapper 执行根据条件查询用户 List list = userMapper.queryUserOrder(); for (User u : list) { System.out.println(u); } // mybatis 和 spring 整合,整合之后,交给 spring 管理 sqlSession.close(); } 3.3.5. 效果 测试效果如下图: 4. Mybatis 整合 spring 4.1. 整合思路 1、SqlSessionFactory 对象应该放到 spring 容器中作为单例存在。 2、传统 dao 的开发方式中,应该从 spring 容器中获得 sqlsession 对象。 3、Mapper 代理形式中,应该从 spring 容器中直接获得 mapper 的代理对象。 4、数据库的连接以及数据库连接池事务管理都交给 spring 容器来完成。 4.2. 整合需要的 jar 包 1、spring 的 jar 包 2、Mybatis 的 jar 包 3、Spring+mybatis 的整合包。 4、Mysql 的数据库驱动 jar 包。 5、数据库连接池的 jar 包。 jar 包位置如下所示: 4.3. 整合的步骤 4.3.1. 创建工程 如下图创建一个 web 工程: 4.3.2. 导入 jar 包 前面提到的 jar 包需要导入,如下图: 4.3.3. 加入配置文件 1. mybatisSpring 的配置文件 2. 的配置文件 sqlmapConfig.xml a) 数据库连接及连接池 b) 事务管理(暂时可以不配置) c) sqlsessionFactory 对象,配置到 spring 容器中 d) mapeer 代理对象或者是 dao 实现类配置到 spring 容器中。 创建资源文件夹 config 拷贝加入配置文件,如下图 4.3.3.1. SqlMapConfig.xml 配置文件是 SqlMapConfig.xml,如下: <?xml version="1.0" encoding="UTF-8" ?> 4.3.3.2. applicationContext.xml SqlSessionFactoryBean 属于 mybatis-spring 这个 jar 包 对于 spring 来说,mybatis 是另外一个架构,需要整合 jar 包。 在项目中加入 mybatis-spring-1.2.2.jar 的源码,如下图 效果,如下图所示,图标变化,表示源码加载成功: 整合 Mybatis 需要的是 SqlSessionFactoryBean,位置如下图: applicationContext.xml,配置内容如下 <?xml version="1.0" encoding="UTF-8"?> 4.3.3.3. db.properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8 jdbc.username=root jdbc.password=root 4.3.3.4. log4j.properties # Global logging configuration log4j.rootLogger=DEBUG, stdout # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n 4.3.3.5. 效果: 加入的配置文件最终效果如下: 4.4. Dao 的开发 两种 dao 的实现方式: 1、原始 dao 的开发方式 2、使用 Mapper 代理形式开发方式 a) 直接配置 Mapper 代理 b) 使用扫描包配置 Mapper 代理 需求: 1. 实现根据用户 id 查询 2. 实现根据用户名模糊查询 3. 添加用户 4.4.1. 创建 pojo public class User { private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 //get/set。。。 } 4.4.2. 传统 dao 的开发方式 原始的 DAO 开发接口+实现类来完成。 需要 dao 实现类需要继承 SqlsessionDaoSupport 类 4.4.2.1. 实现 Mapper.xml 编写 User.xml 配置文件,如下: <?xml version="1.0" encoding="UTF-8" ?> select * from user where id = #{id} select * from user where username like '%${value}%' select last_insert_id() insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address}) 4.4.2.2. 加载 Mapper.xml 在 SqlMapConfig 如下图进行配置: 4.4.2.3. 实现 UserDao 接口 public interface UserDao { /** * 根据 id 查询用户 * * @param id * @return */ User queryUserById(int id); /** * 根据用户名模糊查询用户列表 * * @param username * @return */ List queryUserByUsername(String username); /** * 保存 * * @param user */ void saveUser(User user); } 4.4.2.4. 实现 UserDaoImpl 实现类 编写 DAO 实现类,实现类必须集成 SqlSessionDaoSupport SqlSessionDaoSupport 提供 getSqlSession()方法来获取 SqlSession public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao { @Override public User queryUserById(int id) { // 获取 SqlSession SqlSession sqlSession = super.getSqlSession(); // 使用 SqlSession 执行操作 User user = sqlSession.selectOne("queryUserById", id); // 不要关闭 sqlSession return user; } @Override public List queryUserByUsername(String username) { // 获取 SqlSession SqlSession sqlSession = super.getSqlSession(); // 使用 SqlSession 执行操作 List list = sqlSession.selectList("queryUserByUsername", username); // 不要关闭 sqlSession return list; } @Override public void saveUser(User user) { // 获取 SqlSession SqlSession sqlSession = super.getSqlSession(); // 使用 SqlSession 执行操作 sqlSession.insert("saveUser", user); // 不用提交,事务由 spring 进行管理 // 不要关闭 sqlSession } } 4.4.2.5. 配置 dao 把 dao 实现类配置到 spring 容器中,如下图 4.4.2.6. 测试方法 创建测试方法,可以直接创建测试 Junit 用例。 创建包:com.igeek.test 编写测试方法如下: public class UserDaoTest { private ApplicationContext context; @Before public void setUp() throws Exception { this.context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); } @Test public void testQueryUserById() { // 获取 userDao UserDao userDao = this.context.getBean(UserDao.class); User user = userDao.queryUserById(1); System.out.println(user); } @Test public void testQueryUserByUsername() { // 获取 userDao UserDao userDao = this.context.getBean(UserDao.class); List list = userDao.queryUserByUsername("张"); for (User user : list) { System.out.println(user); } } @Test public void testSaveUser() { // 获取 userDao UserDao userDao = this.context.getBean(UserDao.class); User user = new User(); user.setUsername("曹操"); user.setSex("1"); user.setBirthday(new Date()); user.setAddress("三国"); userDao.saveUser(user); System.out.println(user); } } 4.4.3. Mapper 代理形式开发 dao 4.4.3.1. 实现 Mapper.xml 编写 UserMapper.xml 配置文件,如下: <?xml version="1.0" encoding="UTF-8" ?> select * from user where id = #{id} select * from user where username like '%${value}%' select last_insert_id() insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address}) 4.4.3.2. 实现 UserMapper 接口 public interface UserMapper { /** * 根据用户 id 查询 * * @param id * @return */ User queryUserById(int id); /** * 根据用户名模糊查询用户 * * @param username * @return */ List queryUserByUsername(String username); /** * 添加用户 * * @param user */ void saveUser(User user); } 4.4.3.3. 方式一:配置 mapper 代理 在 applicationContext.xml 添加配置 MapperFactoryBean 也是属于 mybatis-spring 整合包 4.4.3.4. 测试方法 public class UserMapperTest { private ApplicationContext context; @Before public void setUp() throws Exception { this.context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); } @Test public void testQueryUserById() { // 获取 Mapper UserMapper userMapper = this.context.getBean(UserMapper.class); User user = userMapper.queryUserById(1); System.out.println(user); } @Test public void testQueryUserByUsername() { // 获取 Mapper UserMapper userMapper = this.context.getBean(UserMapper.class); List list = userMapper.queryUserByUsername("张"); for (User user : list) { System.out.println(user); } } @Test public void testSaveUser() { // 获取 Mapper UserMapper userMapper = this.context.getBean(UserMapper.class); User user = new User(); user.setUsername("曹操"); user.setSex("1"); user.setBirthday(new Date()); user.setAddress("三国"); userMapper.saveUser(user); System.out.println(user); } } 4.4.3.5. 方式二:扫描包形式配置 mapper 每个 mapper 代理对象的 id 就是类名,首字母小写 5. Mybatis 逆向工程 使用官方网站的 Mapper 自动生成工具 mybatis-generator-core-1.3.2 来生成 po 类 和 Mapper 映射文件 5.1. 导入逆向工程 使用课前资料已有逆向工程,如下图: 5.1.1. 导入逆向工程到 eclipse 中 如下图方式进行导入: 5.2. 修改配置文件 在 generatorConfig.xml 中配置 Mapper 生成的详细信息,如下图: 注意修改以下几点: 1. 修改要生成的数据库表 2. pojo 文件所在包路径 3. Mapper 所在的包路径 配置文件如下: <?xml version="1.0" encoding="UTF-8"?>
5.3. 生成逆向工程代码 找到下图所示的 java 文件,执行工程 main 主函数, 刷新工程,发现代码生成,如下图: 5.4. 测试逆向工程代码 1. 复制生成的代码到 mybatis_d02_c05 工程,如下图 2. 修改 spring 配置文件 在 applicationContext.xml 修改 3. 编写测试方法: public class UserMapperTest { private ApplicationContext context; @Before public void setUp() throws Exception { this.context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); } @Test public void testInsert() { // 获取 Mapper UserMapper userMapper = this.context.getBean(UserMapper.class); User user = new User(); user.setUsername("曹操"); user.setSex("1"); user.setBirthday(new Date()); user.setAddress("三国"); userMapper.insert(user); } @Test public void testSelectByExample() { // 获取 Mapper UserMapper userMapper = this.context.getBean(UserMapper.class); // 创建 User 对象扩展类,用户设置查询条件 UserExample example = new UserExample(); example.createCriteria().andUsernameLike("%张%"); // 查询数据 List list = userMapper.selectByExample(example); System.out.println(list.size()); } @Test public void testSelectByPrimaryKey() { // 获取 Mapper UserMapper userMapper = this.context.getBean(UserMapper.class); User user = userMapper.selectByPrimaryKey(1); System.out.println(user); } } 注意: 1. 逆向工程生成的代码只能做单表查询 2. 不能在生成的代码上进行扩展,因为如果数据库变更,需要重新使用逆向工程生成 代码,原来编写的代码就被覆盖了。 3. 一张表会生成 4 个文件

猜你喜欢

转载自blog.csdn.net/weixin_42137448/article/details/87902314