zoukankan      html  css  js  c++  java
  • spring学习(三十六)--spring集成mybatis(一)

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

    本文介绍如何使用mybatis操作mysql数据库(未使用spring)。

    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 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操作并没有回滚,说明没有事务管理。

    个人理解,如有错误,欢迎指正!
  • 相关阅读:
    纯css3实现的超炫checkbox复选框和radio单选框
    css3和jquery实现的可折叠导航菜单(适合手机网页)
    HTML5 Canvas 梦幻的文字飞扬动画教程
    纯css3实现的圆形旋转分享按钮
    纯css3实现的创意图片放大镜
    java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.widget.TextView
    python的range函数与切片操作符
    python简单基础代码
    android笔记 : Content provider内容提供器
    android笔记:Service
  • 原文地址:https://www.cnblogs.com/gllegolas/p/11882480.html
Copyright © 2011-2022 走看看