Mybatis(一)

学习安排

1、Mybatis的介绍

2、Mybatis的入门

a) 使用jdbc操作数据库存在的问题

b) Mybatis的架构

c) Mybatis的入门程序

d) Mybatis解决jdbc编程的问题

e)mybatishibernate不同

3、Dao的开发方法

a) 原始dao的开发方法

b) 接口的动态代理方式

4、SqlMapConfig.xml文件说明

1. Mybatis介绍

  MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 201311月迁移到Github

  MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

Mybatis通过xml或注解的方式将要执行的各种statementstatementpreparedStatemntCallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

2. Mybatis入门

2.1使用jdbc编程问题总结

2.1.1 创建mysql数据库

创建数据库,将下图所示的sql脚本导入到数据库中。

导入后效果如下图:

2.1.2  创建工程

 开发环境:

IDEeclipse Neon Release (4.6.0)

JDK1.8

1、创建一个java工程。

2、导入下图中的jar包。

2.1.3  jdbc编程步骤:

 1、 加载数据库驱动

2、 创建并获取数据库链接

3、 创建jdbc statement对象

4、 设置sql语句

5、 设置sql语句中的参数(使用preparedStatement)

6、 通过statement执行sql并获取结果

7、 sql执行结果进行解析处理

8、 释放资源(resultSetpreparedstatementconnection)

2.1.4  jdbc代码 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class jdbcDemo {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {
            // 加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 通过驱动管理类获取数据库链接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "123");
            // 定义sql语句 ?表示占位符
            String sql = "select * from user where username = ?";
            // 获取预处理statement
            preparedStatement = connection.prepareStatement(sql);
            // 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
            preparedStatement.setString(1, "王五");
            // 向数据库发出sql执行查询,查询出结果集
            resultSet = preparedStatement.executeQuery();
            // 遍历查询结果集
            while (resultSet.next()) {
                System.out.println(resultSet.getString("id") + "  " + resultSet.getString("username"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放资源
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

2.1.5  jdbc问题总结如下:

1、 数据库连接创建、释放频繁造成系统资源浪费,从而影响系统性能。如果使用数据库连接池可解决此问题。

2、 Sql语句在代码中硬编码,造成代码不易维护,实际应用中sql变化的可能较大,sql变动需要改变java代码。

3、 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。

4、 对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。

2.2 Mybatis架构

1、 mybatis配置

SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。

mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂

3、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。

4、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。

5、 Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sqlid即是Mapped statementid

6、 Mapped Statementsql执行输入参数进行定义,包括HashMap、基本类型、pojoExecutor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。

7、 Mapped Statementsql执行输出结果进行定义,包括HashMap、基本类型、pojoExecutor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

 

2.3 Mybatis入门程序

2.3.1 mybatis下载

mybaits的代码由github.com管理

下载地址:https://github.com/mybatis/mybatis-3/releases

学习资料提供的mybatis如下:

mybatis-3.2.7.jar mybatis的核心包

lib文件夹 mybatis的依赖包所在

mybatis-3.2.7.pdf mybatis使用手册

2.3.2  业务需求

 使用MyBatis实现以下功能:

根据用户id查询一个用户

根据用户名称模糊查询用户列表

添加用户

更新用户

删除用户

2.3.3  环境搭建 

1  创建java工程

如下图使用之前创建的mybatis-first工程

2  加入jar

加入mybatis核心包、依赖包、数据驱动包。

  mybatis核心包

  依赖包

 

    数据驱动包(前面已经导入了)

3  加入配置文件

1.在原先创建好的资源文件夹config,加入log4j.propertiesSqlMapConfig.xml配置文件

  log4j.properties(日志文件)

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

SqlMapConfig.xml

<?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>
    <!-- 和spring整合后 environments配置将废除 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理 -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                    value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="123" />
            </dataSource>
        </environment>
    </environments>
</configuration>

SqlMapConfig.xmlmybatis核心配置文件,配置文件内容为数据源、事务管理。

2.创建pojo

pojo类作为mybatis进行sql映射使用,po类通常与数据库表对应

数据库user表如下图:

User.java如下

package pojo;

import java.util.Date;

public class User {
    private int id;
    private String username;// 用户姓名
    private String sex;// 性别
    private Date birthday;// 生日
    private String address;// 地址
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address="
                + address + "]";
    }
    
}

3.在config下的sqlmap目录下创建sql映射文件User.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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="test">
</mapper>

4.加载映射文件

 mybatis框架需要加载Mapper.xml映射文件

users.xml添加在SqlMapConfig.xml,如下:

 

a .实现根据id查询用户

 user.xml中添加select标签,编写sql

<?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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="test">
    <select id="queryUserById" parameterType="int" resultType="pojo.User">
        SELECT * FROM USER WHERE ID=#{ID}
    </select>
</mapper>

测试程序:

 1. 创建SqlSessionFactoryBuilder对象

 2. 加载SqlMapConfig.xml配置文件

 3. 创建SqlSessionFactory对象

 4. 创建SqlSession对象

 5. 执行SqlSession对象执行查询,获取结果User

 6. 打印结果

 7. 释放资源

创建测试程序MybatisTest.java,代码如下:

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;
import org.junit.Before;
import org.junit.Test;

public class MybatisTest {
    private SqlSessionFactory sqlSessionFactory;
    
    @Before
    public void init() throws IOException{
        // 1. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 2. 加载SqlMapConfig.xml配置文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 3. 创建SqlSessionFactory对象
        this.sqlSessionFactory=sqlSessionFactoryBuilder.build(inputStream);
    }
    @Test
    public void queryUserById(){
        // 4. 创建SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();    
        // 5. 执行SqlSession对象执行查询,获取结果User
        // 第一个参数是User.xml的statement的id,第二个参数是执行sql需要的参数;
        Object user = sqlSession.selectOne("queryUserById",10);
        // 6. 打印结果
        System.out.println(user);
        // 7. 释放资源
        sqlSession.close();
    }
}

运行结果:

b.根据用户名称模糊查询用户列表

1.在User.xml配置文件中添加如下内容:

2.MybatisTest.java中添加测试方法如下:

3.运行结果:

注意:

selectOne查询一条记录

selectList可以查询一条或多条记录

c.添加用户

1.在User.xml配置文件中添加如下内容:

注意:

a.value()里的的值,#{}里面的名字要和User.java里面的属性名相同

b.我们这里不用手动录入id的值,因为id是自增主键

如果我们要获取自动生成id的值,可以在User.xml的insert标签中添加以下代码:

2.MybatisTest.java中添加测试方法如下:

这里要注意红框中的代码,如果代码没加进去,数据将不会添加到数据库中去

3.运行结果:

4.数据库:

d.更新用户

1.在User.xml配置文件中添加如下内容:

 

2.MybatisTest.java中添加测试方法如下:

3.运行结果:

4.数据库:

e.删除用户

1.在User.xml配置文件中添加如下内容:

2.MybatisTest.java中添加测试方法如下:

3.数据库:

2.4  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定义输出结果的类型。

2.5 mybatishibernate不同 

Mybatishibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。

Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。

Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。

总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。

3. Dao开发方法

使用MyBatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper动态代理开发方法。

3.1. 需求

使用MyBatis开发DAO实现以下的功能

根据用户id查询一个用户信息

根据用户名称模糊查询用户信息列表

添加用户信息

3.2 SqlSession的使用范围

SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等。

SqlSession通过SqlSessionFactory创建

SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建。

1. SqlSessionFactoryBuilder

SqlSessionFactoryBuilder用于创建SqlSessionFacotySqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory创建的。所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。

2. SqlSessionFactory

SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory

3. SqlSession

SqlSession是一个面向用户的接口,sqlSession中定义了数据库操作方法。

每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。

打开一个 SqlSession;使用完毕就要关闭它。通常把这个关闭操作放到 finally 块中以确保每次都能执行关闭。如下:

SqlSession session = sqlSessionFactory.openSession();
try {
     // do work
} finally {
    session.close();
}

a. 原始Dao开发方式

原始Dao开发方法需要程序员编写Dao接口和Dao实现类。

1. 映射文件

编写映射文件如下:(这里我们使用入门程序完成的映射文件)

<?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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="test">
    <select id="queryUserById" parameterType="int" resultType="pojo.User">
        Select * From USER WHERE ID=#{v}
    </select>
    <select id="queryUserByUsername" parameterType="String" resultType="pojo.User">
        Select * from user where username like #{vv}
    </select>
    <insert id="insertUser" parameterType="pojo.User" >
        <selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int">
        SELECT LAST_INSERT_ID()
        </selectKey>
        INSERT INTO USER(username,birthday,sex,address) VALUE(#{username},#{birthday},#{sex},#{address})
    </insert>
    <update id="updateUser" parameterType="pojo.User">
        UPDATE USER SET username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} WHERE id=#{id};
    </update>
    <delete id="deleteUser" parameterType="int" >
        delete from user where id=#{vvv}
    </delete>
</mapper>

2. Dao接口

import java.util.List;

import pojo.User;

public interface UserDao {
    public User queryUserById(int id);
    public List<User> queryUserByUsername(String name);
    public void addUser(User user);
    public void updateUser(User user);
    public void deleteUser(int id);
}

3. Dao实现类

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import dao.UserDao;
import pojo.User;

public class UserDaoImpl implements UserDao {

    private SqlSessionFactory sqlSessionFactory;
    
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
        super();
        this.sqlSessionFactory = sqlSessionFactory;
    }

    @Override
    public User queryUserById(int id) {
        // 创建SqlSession
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        // 执行查询逻辑
        User user = sqlSession.selectOne("queryUserById", id);
        // 释放资源
        sqlSession.close();
        return user;
    }

    @Override
    public List<User> queryUserByUsername(String username) {
        // 创建SqlSession
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        List<User> list=sqlSession.selectList("queryUserByUsername", username);
        sqlSession.close();
        return list;
    }

    @Override
    public void addUser(User user) {
        // 创建SqlSession
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        sqlSession.insert("insertUser",user);
        sqlSession.commit();
        sqlSession.close();

    }

    @Override
    public void updateUser(User user) {
        // 创建SqlSession
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        sqlSession.insert("updateUser",user);
        sqlSession.commit();
        sqlSession.close();

    }

    @Override
    public void deleteUser(int id) {
        // 创建SqlSession
                SqlSession sqlSession = this.sqlSessionFactory.openSession();
                sqlSession.insert("deleteUser",id);
                sqlSession.commit();
                sqlSession.close();
    }

}

4. Dao测试

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

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.Before;
import org.junit.Test;

import dao.UserDao;
import dao.impl.UserDaoImpl;
import pojo.User;

public class UserDaoTest {
    private SqlSessionFactory sqlSessionFactory;
    
    @Before
    public void init() throws IOException{
        // 1. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 2. 加载SqlMapConfig.xml配置文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 3. 创建SqlSessionFactory对象
        this.sqlSessionFactory=sqlSessionFactoryBuilder.build(inputStream);
    }
    @Test
    public void queryUserByIdTest(){
        UserDao dao=new UserDaoImpl(this.sqlSessionFactory);
        User user = dao.queryUserById(10);
        System.out.println(user);
    }
    @Test
    public void queryUserByUsernameTest(){
        UserDao dao=new UserDaoImpl(this.sqlSessionFactory);
        List<User> user = dao.queryUserByUsername("%小%");
        for (User u : user) {
            System.out.println(u);
        }
    }
    @Test
    public void addUserTest(){
        UserDao dao=new UserDaoImpl(this.sqlSessionFactory);
        User u=new User();
        u.setUsername("鹤北");
        u.setSex("男");
        u.setBirthday(new Date());
        u.setAddress("中国广东");
        dao.addUser(u);
    }
    @Test
    public void updateUserTest(){
        UserDao dao=new UserDaoImpl(this.sqlSessionFactory);
        User u=new User();
        u.setId(33);
        u.setUsername("哈哈");
        u.setSex("男");
        u.setBirthday(new Date());
        u.setAddress("中国广东");
        dao.updateUser(u);
    }
    @Test
    public void deleteUserTest(){
        UserDao dao=new UserDaoImpl(this.sqlSessionFactory);
        dao.deleteUser(33);;
    }
}

5. 问题

原始Dao开发中存在以下问题:

1. Dao方法体存在重复代码:通过SqlSessionFactory创建SqlSession,调用SqlSession的数据库操作方法

2. 调用sqlSession的数据库操作方法需要指定statementid,这里存在硬编码,不得于开发维护。

b. Mapper动态代理方式

1. 开发规范

Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

Mapper接口开发需要遵循以下规范:

1、 Mapper.xml文件中的namespacemapper接口的类路径相同。

2、 Mapper接口方法名和Mapper.xml中定义的每个statementid相同

3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql parameterType的类型相同

4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sqlresultType的类型相同

2. UserMapper.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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="dao.UserMapper">
    <select id="queryUserById" parameterType="int" resultType="pojo.User">
        Select * From USER WHERE ID=#{v}
    </select>
    <select id="queryUserByUsername" parameterType="String" resultType="pojo.User">
        Select * from user where username like #{vv}
    </select>
    <insert id="insertUser" parameterType="pojo.User" >
        <selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int">
        SELECT LAST_INSERT_ID()
        </selectKey>
        INSERT INTO USER(username,birthday,sex,address) VALUE(#{username},#{birthday},#{sex},#{address})
    </insert>
    <update id="updateUser" parameterType="pojo.User">
        UPDATE USER SET username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} WHERE id=#{id};
    </update>
    <delete id="deleteUser" parameterType="int" >
        delete from user where id=#{vvv}
    </delete>
</mapper>

3. UserMapper(接口文件)

import java.util.List;

import pojo.User;

public interface UserMapper {
    public User queryUserById(int id);
    public List<User> queryUserByUsername(String name);
    public void insertUser(User user);
    public void updateUser(User user);
    public void deleteUser(int id);
}

4. 加载UserMapper.xml文件

修改SqlMapConfig.xml文件,添加以下所示的内容:

    <!-- 加载映射文件 -->
    <mappers>
        <mapper resource="sqlmap/User.xml" />
        <mapper resource="mapper/UserMapper.xml" />
    </mappers>

5. 测试

package test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

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.Before;
import org.junit.Test;

import dao.UserDao;
import dao.UserMapper;
import dao.impl.UserDaoImpl;
import pojo.User;

public class UserMapperTest {
    private SqlSessionFactory sqlSessionFactory;
    
    @Before
    public void init() throws IOException{
        // 1. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 2. 加载SqlMapConfig.xml配置文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 3. 创建SqlSessionFactory对象
        this.sqlSessionFactory=sqlSessionFactoryBuilder.build(inputStream);
    }
    @Test
    public void queryUserByIdTest(){
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.queryUserById(10);
        System.out.println(user);
        sqlSession.close();
    }
    @Test
    public void queryUserByUsernameTest(){
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> user = userMapper.queryUserByUsername("%小%");
        for (User u : user) {
            System.out.println(u);
        }
        sqlSession.close();
    }
    @Test
    public void addUserTest(){
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User u=new User();
        u.setUsername("鹤北");
        u.setSex("男");
        u.setBirthday(new Date());
        u.setAddress("中国广东");
        userMapper.insertUser(u);
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void updateUserTest(){
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User u=new User();
        u.setId(34);
        u.setUsername("哈哈");
        u.setSex("男");
        u.setBirthday(new Date());
        u.setAddress("中国广东");
        userMapper.updateUser(u);
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void deleteUserTest(){
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        userMapper.deleteUser(34);
        sqlSession.commit();
        sqlSession.close();
    }
}

4. SqlMapConfig.xml配置文件说明

4.1  配置内容

SqlMapConfig.xml中配置的内容和顺序如下:

 properties(属性)

settings(全局配置参数)

typeAliases(类型别名)

typeHandlers(类型处理器)

objectFactory(对象工厂)

plugins(插件)

environments(环境集合属性对象)

environment(环境子属性对象)

transactionManager(事务管理)

dataSource(数据源)

mappers(映射器)

4.2  properties(属性)

SqlMapConfig.xml可以引用java属性文件中的配置信息如下:

在config下定义db.properties文件,如下所示:

db.properties配置文件内容如下:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123 

SqlMapConfig.xml引用如下:

4.3  typeAliases(类型别名)

 例如:

第一种类型:

在SqlMapConfig.xml中配置如下:

在UserMapper.xml中配置如下:

 

第二种类型:

在SqlMapConfig.xml中配置如下:

在UserMapper.xml中配置如下:

 

4.4  mappers(映射器)

Mapper配置的几种方法:

4.4.1. <mapper resource=" " />

使用相对于类路径的资源(现在的使用方式)

如:<mapper resource="sqlmap/User.xml" />

4.4.2. <mapper class=" " />

使用mapper接口类路径

如:<mapper class="cn.itcast.mybatis.mapper.UserMapper"/>

注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中

4.4.3. <package name=""/>

注册指定包下的所有mapper接口

如:<package name="cn.itcast.mybatis.mapper"/>

注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中

原文地址:https://www.cnblogs.com/huozhonghun/p/9477725.html