- 今天学习的mybatis快速开发和代理开发(以后一般用这个方法进行开发)的区别:
- 快速开发mapper标签的命名空间名字自己取,不需要与要动态实现的接口类名字一样,甚至不需要有接口;
- 代理开发需要有要动态实现的接口,mapper标签的命名空间名要与接口的一致,其余的限制条件见笔记下半部分。
普通开发步骤
1.导入mybatis依赖包(主要是数据库驱动和mybatis)
2.创建user数据表
3.编写User实体类
4.编制映射文件UserMapper.xml文件
- 可能出现问题:约束头最后一个http显示未注册
- 解决方法:IDEA中:file->seeting->language&frameworks->schemas and dtds->点中间下面有很多http开头的链接那块的加号,将报红的那个http的链接(http://mybatis.org/dtd/mybatis-3-mapper.dtd)添加进去即可。
5.编制核心配置文件sqlMapConfig.xml文件
6.编写测试类(主要步骤如下)
- 加载配置文件
- 获得session工厂
- 获得session回话对象
- 执行操作(查询操作,其他操作需要提交事务),参数:namespace+id
- 打印数据(对数据进行处理)
- 释放资源
//加载配置文件(查询操作)
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session回话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作 参数:namespace+id
List<User> userList = sqlSession.selectList("userMapper.findAll");
//打印数据
System.out.println(userList);
//释放资源
sqlSession.close();
public void test2() throws IOException {
//模拟传入的user对象(插入操作)
User user1 = new User();//id是自增的,不需要复制赋值
user1.setUsername("zhaoshan");
user1.setPassword("acd");
//加载配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session回话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作 参数:namespace+id
sqlSession.insert("userMapper.save",user1);
//必须要提交事务才能刷新数据表
sqlSession.commit();
//释放资源
sqlSession.close();
}
相关设置
-
映射配置文件中增删改查的设置
-
核心配置文件设置
- 定义别名第二种方法:扫包,默认包下的类别名为类的名称或者是首字母小写的类的名称
- 具体代码
<typeAliases>
<package name="com.itheima.domain"></package>
</typeAliases>
dao层实现原理
代理模式开发(需要满足的条件)
- 备注:代理模式之后开发步骤转变为:首先在接口里面写抽象的方法,之后在配置文件里面用相关语句进行实现,其测试类中代码如下:
//加载配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//获得工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//UserMapper是自定义的接口对象,里面有映射配置文件中包含sql语句的方法
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user1 = mapper.findById(7);
System.out.println(user1);
// sqlSession.commit(); 若操作需要改变数据库中的数据,需要提交事务
sqlSession.close();
- 动态sql语句:if、foreach,写在<where /where>标签里面
- sql语句的抽取,<sql /sql>
- 如果select等字句有参数的话,用#{}来进行数据引用,如果引用的参数是对象,大括号中是对象实体的属性名
- 知识总结
- 分页插件的使用
- 首先导入PageHelper的jar包;
- 在核心配置文件中配置分页助手;
`<!--配置分页助手-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"/>
</plugin>
</plugins>`
- 在测试类中就可以利用分页助手插件设置分页参数或者获取分页信息
//设置分页参数 当前页+每页显示条数
PageHelper.startPage(2,3);
List<User> users = mapper.findAll();
for(User user:users){
System.out.println(user);
}
//获取分页信息
PageInfo<User> pageInfo = new PageInfo<User>(users);
System.out.println("当前页为:" + pageInfo.getPageNum());
System.out.println("每页显示条数" + pageInfo.getPageSize());
System.out.println("总页数:" + pageInfo.getPages());
System.out.println("前一页为" + pageInfo.getPrePage());
System.out.println("下一页为" + pageInfo.getNextPage());
sqlSession.close();
- typehandlers标签(用于Java和数据库中数据之间类型的转换)
- 首先定义一个转换类,该类要继承BaseTypeHandler
<T>
抽象类,重新其中的四个方法,第一个方法是将java中的数据类型转为数据库中的数据类型后存入数据库,其余三个方法都是将数据库中的数据类型转换为java中的数据类型后取出来展示 - 之后在核心配置文件中配置类型处理器,代码如下:
<typeHandlers> <typeHandler handler="com.itheima.handler.DateTypeHandler"></typeHandler> </typeHandlers>
- 最后可在测试代码中使用该转换器
- 首先定义一个转换类,该类要继承BaseTypeHandler