1、mybatis从入门到精通1、对原生态的jdbc程序问题总结 1.1 jdbc程序:使用jdbc查询mysql数据库中用户表的记录 1.2 问题: 1)数据库连接使用时创建、不使用时就释放:对数据库进行频繁的连接的创建和释放,造成数据库资源浪费,影响数据库性能-使用数据库连接池管理数据库连接 2)将sql语句硬编码到java代码中,如果sql语句修改,需要重新编译java代码,不利于系统维护-将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译 3)向prepareStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护-
2、将sql语句及占位符和参数全部配置在xml文件中 4)从resultSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护-将结果集自动映射成java对象2、mybatis框架原理 2.1 mybatis是什么? mybatis是一个持久层框架,是apache下的顶级项目 github下: mybatis让程序员将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足sql需要的sql语句 mybatis可以将向preparestatement输入的参数自动进行输入映射,将查询结果集灵活映射成java对象(输出映射)。 2.2 mybatis框架 3、
3、mybatis入门程序 3.1 需求 根据主键查询用户信息 根据用户名模糊查询用户信息 怎删改查. 3.2 mybati运行环境(jar包):从 下载 lib下:依赖包 mybatis-3.4.1.jar:核心包 3.3 log4j.properties#Global logging configuration log4j.rootLogger=ERROR, stdout #MyBatis logging configuration.log4j.logger.org.mybatis.example.BlogMapper=TRACE #Console output.log4j.appender.
4、stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p%t-%m%n 3.4 工程目录结构 3.5 根据用户id查询用户信息、通过用户名模糊查询用户信息 3.5.1 编写映射文件(包括对应的实体类:User.java) 映射文件命名:User.xml(原始的ibatis命名方式),mapper代理的映射文件名称叫做XXXMapper.xml SELECT
5、* FROM USER WHERE uid=#id SELECT * FROM USER WHERE name LIKE %$value% 3.5.2 将映射文件加载到SqlMapConfig配置文件中 3.5.3 程序编写Test publicvoid findUserByIdTest()throwsIOException / mybatis配置文件 String resource =SqlMapConfig.xml; InputStream input =Resources.getResourceAsStream(resource); / 创建会话工厂 SqlSessionFactory
6、sqlSessionFactory =newSqlSessionFactoryBuilder() .build(input); / 通过工厂得到SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); / 通过SqlSession操作数据库 User user = sqlSession.selectOne(test.findUserById,23); System.out.println(user.getName(); / 释放资源 sqlSession.close(); / 根据name查询用户信息,得到一条记录的
7、结果 Test publicvoid findUserByNameTest()throwsIOException / mybatis配置文件 String resource =SqlMapConfig.xml; InputStream input =Resources.getResourceAsStream(resource); / 创建会话工厂 SqlSessionFactory sqlSessionFactory =newSqlSessionFactoryBuilder() .build(input); / 通过工厂得到SqlSession SqlSession sqlSession =
8、sqlSessionFactory.openSession(); / 通过SqlSession操作数据库 List list = sqlSession.selectList(test.findUserByName,李); System.out.println(list.size(); / 释放资源 sqlSession.close(); 3.6 插入用户信息 3.6.1 User.xml映射文件: insert into user(username,password) value(#username,#password) 3.6.2 测试代码: Test publicvoid insertUs
9、erTest()throwsIOException / mybatis配置文件 String resource =SqlMapConfig.xml; InputStream input =Resources.getResourceAsStream(resource); / 创建会话工厂 SqlSessionFactory sqlSessionFactory =newSqlSessionFactoryBuilder() .build(input); / 通过工厂得到SqlSession SqlSession sqlSession = sqlSessionFactory.openSession()
10、; / 通过SqlSession操作数据库 User user =newUser(); user.setUsername(ll); user.setPassword(123456); sqlSession.insert(test.insertUser,user); /提交事务 sqlSmit(); / 释放资源 sqlSession.close(); 3.7 自增主键返回 mysql自增主键,执行insert提交之前自动生成一个自增主键。 通过mysql函数获取到刚刚插入的记录的自增主键last_insert_id() ,是在insert之后调用此函数 3.7.1 User.xml映射文件配置
11、: SELECT LAST_INSERT_ID() insert into user(username,password) value(#username,#password) 3.7.2 程序代码中直接获取 Test publicvoid insertUserTest()throwsIOException / mybatis配置文件 String resource =SqlMapConfig.xml; InputStream input =Resources.getResourceAsStream(resource); / 创建会话工厂 SqlSessionFactory sqlSessio
12、nFactory =newSqlSessionFactoryBuilder() .build(input); / 通过工厂得到SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); / 通过SqlSession操作数据库 User user =newUser(); user.setUsername(ll); user.setPassword(123456); sqlSession.insert(test.insertUser,user); /提交事务 sqlSmit(); System.out.println(us
13、er.getUid(); / 释放资源 sqlSession.close(); 3.8 非自增主键的返回 使用mysql的uuid()函数生成主键,需要修改表中uid字段类型为string,长度为35 执行的思路: 先通过uuid()查询到主键,将主键输入到sql语句中 执行uuid语句的顺序相对于insert语句之前 SELECT uuid() insert into user(uid,username,password) value(#uid,#username,#password) 3.9 删除和更新用户 delete from user where uid =#id update us
14、er set username=#username,password=#password where uid=#uid 3.10 #和$ 3.11 mybatis和hibernate的区别 hibernate:是一个标准的ORM框架(对象关系映射)。不需要写sql,都是自动生成的。对sql语句进行优化、修改比较困难 适用于需求变化不多的中小型项目,比如:后台管理项目 mybatis:专注是sql本身,在映射文件中需要程序员自己编写sql语句,优化比较方便。mybatis是一个不完全的ORm框架;虽然程序员自己写sql,也可以实现映射(输入、输出映射)。 适用于需求变化较多的项目,比如:互联网项
15、目。4、mybatis开发dao两种方法: 1)原始dao开发方法(程序需要编写dao接口和dao实现类) 2)mybatis的mapper接口(相当于dao接口)代理开发方法 4.1 SqlSession使用范围 / mybatis配置文件String resource =SqlMapConfig.xml;InputStream input =Resources.getResourceAsStream(resource);/ 创建会话工厂SqlSessionFactory sqlSessionFactory =newSqlSessionFactoryBuilder().build(input
16、);/ 通过工厂得到SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession(); 4.1.1 通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory 4.1.2 通过SqlSessionFactory创建SqlSession,使用单例模式管理sqlsessionFactory 4.1.3 sqlSession是一个面向用户的接口:SqlSession中提供了很多操作数据库的方法;是线程不安全的;Sqlsession最佳适用场合在方法体内,定义成局部变量使用。 4.2 原始dao的
17、开发方法(程序员需要写dao接口和dao实现类) 4.2.1 程序员需要向dao实现类中注入SqlSessionFactory UserDao接口:定义方法(抛异常) UserDaoImpl类:实现接口UserDao,并通过构造函数的方法向UserDaoImpl类注入SqlSessionFactory; UserDaoImplTest类:创建SqlSessionFactory实例,在创建UserDao对象 4.2.2 总结原始dao开发问题 1)dao接口实现类方法中存在大量模板代码,设想能否将这些代码提取出来,大大减少程序员的工作量 2)调用sqlSession的方法时将statement的
18、id硬编码了 3)调用sqlSession的方法时传入的变量,由于sqlSession方法使用泛型,即使变量传入错误,在编译阶段也不会报错 4.3 mapper代理方法(程序员只需要mapper接口相当于dao接口) 思路: 4.3.1 程序员还需要编写mapper.xml映射文件 4.3.2 程序员编写mapper.java接口需要遵循一些开发规范,mtbatis可以自动生成mapper接口实现类代理对象 开发规范: 1)在mapper.xml中namespace等于mapper接口地址 2)mapper.java接口中的方法名和mapper.xml中statement的id一致 3)map
19、per.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致 4)mapper.java接口中的方法返回值的类型和mapper.xml中statement的resultType指定的类型一致/ 根据用户id查询用户信息 publicUser findUserById(int uid)throwsException; SELECT * FROM USER WHERE uid=#id 总结:以上开发规范主要对下边的代码进行统一生成, User user = sqlSession.selectOne(test.findUserById, uid); 4.3.4 最后还要将mapper.xml映射文件添加到SqlMapConfig.xml配置文件中 5、mybatis配置文件SqlMapConfig.xmlmybatis的全局配置文件SqlMapConfig.xml。配置内容如下: propert