spring学习(三十六)--spring集成mybatis

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

spring集成mybatis,可以方便快速的搭建和数据库的操作框架,实现对数据库的增删改查,以及数据库的事务操作。

1、安装mysql数据库,创建表user。

建表语句:

CREATE TABLE `user` (
  `id` bigint(255) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(50) DEFAULT NULL COMMENT '姓名',
  `age` varchar(50) DEFAULT NULL COMMENT '年龄',
  `sex` varchar(50) DEFAULT '性别',
  PRIMARY KEY (`id`),
  KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

2、代码中新增下列代码和配置文件:

3、修改pom.xml文件,增加mysql和mybatis依赖包:

<!-- mysql驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.13</version>
    </dependency>
    <!-- mybatis驱动包 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.1</version>
    </dependency>

4、增加mybatis配置:

mybatisCfg.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>
  
      <!-- 指定数据库连接信息的位置 -->
    <properties resource="mybatisConfig/database.properties"></properties>
    
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
        <!--引入映射文件 -->
        <mapper resource="mybatis/UserMapper.xml" />
    </mappers>
  </configuration>
  

database.properties:

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mytestdatabase?characterEcoding=utf-8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
username=qiaozhong
password=1

5、编写mybatis工具类MybatisUtil.java:

package mybatis.mybatisUtils;

import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public abstract class MybatisUtil {
    private static SqlSessionFactory factory=null;
    public static SqlSessionFactory getSqlSessionFactory(){
        if(factory==null){
        // 获得环境配置文件流
        InputStream config = MybatisUtil.class.getClassLoader().getResourceAsStream("mybatisConfig/mybatisCfg.xml");
        // 创建sql会话工厂
        factory = new SqlSessionFactoryBuilder().build(config);
        }
        return factory;
    }
    
    //获得会话
    public static SqlSession getSession(){
        return getSqlSessionFactory().openSession(true);
    }
    
    /**
     * 获得得sql会话
     * @param isAutoCommit 是否自动提交,如果为false则需要sqlSession.commit();rollback();
     * @return sql会话
     */
    public static SqlSession getSession(boolean isAutoCommit){
        return getSqlSessionFactory().openSession(isAutoCommit);
    }
}

6、创建数据表的DO文件user.java:

package mybatis.DO;

public class User {
    private Long id;

    private String name;

    private String age;

    private String sex;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age == null ? null : age.trim();
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex == null ? null : sex.trim();
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", age=" + age + ", sex="
                + sex + "]";
    }
    
}

7、编写dao层接口以及dao接口的实现类:

UserMapper.java

package mybatis.dao;

import java.util.List;
import mybatis.DO.User;

public interface UserMapper {
    int deleteByPrimaryKey(Long id);

    int insert(User record);

    User selectByPrimaryKey(Long id);

    List<User> selectAll();

    int updateByPrimaryKey(User record);
}

UserMapperImpl.java

package mybatis.daoImpl;

import java.util.List;
import mybatis.DO.User;
import mybatis.dao.UserMapper;
import mybatis.mybatisUtils.MybatisUtil;
import org.apache.ibatis.session.SqlSession;

public class UserMapperImpl implements UserMapper {
    
    /**
     * 实现图书类型数据访问
     *
     */
    @Override
    public List<User> selectAll(){
        //获得会话对象
        SqlSession session=MybatisUtil.getSession();
        try {
            //通过MyBatis实现接口BookTypeDAO,返回实例
            UserMapper UserMapper=session.getMapper(UserMapper.class);
            return UserMapper.selectAll();
        } catch(Exception e){
            e.printStackTrace();
            return null;
        } finally {
            session.close();
        }
    }
    
    @Override
    public int deleteByPrimaryKey(Long id) {
        //获得会话对象
        SqlSession session=MybatisUtil.getSession();
        try {
            //通过MyBatis实现接口BookTypeDAO,返回实例
            UserMapper UserMapper=session.getMapper(UserMapper.class);
            return UserMapper.deleteByPrimaryKey(id);
        } catch(Exception e){
            e.printStackTrace();
            return 0;
        } finally {
            session.close();
        }
    }
    
    @Override
    public int insert(User record) {
        //获得会话对象
        SqlSession session=MybatisUtil.getSession();
        try {
            //通过MyBatis实现接口BookTypeDAO,返回实例
            UserMapper UserMapper=session.getMapper(UserMapper.class);
            return UserMapper.insert(record);
        } catch(Exception e){
            e.printStackTrace();
            return 0;
        } finally {
            session.close();
        }
    }
    
    @Override
    public User selectByPrimaryKey(Long id) {
        //获得会话对象
        SqlSession session=MybatisUtil.getSession();
        try {
            //通过MyBatis实现接口BookTypeDAO,返回实例
            UserMapper UserMapper=session.getMapper(UserMapper.class);
            return UserMapper.selectByPrimaryKey(id);
        } catch(Exception e){
            e.printStackTrace();
            return null;
        } finally {
            session.close();
        }
    }
    
    @Override
    public int updateByPrimaryKey(User record) {
        //获得会话对象
        SqlSession session=MybatisUtil.getSession();
        try {
            //通过MyBatis实现接口BookTypeDAO,返回实例
            UserMapper UserMapper=session.getMapper(UserMapper.class);
            return UserMapper.updateByPrimaryKey(record);
        } catch(Exception e){
            e.printStackTrace();
            return 0;
        } finally {
            session.close();
        }
    }
    
}

8、编写测试类MybatisTest.java:

package mybatis.test;

import org.springframework.test.context.transaction.TransactionConfiguration;

import mybatis.DO.User;
import mybatis.dao.UserMapper;
import mybatis.daoImpl.UserMapperImpl;

public class MybatisTest {
    
    public static void main(String[] args) {
        try {
            UserMapper userMapper = new UserMapperImpl();
            User user = new User();
            user.setId(1L);
            user.setName("name1");
            user.setAge("25");
            user.setSex("male");
            userMapper.insert(user);
            
            System.out.println(1/0);
            
            User user2 = new User();
            user2.setId(2L);
            user2.setName("name2");
            user2.setAge("28");
            user2.setSex("female");
            userMapper.insert(user2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

测试结果:

第一个insert语句成功插入数据表;执行System.out.println(1/0)语句,抛异常,不能以0为分母;第二个inset语句没有执行。

 结果分析:

1、已成功连接本地数据库执行insert操作。

2、当方法抛出异常时候,第一个insert操作并没有回滚,说明没有事务操作。

猜你喜欢

转载自www.cnblogs.com/gllegolas/p/11882480.html