1、Mybatis简介

以前称iBatis-->现在称mybatis

作用:封装jdbc操作,简化了数据库访问方式

封装功能如下:

(1)获得连接

(2)执行sql

(3)释放连接

(4)sql参数的设置(直接传递Emp实体对象作为参数)

sql语句的新写法:insert into emp (name,age) values (#{name},#{age});

其中#{name},#{age}即指代的是Emp实体的属性,名称要与实体的属性名一致

(5)封装了结果集映射成实体对象的过程

要求:实体类属性名要与ResultSet结果集中的列名保持一致

开发者的主要工作:写实体类以及sql语句,然后使用SqlSession对象执行sql操作

2、搭建MyBatis开发环境,并对Emp表进行操作

(1)引入相关的MyBatis的jar包

(2)添加一个配置文件,mybatis-config.xml,指定数据库连接参数,以及sql定义文件

(3)编写一个Emp实体类,属性名一般与Emp表中的字段表名称保持一致

(4)创建一个EmpSql.xml文件,里面编写相关的sql语句(定义sql,指定结果集需要映射称哪个实体类)

(5)利用mybatis-config.xml,得到SqlSession对象,即可执行某些数据库操作

添加一个mybatis-config.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>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=ture&characterEncoding=utf8"/>
        <property name="username" value="zlc"/>
        <property name="password" value="123456"/>
      </dataSource>
    </environment>
  </environments>
  <!--需要加载的sql定义文件 -->
  <mappers>
    <!--<mapper resource="org/mybatis/example/BlogMapper.xml"/>-->
  </mappers>
</configuration>

 创建一个实体类:

package com.zlc.entity;

public class User {
    private Integer user_id;
    private String  user_name;
    private Integer age;
    private Double  salary;
    public Integer getUser_id() {
        return user_id;
    }
    public void setUser_id(Integer user_id) {
        this.user_id = user_id;
    }
    public String getUser_name() {
        return user_name;
    }
    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }    
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Double getSalary() {
        return salary;
    }
    public void setSalary(Double salary) {
        this.salary = salary;
    }
   
}

创建一个UserMapper.xml

<!-- namespace名字随意,但是不能与项目中其他mapper中namespace名字相同 -->
<mapper namespace="userMapper">
   <!-- id指的是sql语句唯一标识 -->
   <select id="findAll" resultType="com.zlc.entity.User">
      select * from user
   </select>  
   
   <!-- 带一个参数的查询 -->
   <select id="findByName" parameterType="java.lang.String" 
   resultType="com.zlc.entity.User">
      select * from user where user_name = #{name}
   </select>
   
   <insert id="addUser" parameterType="com.zlc.entity.User">
       insert into user (user_name,age,salary) values (#{user_name},#{age},#{salary});
   </insert>
   
</mapper>

测试类:

public static void main(String[] args) throws IOException {
        String conf = "mybatis-config.xml";
        InputStream is = Resources.getResourceAsStream(conf);
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = ssf.openSession();
        User user1 = new User();
        user1.setUser_name("张凌超");
        user1.setAge(23);
        user1.setSalary(8000.0);    
        session.insert("addUser", user1);
        session.commit();
        List<User> userlist = session.selectList("findAll");     
        for(User user : userlist) {
            System.out.println(user.getUser_name());
            System.out.println(user.getSalary());
        }
        
    }

返回类型还可以指定为map类型

 

<!-- id指的是sql语句唯一标识,map是mybatis中对Map类型的简写,类似的还有string等 -->
   <select id="findAll" resultType="map">
      select * from user
   </select>

 

java代码:

List<Map<String,Object>> userlist = session.selectList("findAll");     
        for(Map<String,Object> m : userlist) {
            System.out.println(m.get("user_name"));
            System.out.println(m.get("age"));
        }

 

2、传递多个参数的方法.

(1)使用实体类传递参数,采用表达式指明参数,参数名称与实体类属性名称一致

<insert id="addUser" parameterType="com.zlc.entity.User">
       insert into user (user_name,age,salary) values (#{user_name},#{age},#{salary});
   </insert>

java代码:

User user1 = new User();
        user1.setUser_name("张凌超");
        user1.setAge(23);
        user1.setSalary(8000.0);    
        session.insert("addUser", user1);
        session.commit();//增删改必须要有这个操作才生效

(2)使用Map类集合,采用表达式指明参数,参数名称与Map集合key一致

<insert id="addUser" parameterType="map">
       insert into user (user_name,age,salary) values (#{user_name},#{age},#{salary});
   </insert>

java代码:

Map<String,Object> user1 = new HashMap<>();
        user1.put("user_name","王五");
        user1.put("age", 20);
        user1.put("salary",5609);
        session.insert("addUser", user1);
        session.commit();//增删改必须要有这个事务提交操作

 3、返回值类型

(1)实体类

(2)Map集合类

(3)基本类型

常见问题:

(1)实体类属性与数据库中表的列名不一致时,怎么办?

解决1:sql语句查询时使用别名,例如:select user_name name from user

解决2:不使用resultType映射结果集,而是采用resultMap,例如:

 

<select id="findPart" resultMap="userMap">
      select user_id,user_name,age,salary from user
   </select>
   <resultMap type="com.zlc.entity.User" id="userMap">
       <!-- property指的是实体类User的属性名,
            而column指的是结果集中的列名,这里描述他们的对应关系 ,
            这里未指明的映射关系,则默认实体类的某个属性,对应结果集中名称一致的列-->

       <!-- id标志映射主键值 -->
       <id property="id" column="user_id"></id>
       <!-- result标志映射其他属性 -->
       <result property="name" column="user_name"/>
   </resultMap>