mybetis d11

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();事务的提交。

    

原文地址:https://www.cnblogs.com/guomingyt/p/8075564.html