MyBatis配置文件中的常用配置

一、连接数据库的配置单独放在一个properties文件中

  之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中,如下:

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
 3 <configuration>
 4     <environments default="development">
 5         <environment id="development">
 6             <transactionManager type="JDBC" />
 7             <!-- 配置数据库连接信息 -->
 8             <dataSource type="POOLED">
 9                 <property name="driver" value="com.mysql.jdbc.Driver" />
10                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
11                 <property name="username" value="root" />
12                 <property name="password" value="XDP" />
13             </dataSource>
14         </environment>
15     </environments>
16     
17 </configuration>
复制代码

  其实我们完全可以将数据库的连接配置信息写在一个properties文件中,然后在conf.xml文件中引用properties文件,具体做法如下:

  1、在src目录下新建一个db.properties文件,如下图所示:

  

  在db.properties文件编写连接数据库需要使用到的数据库驱动,连接URL地址,用户名,密码,如下:

1 driver=com.mysql.jdbc.Driver
2 url=jdbc:mysql://localhost:3306/mybatis
3 name=root
4 password=XDP

  2、在MyBatis的conf.xml文件中引用db.properties文件,如下:

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
 3 <configuration>
 4 
 5     <!-- 引用db.properties配置文件 -->
 6     <properties resource="db.properties"/>
 7     <!-- 
 8         development : 开发模式
 9         work : 工作模式
10      -->
11     <environments default="development">
12         <environment id="development">
13             <transactionManager type="JDBC" />
14             <!-- 配置数据库连接信息 -->
15             <dataSource type="POOLED">
16                 <!-- value属性值引用db.properties配置文件中配置的值 -->
17                 <property name="driver" value="${driver}" />
18                 <property name="url" value="${url}" />
19                 <property name="username" value="${name}" />
20                 <property name="password" value="${password}" />
21             </dataSource>
22         </environment>
23     </environments>
24     
25 </configuration>
复制代码

二、为实体类定义别名,简化sql映射xml文件中的引用

  之前,我们在sql映射xml文件中的引用实体类时,需要写上实体类的全类名(包名+类名),如下:

<!-- 创建用户(Create) -->
<insert id="addUser" parameterType="me.gacl.domain.User">
    insert into users(name,age) values(#{name},#{age})
</insert>

  parameterType="me.gacl.domain.User"这里写的实体类User的全类名me.gacl.domain.User,每次都写这么一长串内容挺麻烦的,而我们希望能够简写成下面的形式

<insert id="addUser2" parameterType="_User">
    insert into users(name,age) values(#{name},#{age})
</insert>

  parameterType="_User"这样写就简单多了,为了达到这种效果,我们需要在conf.xml文件中为实体类="me.gacl.domain.User"定义一个别名为"_User",具体做法如下:
  在conf.xml文件中<configuration></configuration>标签中添加如下配置:

<typeAliases>
    <typeAlias type="me.gacl.domain.User" alias="_User"/>
</typeAliases>

  这样就可以为me.gacl.domain.User类定义了一个别名为_User,以后_User就代表了me.gacl.domain.User类,这样sql映射xml文件中的凡是需要引用me.gacl.domain.User类的地方都可以使用_User来代替,这就达到了一个简化实体类引用的目的。

  除了可以使用<typeAlias type="me.gacl.domain.User" alias="_User"/>这种方式单独为某一个实体类设置别名之外,我们还可以使用如下的方式批量为某个包下的所有实体类设置别名,如下:

复制代码
<!-- 配置实体类的别名,配置实体类别名的目的是为了在引用实体类时可以使用实体类的别名来代替实体类,达到简写的目的 -->
    <typeAliases>
        <!-- 为实体类me.gacl.domain.User配置一个别名_User -->
        <!-- <typeAlias type="me.gacl.domain.User" alias="_User"/> -->
        <!-- 为me.gacl.domain包下的所有实体类配置别名,MyBatis默认的设置别名的方式就是去除类所在的包后的简单的类名
        比如me.gacl.domain.User这个实体类的别名就会被设置成User
         -->
        <package name="me.gacl.domain"/>
    </typeAliases>
复制代码

  <package name="me.gacl.domain"/>就表示为这个包下面的所有实体类设置别名。MyBatis默认的设置别名的方式就是去除类所在的包后的简单的类名,比如me.gacl.domain.User这个实体类的别名就会被设置成User。

 

三、mappers(映射器)

      mapper用于,引入MyBatis关于数据库操作的映射。Mapper配置的几种常见的方法
      3.1 使用相对类路径的资源
  
<!-- 加载 映射文件 -->  
<mappers>  
    <!-- 注册userMapper.xml文件, 19 userMapper.xml位于com.baowei.mapping/这个包下,所以resource写成com/baowei/mapping/userMapper.xml -->  
    <mapper resource="com/baowei/mapping/userMapper.xml" />
</mappers> 

       3.2 使用Mapper接口的类路径(要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中)

            
  
<!-- 加载 映射文件 -->  
<mappers>  
    <mapper class="com.baowei.mapper.UserMapper" />  
</mappers> 
      3.3 注册指定包下的mapper接口(要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中)
           
 
<!-- 加载 映射文件 -->  
<mappers>  
    <package name="com.baowei.mapper" />  
</mappers> 

四、Java代码

首先创建DBHelper,用于封装SqlSessionFactory

package zdsoft.common;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class DBHelper {
    // GC不理static
    private static SqlSessionFactory factory = null;

    public static SqlSessionFactory getSqlSessionFactory() throws IOException {
        if (factory == null) {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            factory = new SqlSessionFactoryBuilder().build(inputStream);
        }
        return factory;
    }

    // 获得会话
    public static SqlSession getSession() throws IOException {
        return getSqlSessionFactory().openSession(true);
    }

    /**
     * 获得得sql会话
     * 
     * @param isAutoCommit
     *            是否自动提交,如果为false则需要sqlSession.commit();rollback();
     * @return sql会话
     * @throws IOException 
     */
    public static SqlSession getSession(boolean isAutoCommit) throws IOException {
        return getSqlSessionFactory().openSession(isAutoCommit);
    }
    
}
View Code

然后单元测试代码如下:

@Test
public void testInsert() throws IOException {
    // 获取session
    SqlSession session = DBHelper.getSession();
    // 获取mapper接口的代理对象
    StudentMapper studentMapper = session.getMapper(StudentMapper.class);
    // 调用代理对象方法
    Student stu = new Student();
    stu.setId(3);
    stu.setName("中华人民共和国");
    stu.setAge(100);
    studentMapper.insert(stu);
    // 关闭session
    session.close();
}
View Code

五、知识点的总结

1、  #{}和${}

#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换.#{}可以有效防止sql注入。#{}可以接受简单类型或者pojo属性值。如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

${}表示sql的拼接,通过${}接收参数,将参数的内容不加任何修饰拼接在sql中。${}也可以接收pojo数据,可以使用OGNL解析出pojo的属性值.缺点:不能防止sql注入。

2、  parameterType和resultType

parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。

resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。

 
说明:
原文地址:https://www.cnblogs.com/duanjt/p/8657238.html