Mybatis入门之增删改查

一:Mybatis

1、mybatis简介

1.1、 mybatis历史

MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。

iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。

1.2、MyBatis特性

  1. MyBatis是一个开源、轻量级的数据持久层框架,它支持定制SQL语句的高级映射。

  2. MyBatis是一个半自动对象关系映射(object relational mapping, ORM)框架,它使用简单的XML文件或注解在对象模型和关系型数据库之间建立映射关系,通过对象去操作数据库表中的数据。

  3. MyBatis内部封装了JDBC,简化了加载驱动、创建连接、创建statement等烦琐的过程。

  4. MyBatis具有以下特点。

        (1)MyBatis是免费开源的,它是最简单的持久层框架,小巧且简单易学。

        (2)MyBatis与JDBC相比,减少了至少50%的代码量。

        (3)MyBatis在XML文件中编写SQL语句,和程序逻辑代码分离,降低了耦合度。这样就不会对应用程序或数据库的现有设计有任何影响,便于统一管理和优化,也提高了代码的可重用性。

        (4)MyBatis提供了XML元素,支持编写动态SQL语句。(5)MyBatis提供了映射元素,支持Java对象属性与数据库字段的关系映射。

1.3、MyBatis下载

MyBatis下载地址:Releases · mybatis/mybatis-3 · GitHub   Assets

1.4、 与Java web中的DAO层的对比

需要手动传参数以及使用ResultSet手动获取结果集,还需要手动拼接动态数据。很麻烦。

public int addToCart(Cart cart) {
    // TODO Auto-generated method stub
    //设置参数
    String sql = "insert into cart values(?,?,?,?,?,?,?,?)";
    //手动传参
    Object[] params =new Object[] {cart.getId(),cart.getGood_id(),cart.getUser_name(),cart.getIntro(),cart.getAmount(),cart.getPrice(),cart.getTotal_price(),cart.getCover()};
    //手动执行数据库语句
    int result = exceuteUpdate(sql, params);
    return result;
  }

  @Override
  public List<Goods> findGoodList(Goods goods){
    Goods goosGoods =null;
    //数据库语句
    String sql = "select g.*,t.name as typename from goods g LEFT JOIN type t on g.type_id = t.id  where 1=1";
    //条件拼接 格式太复杂
    if (goods.getName()!=null&&!"".equals(goods.getName().trim())) {
      sql += " and g.name like'%"+goods.getName()+"%'";
    }
    if (goods.getId()!=0) {
      sql += " and g.id='"+goods.getId()+"'";
    }
    if (goods.getType_id()!=0) {
      sql += " and g.type_id='"+goods.getType_id()+"'";
    }
    //手动执行数据库语句
    ResultSet rs = querySql(sql);
    List<Goods> list = new ArrayList<>();
    if(rs!=null) {
      try {
        while (rs.next()) {
          //依次手动获取结果集
          
           goosGoods = new Goods(rs.getInt("id"),rs.getString("typename"),rs.getString("name"), rs.getString("cover"), rs.getString("image1"), rs.getString("image2"), rs.getFloat("price"), rs.getString("intro"), rs.getInt("stock"), rs.getInt ("type_id"));
           list.add(goosGoods);
        }
      } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    } 
    return list;
  }

1.5 mybatis的工作流程

(1)读取核心配置文件。mybatis-config.xml是MyBatis的全局配置文件,名称可自定义。
(2)加载映射文件。mapper.xml是SQL映射文件,名称可自定义,需要在核心配置文件中加载。
(3)创建会话工厂。根据MyBatis的核心配置文件创建会话工厂SqlSessionFactory。
(4)创建会话对象。通过SqlSessionFactory创建会话对象SqlSession,提供执行SQL语句的所有方法。
(5)创建执行器。创建执行器Executor用于操作数据库。
(6)封装映射信息。Executor将待执行的SQL语句的信息封装到MappedStatement对象中,存储要映射的SQL语句的唯一标识、参数等,同时动态生成需要执行的SQL语句。
(7)操作数据库。根据动态生成的SQL语句操作数据库。
(8)输出结果映射。执行SQL语句后,通过MappedStatement对象将输出结果映射到Java对象中

2、搭建mybatis

2.1 开发环境

1、 mysql 5.x.x

2、 Mybatis 3.5.2

注意:

MySQL不同版本的注意事项

1、驱动类driver-class-name

MySQL 5版本使用jdbc5驱动,驱动类使用:com.mysql.jdbc.Driver

MySQL 8版本使用jdbc8驱动,驱动类使用:com.mysql.cj.jdbc.Driver

2、连接地址url

MySQL 5版本的url:

jdbc:mysql://localhost:3306/ssm

MySQL 8版本的url:

jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC

否则运行测试用例报告如下错误:

java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or

represents more

2.2 创建web项目导入jar包

mysql-connector-java-5.1.13.jar

mybatis-3.5.2.jar

2.3、创建MyBatis的核心配置文件

习惯上命名为mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合Spring

之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。

核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息

核心配置文件存放的位置是Java resources/src目录下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "https://mybatis.org/dtd/mybatis-3-config.dtd">
​
<configuration>
 <!--数据库配置-->
 <environments default="development">  <!--运行环境-->
   <environment id="development">
        <transactionManager type="JDBC"/>   <!--事务管理器为 JDBC-->
        <dataSource type="POOLED">  <!--数据源-->
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatistest?characterEncoding=utf-8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>   
        </dataSource>
    </environment>
 </environments>
 
 <!-- 引入mybatis的映射文件所在路径  xxx.xml  -->
 <mappers>
 <!--  1.  <mapper resource="com/mapper/AdminMapper.xml"/>-->
 <!--  2.  
     映射文件必须与接口(数据库操作方法接口)在同一个包里
     映射文件名必须与接口名一致   (AdminMapper)
  -->
 <package name="com.mapper"></package>
 </mappers>
</configuration>

2.4、创建mapper接口

MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要

提供实现类。

public interface UserMapper {
    
    /**
    * 添加用户信息
    */
    int insertUser();
}

2.5、创建MyBatis的映射文件

1、映射文件的命名规则:

表所对应的实体类的类名+Mapper.xml

例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml

因此一个映射文件对应一个实体类,对应一张表的操作

MyBatis映射文件用于编写SQL,访问以及操作表中的数据

MyBatis映射文件存放的位置与mapper接口同一个包里

2、 MyBatis中可以面向接口操作数据,要保证两个一致:

a>mapper接口的全类名和映射文件的命名空间(namespace)保持一致

b>mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致

<?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.mapper.UserMapper">  <!-- mapper接口中的全类名与namespace一致 -->
  <!--int insertUser(); mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致-->
  <insert id="insertUser">
    insert into t_user values(null,'admin','123456',23,'男','12345@qq.com')
  </insert>
</mapper>

2.6、创建JavaBean   bean里的属性对应数据库字段,要一样。

数据库字段:

对应的JavaBean:

package com.mybatis.pojo;

public class User {

	int id;
	String userName;
	String userPassword;
	String sex;
	int age;
	
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	public User(int id, String userName, String userPassword, String sex, int age) {
		super();
		this.id = id;
		this.userName = userName;
		this.userPassword = userPassword;
		this.sex = sex;
		this.age = age;
	}
	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 getUserPassword() {
		return userPassword;
	}
	public void setUserPassword(String userPassword) {
		this.userPassword = userPassword;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", userName=" + userName + ", userPassword=" + userPassword + ", sex=" + sex
				+ ", age=" + age + "]";
	}
	
}

2.7、测试  创建测试类

public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub
    //读取MyBatis的核心配置文件
    InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
    //创建SqlSessionFactoryBuilder对象
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    //通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
    SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
    //创建SqlSession对象,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务
    //SqlSession sqlSession = sqlSessionFactory.openSession();
    //创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交
    SqlSession sqlSession = sqlSessionFactory.openSession(true);
    //通过代理模式创建UserMapper接口的代理实现类对象
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    //调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配
    //映射文件中的SQL标签,并执行标签中的SQL语句
    int result = userMapper.insertUser();
    //sqlSession.commit();
    System.out.println("结果:"+result);
  }

2.8、加入log4j日志功能

  • 加入jar包: log4j-1.2.17.jar log4j-api-2.11.2.jar log4j-core-2.11.2.jar slf4j-api-1.7.26.jar slf4j-log4j12-1.7.26.jar

  • 加入log4j的配置文件:log4j.properties

log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

控制台就可以输出执行日志

3、优化核心配置文件

3.1优化核心配置文件mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
​
  <!-- 引入properties配置文件,以后所有的数据库操作都可以通过 ${key}来读取信息,
        实现配置集合 -->
  <properties resource="jdbc.properties">
  
  </properties>
  
  <!--驼峰命名规则-->
  <settings>
       <setting name="mapUnderscoreToCamelCase" value="true"/>
  </settings>
 
 <environments default="development">
   <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
        <!--未配置properties时写的数据库连接方式,放在前面讲
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/buyerapp?characterEncoding=utf-8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>    --> 
        
        <!-- 写完jdbc.properties后数据库的连接方式 -->
        <property name="driver" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>
 </environments>
 
 <!-- 引入mybatis的映射文件  -->
 <mappers>
 <!--  <mapper resource="com/mapper/AdminMapper.xml"/>-->
 <!-- 
     映射文件必须与接口在同一个包里
     映射文件名必须与接口名一致   (AdminMapper)
  -->
 <package name="com.mapper"></package>
 </mappers>
</configuration>

创建 jdbc.properties文件,与mybatis-config.xml同一目录下

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/buyerapp?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456
jdbc.initialPoolSize=5
jdbc.minPoolSize=1
jdbc.maxPoolSize=10

3.2、优化读取配置文件

分装工厂类 SqlSessionUtil

public static SqlSession getSession() {
    SqlSession sqlSession = null;
    try {
      InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
      
      SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
      SqlSessionFactory sqlSessionFactory = sessionFactoryBuilder.build(is);    
      sqlSession=sqlSessionFactory.openSession(true);
      
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return sqlSession;
    
  }

读取

  //调用SqlSessionUtil类静态方法
    SqlSession session = SqlSessionUtil.getSession();
    //通过session获取接口实例话对象
    UserMapper userMapper = session.getMapper(UserMapper.class);
    int result = userMapper.insertUser();

4、MyBatis 的增删改查

4.1 新增

  <!--  int insertUser();  -->
  <insert id="insertUser">
    insert into t_user values(null,'liming','123456','男',25)  
  </insert>

4.2 删除

  <!-- int deleteUser();  -->
  <delete id="deleteUser">
      delete from t_user where id=1
  </delete>

4.3修改

  <!--  int updataUser();  -->
  <update id="updataUser">
     update t_user set userName='czh',userPassword='654321' where id=2  
  </update>

4.4查询

  1. 查询一条数据

      <!--  User selectUser(); -->
      <select id="selectUser" resultType="com.mybatis.pojo.User">
          select * from t_user where id=2
      
      </select>
  2. 查询多条数据

      <!-- List<User> selectAllUser();   -->
      <select id="selectAllUser" resultType="com.mybatis.pojo.User">
         select * from t_user
      </select>

注意:

1、查询的标签select必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射

关系。

resultType:自动映射,用于属性名和表中字段名一致的情况

resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况

parameterType和 parameterMap与上面情况一致。用于表示参数类型。方法有参数时需要加上

有哪里出错或有疑问的评论区留言哦~有问必答,有错必改。 

  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小陈编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值