1.什么是mybatis,为什么要引入,优点在哪
MyBatis实际上是Ibatis3.0版本以后的持久化层框架【也就是和数据库打交道的框架】!
如果使用原生的jdbc操作数据库需要经过多个步骤,这样就会出现许多繁琐的操作,还是机械的操作,一点也不智能,通过数据库连接池可以解决这个问题,但是这样前后端绑定在一起了,没有实现分层开发,不利于实际操作。
他的优点 :1.功能简单,sql语句编写在java代码,这属于硬编码高耦合。2.希望编写sql语句与java代码编写,将sql语句编写在xml配置文件中,实现数据表中记录到对象之间的映射!
sql和java编码分开,功能边界清晰,一个专注于业务,一个专注于数据,可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录,完成业务+底层数据库的媒介!
MyBatis是一个半自动化的轻量级的持久化层框架。
JDBC
– SQL夹在Java代码块里,耦合度高导致硬编码内伤
– 维护不易且实际开发需求中sql是有变化,频繁修改的情况多见
Hibernate和JPA
– 长难复杂SQL,对于Hibernate而言处理也不容易
– 内部自动生产的SQL,不容易做特殊优化。
– 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。 导致数据库性能下降。
对开发人员而言,核心sql还是需要自己优化,sql和java编码分开,功能边界清晰,一个专注业务、 一个专注数据。
二。具体的myBatis的编写。
1.创建一个数据库和表
CREATE DATABASE mytabis; CREATE TABLE tbl_employee( id INT(11) PRIMARY KEY AUTO_INCREMENT, last_name VARCHAR(255), gender CHAR(1), email VARCHAR(255) )
2.创建一个动态web工程,创建与上述数据表对应的实体类
package com.neuedu.bean; public class Employee { int id; @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("Employee [id="); builder.append(id); builder.append(", "); builder.append("lastName="); builder.append(lastname); builder.append(", "); builder.append("gender="); builder.append(gender); builder.append(", "); builder.append("email="); builder.append(email); builder.append("]"); return builder.toString(); } public Employee() { super(); } public Employee(int id, String lastname, int gender, String email) { super(); this.id = id; this.lastname = lastname; this.gender = gender; this.email = email; } String lastname; int gender; String email; /** * @return the id */ public int getId() { return id; } /** * @param id the id to set */ public void setId(int id) { this.id = id; } /** * @return the last_name */ public String getLast_name() { return lastname; } /** * @param last_name the last_name to set */ public void setLast_name(String lastname) { this.lastname = lastname; } /** * @return the gender */ public int getGender() { return gender; } /** * @param gender the gender to set */ public void setGender(int gender) { this.gender = gender; } /** * @return the email */ public String getEmail() { return email; } /** * @param email the email to set */ public void setEmail(String email) { this.email = email; } }
3.[参考mybatis官方文档]加入需要的jar包
log4j-1.2.17.jar //当然需要注意的是:log4j的jar包是需要log4j.xml文件的
mybatis-3.4.1.jar
mysql-connector-java-5.1.37-bin.jar
还要加在对应的驱动
4.创建mytabis-config.xml文件并将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/mytabis"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 将我们写好的sql映射文件一定要注册到全局配置文件中 --> <mappers> <mapper resource="EmployeeMapper.xml"/> </mappers> </configuration>
5.创建测试用例,.复制mybatis官方文档代码,代码如下:
public class MyBatisTest { @Test public void test() throws IOException { String resource = "mytabis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession =null; try{ //2.获取sqlSession实例,能直接执行已经映射的SQL语句 sqlSession= sqlSessionFactory.openSession(); //需要两个参数,第一个参数是sql语句的唯一标识, //第二个参数是执行sql要用的参数 Employee employee = sqlSession.selectOne("com.neuedu.mybatis.EmployeeMapper.selectEmp",1); System.out.println(employee); }catch(Exception e){ }finally{ sqlSession.close(); } } }
6. 创建sql语句的映射文件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="com.neuedu.mybatis.EmployeeMapper"> <!-- namespace:名称空间 id:sql语句的唯一标识 resultType:返回值类型 #{id}:接收参数传递过来的id值 --> <select id="selectEmp" resultType="com.neuedu.mybatis.bean.Employee"> select id,last_name lastName,gender,email from tbl_employee where id = #{id} </select> </mapper>
这样就配置好了,需要注意的是数据库的参数得使用自己的还要一一对应。数据表中也需要插入一些数据。
三.关键标签
1.mybatis.xml中存在一些属性
configuration 配置
properties 属性:可以加载properties配置文件的信息
settings 设置:可以设置mybatis的全局属性
typeAliases 类型命名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
databaseIdProvider 数据库厂商标识
mappers 映射器
<?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> <!-- properties用于加载 url本地磁盘 resource是类路径 --> <!-- environments可以配置数据库的环境 这里有一个子标签:environment,,有一个default属性,他指定的是jabc或者test,他决定了你所使用的数据库是哪个,该标签一定要包含tracnsactionManager和dataSoure
setting设置驼峰式命名,他可以将数据库中last_name转化成lastName,自动去掉了_和n的大写。
typeAliases是用来设置别名的,type指定要起类型全类名,默认别名就是类名小写。不建议使用,使用全类名更加规范。规范书写会减少许多不必要的麻烦。 --> <properties resource="jdbc.properties"> </properties> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings> <typeAliases> <package name="com.neuedu.bean" /> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClass}"/> <property name="url" value="${jdbc.jdbcUrl}"/> <property name="username" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> <!-- 将我们写好的sql映射文件一定要注册到全局配置文件中 --> <environment id="test" > <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${test.driverClass}"/> <property name="url" value="${test.jdbcUrl}"/> <property name="username" value="${test.user}"/> <property name="password" value="${test.password}"/> </dataSource> </environment> </environments> <mappers> <mapper class="com.neuedu.mapper=.EmployeeMapper"/> </mappers> </configuration>
四。配置一个第三方数据连接池
1.需要自定义一个类继承UnpooledDataSourceFactory类,然后在构造器中初始化该对应的dataSource属性
public class C3P0DataSource extends UnpooledDataSourceFactory{ public C3P0DataSource() { this.dataSource = new ComboPooledDataSource(); } }
2.配置mybatis的全局配置文件,导入c3p0-0.9.2.1.jar和mchange-commons-java-0.2.3.4.jar
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <!-- 配置使用第三方的数据源。属性需要配置为第三方数据源的属性 --> <dataSource type="com.neuedu.mapper.C3P0DataSource"> <property name="driverClass" value="${jdbc.driver}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment>
五.增删改查:他是写在具体的xml中,而不是配置文件中
<select></select>
<insert></insert>
<update></update>
<delete></delete>
<?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="com.neuedu.mapper.EmployeeMapper"> <!-- namespace:名称空间 id:sql语句的唯一标识 resultType:返回值类型 #{id}:接收参数传递过来的id值 --> <select id="selectEmp" resultType="com.neuedu.bean.Employee" > select * from tbl_employee where id =#{id} </select> <insert id="insert" > insert into tbl_employee values(null,#{lastname},#{gender},#{email}) </insert> </mapper>
六。具体的databaseIdProvider环境
<databaseIdProvider type="DB_VENDOR"> <property name="SQL Server" value="sqlserver"/> <property name="DB2" value="db2"/> <property name="Oracle" value="oralce" /> <property name="MySQL" value="mysql" /> </databaseIdProvider>
用他的value属性可以获得不同数据库连接,放在mybatis。当然连接数据库还需要配置数据库地址驱动和姓名密码,才可以进入使用。
不同数据库sql的执行
MySQL:INSERT INTO tbl_employee(user_name,email,gender) VALUES(#{userName},#{email},#{gender})
ORACLE:INSERT INTO employee(id,user_name,email) VALUES(test.seq.nextval,#{userName},#{email})
还需要注意的是经常查询出来的结果有的有属性,有的却没有,这可能和sql里面每一列的标题和创建的类的名字不是一一对应的,即使使用驼峰命名也不行。
比如说其中有一行是username,而employee的类中只有name,这样就不会匹配了。需要执行sql:select username name from tbl_employee。这样才可以,还需要注意的是查询不需要数据的提交,而增删改就需要sqlSession.commit();事务的提交。