今日课程内容介绍

第二章 Mybatis的curd(基于代理dao的方式)
2.1 回顾自定义Mybatis的流程
- 流程图

- 不管使用哪种方式都只干了两件事:
- 查询结果,封装结果集
- 创建代理对象,调用查询结果
- 总结(自定义不是重点,重点还是如何去实现与执行Mybatis的使用)

2.2 xml和注解重点流程【重点】
- 不要拘泥于某个技术点来得到某些内容
- 主要关注的是从里面拿出什么内容来解决什么内容【如下】
- 获取到连接数据库的信息

- 拿到映射配置的信息(映射配置里面提供的信息)

- xml配置信息中
- 获取时所必须的key->唯一标志
- 封装到哪里去的->全限定类名
- 执行什么样的SQL语句
- 注解配置信息中【关键就是User要怎么拿到】
- 获取时所必须的key->唯一标志
- 封装到哪里去的->User
- 执行什么样的SQL语句
- User要怎么拿到【了解】
- 后面就是取出信息存到mappers里面
- 目的:可以在创建代理对象的时候可以拿到我们想要的信息
- 后面就是取出信息存到mappers里面
- 创建代理对象,调用查询结果

- 获取到连接数据库的信息
2.3 回顾Mybatis的环境搭建【重点】
2.3.1 xml的
- 新建项目,什么都不选

- 组名和自定义名

- 导入依赖坐标(日志操作配置去day1中复制)

- 在java文件夹中创建实体类

- 在Resource文件夹中创建Mybatis的主配置文件
- 复制Config的约束
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">- mappers配置方式决定使用xml还是注解

- 创建dao的接口

- 对应着dao接口包来创建映射配置文件(必须一级一级来创建:否则会以点分隔创建成一个文件夹)
- 复制Mapper的约束(叫mapper和dao是一样的,根据个人习惯)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

8. 至此,环境搭建完成【下面写测试类来测试】

2.3.2 注解的
- 注: 与2.3.1中(1, 2, 3, 4)步骤相同
- 在Resource文件夹中创建Mybatis的主配置文件
- 复制Config的约束
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">- mappers配置方式决定使用xml还是注解
- 需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名

- 需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名
- 创建dao的接口
- 在dao接口的方法上使用@Select注解,并且指定SQl语句

- 在dao接口的方法上使用@Select注解,并且指定SQl语句
- 注解不需要xml映射配置文件
- 至此,环境搭建完成【下面写测试类来测试】

- 注:我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式,不管使用XML还是注解的方式。
- 但是Mybatis是支持写dao实现的。
2.4 Mybatis的CRUD 保存操作
2.4.1 xml的
- 在IUserDao接口中写方法

- 在映射配置IUserDao.xml中配置
- 没有id是因为它是自增长的

- 没有id是因为它是自增长的
- 在测试类中新增一个方法
- 这里每个方法都需要做1,2,3,4,6步骤,所有都提了出来(优化代码)
- 测试保存操作最后面要用到,提交事务操作(否则会回滚)
public class MybatisTest { private InputStream in; private SqlSession sqlSession; private IUserDao userDao; /** * 来执行一些初始化的操作(减少重复代码) * * 这时候要有一些变量写到外面 */ @Before //用于在测试方法执行之前执行 public void init() throws Exception{ //1. 读取配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //会抛出异常 //2. 创建SqlSessionFactory工厂(他是一个接口,需要找他的实现) /*SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(in);*/ SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //3. 使用工厂产生SqlSession对象 sqlSession = factory.openSession(); //4. 使用SqlSession创建Dao接口的代理对象 userDao = sqlSession.getMapper(IUserDao.class); } /** * 用来干释放资源 */ @After //用于在测试方法执行之后执行 public void destroy() throws Exception{ /** * 测试保存操作最后面要用到 */ //提交事务(否则会回滚) sqlSession.commit(); //6. 释放资源 sqlSession.close(); in.close(); //也会抛出异常 } /** * 入门案例 * 总体思路: * 读取配置文件来准备一个工厂来生产一个对象,这个对象用于为我们提供Dao的实现,有了实现就可以用来执行方法 * * 要点: * 1. 用代理的方式不用写Dao的实现 * 2. IUserDao.xml配置当中,必须要说清楚封装到哪里去{<select id="findAll" resultType="com.kami.domain.User">} */ @Test public void testFindAll(){ //5. 使用代理对象执行方法 List<User> users = userDao.findAll(); for(User user : users){ System.out.println(user); } } /** * 测试保存操作 */ @Test public void stestSave() throws Exception { User user = new User(); user.setUsername("Mybatis saveUser"); user.setAddress("银川市西夏区"); user.setSex("男"); user.setBirthday(new Date()); //5. 使用代理对象保存方法 userDao.saveUser(user); } }
- 注:当保存操作,存中文出现乱码的时候【重点】
- 打开SqlMapConfig.xml
- 修改url后面的value值
<property name="url" value="jdbc:mysql://localhost:端口号/数据库名称?characterEncoding=utf-8"/>
2.4.2 注解的
- 在IUserDao接口中写方法

- SqlMapConfig.xml改成注解

- 在测试类中新增一个方法
- 前面部分同xml的配置

- 前面部分同xml的配置
2.5 Mybatis的CRUD 修改与删除操作
2.5.1 xml的
- 在IUserDao接口中写方法

- 在映射配置IUserDao.xml中配置

- 在测试类中新增方法

2.5.2 注解的
- 在IUserDao接口中写方法

- SqlMapConfig.xml改成注解

- 在测试类中新增方法
- 前面部分同xml的配置

- 前面部分同xml的配置
2.6 Mybatis的CRUD 查询一个和模糊查询(07)
2.6.1.1 xml的方式:查询一个的操作
- 在IUserDao接口中写方法

- 在映射配置IUserDao.xml中配置

- 在测试类中新增方法

2.6.1.2 注解的方式:查询一个的操作
- 在IUserDao接口中写方法

- 在测试类中新增方法

2.6.2.1 xml的方式:模糊查询的操作
- 在IUserDao接口中写方法

- 在映射配置IUserDao.xml中配置

- 在测试类中新增方法

2.6.2.2 注解的方式:模糊查询的操作
- 在IUserDao接口中写方法

- 在测试类中新增方法

2.7 Mybatis的CRUD 查询返回一行一列
2.7.1 XML的方式:查询总用户数
- 在IUserDao接口中写方法

- 在映射配置IUserDao.xml中配置

- 在测试类中新增方法

2.7.2 注解的方式:查询总用户数
- 在IUserDao接口中写方法

- 在测试类中新增方法

***以上是所有的CRUD操作
2.8 上面要注意的几点细节
2.8.1 模糊查询的另一种写法【了解,实际开发用上面的】
- IUserDao.xml配置中另一种写法
<!-- 根据名称模糊查询(这里提供不了模糊查询的%,在测试类中提供) -->
<select id="findByName" parameterType="String" resultType="com.kami.domain.User">
<!-- 原来的-->
select * from user where username like #{uname}
<!-- 另一种写法-->
select * from user where username like '%${value}%'
</select>
- 在测试类中的修改
@Test
public void testFindByName(){
//5. 使用代理对象保存方法
//List<User> users = userDao.findByName("%王%");
//另一种写法中已经提供了%,这里就不需要写了
List<User> users = userDao.findByName("王");
for(User user : users){
System.out.println(user);
}
}
- 两者的区别

- 注:PreparedStatement 使用crud的知识点
- PreparedStatement可以提高执行的效率(因为它有预编译的功能)
- PreparedStatement可以防止sql注入,但是要求?(参数占位符)赋值的方式才可以。
2.8.2 保存操作的细节:获取保存数据的id
- 新增用户后,同时还要返回当前新增用户的id
- 在IUserDao.xml的保存用户中新增配置

- 执行结果:

第三章 Mybatis的参数深入
- 首先了解:OGNL表达式(apache公司开发的):
- 它是通过对象的取值方法来获取数据。在写法上把get给省略了。

- #{}或者${}括号中的值为pojo属性名称

- 它是通过对象的取值方法来获取数据。在写法上把get给省略了。
3.1 使用实体类的包装对象作为查询条件【重点】
- 实际开发中常用到:【由多个对象产生的查询条件】
- 在IUserdao接口中写方法
/** * 根据queryVo的条件查询用户 * @param vo * @return */ int findUserByVo(QueryVo vo); - 实际还是要根据名称来模糊查询,只不过查询的条件被封装到一个对象里面了

- 在映射配置IUserDao.xml中配置
<!-- 根据QueryVo的条件查询用户--> <select id="findUserByVo" resultType="int" parameterType="com.kami.domain.QueryVo"> select * from user where username like #{user.username} </select> - 在测试类中新增方法
/** * 测试使用QueryVo作为查询条件 */ @Test public void testFindByVo(){ QueryVo vo = new QueryVo(); User user = new User(); user.setUsername("%王%"); vo.setUser(user); //5. 使用代理对象保存方法 List<User> userByVo = userDao.findUserByVo(vo); for(User u : userByVo){ System.out.println(u); } }
3.2 Mybatis的输出结果封装
3.2.1 resultType(输出类型)
- 输出简单类型(查询总记录条数)
- 输出pojo对象(查询一个)
- 输出pojo列表(查询所有)
- 注:当我们使用【查询封装】的时候,要求实体类必须和数据库的列名保持一致
- 如果不一致(保存为例->删除,改都一样):
- 经过对后面的名称及keyProperty(id名)的修改
- 能正常使用
- 经过对后面的名称及keyProperty(id名)的修改
- 如果不一致->查询
- 结果:除了name之外的内容都为null

- 结果:除了name之外的内容都为null
- 除了name能封装,其他都为null的原因:
- 所有的属性都没有对象,所以封装不进去
- name能封装进去的原因:MySQL数据库在Windows系统下不区分大小写。实力类和数据库name名称相互匹配成功。(其他的完全不一样)
- 但是在Linux系统下MySQL数据库是区分大小写的。所以在Linux中name也封装不进去。
- 解决方法:
- 在SQL语句中其别名【执行效率最高】
<!-- 查询所有 --> <select id="findAll" resultType="com.kami.domain.User"> select id as userId, username as userName, address as userAddress, sex as userSex, birthday as userBirthday from user; </select>- Mybatis提供了一种配置方式并使用【开发效率更高】
- IUserDao.xml中写好
<!-- 配置 查询结果的列名和实体类的属性名的对应关系--> <resultMap id="userMap" type="com.kami.domain.User"> <!-- 主键字段的对应--> <id property="userId" column="id"></id> <!-- 非主键字段的对应--> <result property="userName" column="username"></result> <result property="userAddress" column="address"></result> <result property="userSex" column="sex"></result> <result property="userBirthday" column="birthday"></result> </resultMap>- 查询所有的配置中将resultType替换成resultMap属性
<!-- 查询所有 --> <select id="findAll" resultMap="userMap"> select * from user; </select>
- 如果不一致(保存为例->删除,改都一样):
第四章 Mybatis实现DAO层开发
- 自己来写dao的实现类->【实际开发不自己来写】
- 注:PreparedStatement对象,它的执行方法

第五章 SqlMapConfig.xml配置文件
- properties
- 注:URL与URI的区别

- 注:URL与URI的区别
- typeAliases标签和package标签
- 注:Mappers下的package标签

- 注:Mappers下的package标签

被折叠的 条评论
为什么被折叠?



