Mybatis(一):Mybatis基础架构和入门案例
来源:互联网 发布:手机去广告软件 编辑:程序博客网 时间:2024/06/05 22:05
Mybatis介绍
- MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。 目前mybatis在github上托管。git(分布式版本控制,当前比较流程)
- MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
- Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
Mybatis架构
Mybatis解决jdbc编程的问题
1.数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
2.Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3.向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
4.对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型
Mybatis与Hibernate重要区别
相同点:屏蔽jdbc api的底层访问细节,使用我们不用与jdbc api打交道,就可以访问数据。
Mbatis的好处:屏蔽jdbc api的底层访问细节;将sql语句与java代码进行分离;提供了将结果集自动封装称为实体对象和对象的集合的功能,queryForList返回对象集合,用queryForObject返回单个对象;提供了自动将实体对象的属性传递给sql语句的参数。
Hibernate是一个全自动的orm映射工具,它可以自动生成sql语句,Mbatis需要我们自己在xml配置文件中写sql语句,hibernate要比Mbatis功能负责和强大很多。因为hibernate自动生成sql语句,我们无法控制该语句,我们就无法去写特定的高效率的sql。对于一些不太复杂的sql查询,hibernate可以很好帮我们完成,但是,对于特别复杂的查询,hibernate就很难适应了,这时候用Mbatis就是不错的选择,因为Mbatis还是由我们自己写sql语句。
Mybatis入门程序
- 实现用户查询:根据用户id(主键)查询用户信息(单条记录)
Project结构以及要导入的jar包
log4j.properties
# Global logging configuration,建议开发环境中要用debuglog4j.rootLogger=DEBUG, stdout# Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
4.SqlMapConfig.xml
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <!-- 和spring整合后 environments配置将废除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理--> <transactionManager type="JDBC" /> <!-- 数据库连接池--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!--加载mapper映射 如果将和spring整合后,可以使用整合包中提供的mapper扫描器,此处的mappers不用配置了。 --> <mappers> <!-- 通过resource引用mapper的映射文件 --> <mapper resource="sqlmap/User.xml" /> </mappers> </configuration>
5.根据用户id(主键)查询用户信息(单条记录)
pojo(User.java)
public class User { private int id; private String username; private String sex; private Date birthday; private String address;}
User.xml(建议命名规则:表名+mapper.xml)
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace命名空间,为了对sql语句进行隔离,mapper开发dao方式,使用namespace有特殊作用--><mapper namespace="test"><!-- 在mapper.xml文件中配置很多的sql语句,执行每个sql语句时,封装为MappedStatement对象mapper.xml以statement为单位管理sql语句 --> <!-- 根据id查询用户信息 --> <!-- id:唯一标识 一个statement #{}:表示 一个占位符,如果#{}中传入简单类型的参数,#{}中的名称随意 parameterType:输入 参数的类型,通过#{}接收parameterType输入 的参数 resultType:输出结果 类型,不管返回是多条还是单条,指定单条记录映射的pojo类型 --> <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User"> SELECT * FROM USER WHERE id= #{id} </select></mapper>
创建SqlSessionFactory
public class MybatisFirst { // 会话工厂 private SqlSessionFactory sqlSessionFactory; // 创建工厂 @Before public void init() throws IOException { // 配置文件(SqlMapConfig.xml) String resource = "SqlMapConfig.xml"; // 加载配置文件到输入 流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } // 测试根据id查询用户(得到单条记录) @Test public void testFindUserById() { // 通过sqlSessionFactory创建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通过sqlSession操作数据库 // 第一个参数:statement的位置,等于namespace+statement的id // 第二个参数:传入的参数 User user = null; try { user = sqlSession.selectOne("test.findUserById", 2); } catch (Exception e) { e.printStackTrace(); } finally { // 关闭sqlSession sqlSession.close(); } System.out.println(user); }
6.备注
(1)、#{}表示一个占位符,向占位符输入参数,mybatis自动进行java类型和jdbc类型的转换。程序员不需要考虑参数的类型,比如:传入字符串,mybatis最终拼接好的sql就是参数两边加单引号。
(2)#{}接收pojo数据,可以使用OGNL解析出pojo的属性值。
(3)
- Mybatis(一):Mybatis基础架构和入门案例
- mybatis入门案例(一)
- Mybatis入门基础(一)
- MyBatis入门基础(一)
- MyBatis入门基础(一)
- MyBatis入门基础(一)
- MyBatis入门基础(一)
- MyBatis入门基础(一)
- MyBatis入门基础(一)
- MyBatis学习(1):Mybatis使用详解和入门案例
- [MyBatis]MyBatis入门(一)
- Mybatis入门示例(一):基础代码
- MyBatis入门基础(一)---------转载
- 【web】mybatis入门详解,基础案例demo
- MyBatis(一) 入门案例实现CRUD操作
- MyBatis入门(一)
- Mybatis入门(一)
- Mybatis入门(一)
- 深入理解脚本化CSS系列第一篇——脚本化行内样式
- 动态规划求编辑距离——算法解题报告
- CodeForces
- YTU.2431: C语言习题 医生值班
- layui回调函数
- Mybatis(一):Mybatis基础架构和入门案例
- RedisTemplate序列化
- Java类静态属性、静态块、非静态属性、非静态块、构造函数在初始化时的执行顺序
- Java设计模式百例
- day 37 rsync工具
- 26进制转换 boj1237
- 例解:过程性能模型的概念辨析
- MySQL存储引擎介绍
- 存储