Mybatis
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis相关的知识,希望对你有一定的参考价值。
1 为什么要使用Mybatis?
1.1 使用JDBC、DBUtils、JDBC Template等工具进行开发
- 功能简单;
- SQL语句编写在Java代码里面;
- 硬编码高耦合的方式;
1.2 使用Hibernate来进行开发
- Hibernate是全自动的ORM框架,旨在SQL。
- 但是这样我们希望SQL语句交给我们开发人员编写,希望SQL不失去灵活性。
1.3 Mybatis框架:半自动、轻量级框架
- SQL与Java代码分离;
- SQL是开发人员控制;
2 Mybatis简介
2.1 Mybatis简介
- Mybatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。
- Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
- Mybatis可以使用简单的XML或者注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。
2.2 Mybatis历史
- 原来是Apache的一个开源项目ibais,2010年6月这个项目由Apache Software Foundation迁移到了Google Code,随着开发团队转投Google Code旗下,ibatis3.X正式命名为Mybatis。
- ibatis一词来源于“Internet”和“abatis”的组合,是一个基于Java的持久层框架。ibatis提供的持久层框架包括SQL Maps和Data Access Objects。
2.3 为什么要使用Mybatis?
- Mybatis是一个半自动化的持久层框架。
- JDBC
- SQL夹在Java代码块里,耦合度高导致硬编码内伤。
- 维护不易并且在实际开发需求中SQL是有变化,频繁修改的情况多见。
- Hibernate和JPA
- 长难复杂SQL,对于Hibernate而言也不容易。
- 内部自动生成SQL,不容易做特殊优化。
- 基于全映射的全自动框架,大量字段的POJO进行部分映射比较困难。导致数据库性能下降。
- 对于开发人员而言,核心SQL还是需要自己优化。
- SQL和Java代码分离,功能边界清晰,一个专注业务,一个专注数据。
2.4 下载地址
- https://github.com/mybatis/mybatis-3/
3 Mybatis入门--HelloWorld
3.1 创建数据库及表
create database mybatis; user database mybatis; create table employee( id int(11) primary key auto_increment, last_name varchar(255), gender char(1), email varchar(255) );
3.2 创建POJO
package cn.demo1; /** * 描述:POJO */ public class Employee { private Integer id; private String lastName; private String gender; private String email; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } }
3.3 导入jar包及log4j.properties
### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.err log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### direct messages to file mylog.log ### log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=c\\:mylog.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### set log levels - for more verbose logging change ‘info‘ to ‘debug‘ ### log4j.rootLogger=off, stdout
3.4 导入Mybatis的核心配置文件
<?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"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource=""/> </mappers> </configuration>
3.5 创建映射文件
<?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"> <mapper namespace="default"> <!-- namespace:命名空间 id:唯一标识 resultType:返回值类型 --> <select id="findById" parameterType="int" resultType="cn.demo1.Employee"> select * from employee where id = #{id} </select> </mapper>
3.6 在核心配置文件中配置映射文件
<?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"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="cn/demo1/EmployeeMapper.xml"/> </mappers> </configuration>
3.7 导入MySQL的驱动
3.8 建立测试类
package cn.test; import cn.demo1.Employee; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.io.InputStream; /** * * 描述: */ public class MybatisTest { @Test public void demo1() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sqlSessionFactory.openSession(); Employee employee = session.selectOne("default.findById", 1); System.out.print(employee); session.close(); } }
怎么解决?数据库中的字段和POJO中的属性值不一样呢,通过别名,即通过将SQL的别名设置为POJO中对应的属性值。
<?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"> <mapper namespace="default"> <!-- namespace:命名空间 id:唯一标识 resultType:返回值类型 --> <select id="findById" parameterType="int" resultType="cn.demo1.Employee"> select id,last_name lastName,email,gender from employee where id = #{id} </select> </mapper>
4 Mybatis入门--HelloWorld的接口编程
4.1 新建一个接口
package cn.demo1; public interface IEmployeeDAO { public Employee findById(Integer id); }
4.2 修改EmployeeMapper.xml文件
<?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"> <mapper namespace="cn.demo1.IEmployeeDAO"> <!-- namespace:命名空间 指定为接口的全类名 id:唯一标识 和接口中的方法名相同 resultType:返回值类型 --> <select id="findById" parameterType="int" resultType="cn.demo1.Employee"> select id,last_name lastName,email,gender from employee where id = #{id} </select> </mapper>
4.3 测试
package cn.test; import cn.demo1.Employee; import cn.demo1.IEmployeeDAO; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.io.InputStream; /** * * 描述: */ public class MybatisTest { @Test public void demo1() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sqlSessionFactory.openSession(); IEmployeeDAO dao = session.getMapper(IEmployeeDAO.class); Employee employee = dao.findById(1); System.out.print(employee); session.close(); } }
5 SqlSession
- SqlSession代表和数据库的一次会话,用完必须关闭。
- SqlSession和Connection一样都是线程不安全的,每次使用都应该去获取新的对象。
- Mapper接口没有实现类,但是Mybatis会为这个接口生成代理对象。
以上是关于Mybatis的主要内容,如果未能解决你的问题,请参考以下文章
SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper
MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段