MyBatis入门学习笔记之一

1.MyBatis介绍

 MyBatis是一个优秀的持久性框架,它对jdbc的操作进行封装,是开发者只需关注sql本身,而不需花精力去处理注册驱动、创建连接,创建statement等繁杂的过程。

    原理:MyBatis通过xml或注解的方式将要执行的各种statement配置起来,通过java对象和statement的sql进行映射生成最终执行的sql语句,最后由MyBatis框架执行sql语句映射到java对象并返回。

2.MyBatis入门

mybatis的核心架构 

 

图片转载至服务器之家  连接:

MyBatis开发步骤

1.创建持久化po类。

2.创建全局配置文件SqlMapConfig.xml

3.编写映射文件Mapper.xml

4.在SqlMapConfig.xml中加载映射文件

5.编写测试程序

  测试程序的步骤如下:

  • 读取配置文件
  • 通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂

  • 通过SqlSessionFactory创建SqlSession

  • 调用SqlSession中的操作数据库的方法
  • 关闭SqlSession

 案例:

1编写持久类

package oyb.domain;

import java.io.Serializable;
import java.util.Date;

public class User  implements Serializable{

    private  int id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + 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 Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

编写全局配置文件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>

    <!--配置mybatis的环境信息-->
    <environments default="development">
        <environment id="development">
            <!--配置JDBC事务控制,由mybatis管理-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源,采用dbcp连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatisday01?useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

在src目录下创建sqlmap这个包,在包里面创建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">
<mapper namespace="user">
    <!--
        id:statement的id,要求在命名空间内唯一
        parameterType:传入的参数类型
        resultType:返回的类型
        #{id}:表示该占位符待接收参数的名称为id。
    -->
    <select id="findUserById" parameterType="int" resultType="oyb.domain.User">
        SELECT * FROM USER WHERE id = #{id}
    </select>
</mapper>

在SqlMapConfig.xml中配置映射

<mappers>
        <mapper resource="oyb/sqlmap/User.xml"></mapper>
</mappers>

测试类:

package oyb.test;

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.Test;
import oyb.domain.User;

import java.io.IOException;
import java.io.InputStream;


public class test {

    @Test
    public void test() throws Exception {
        //读取配置文件
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
        //通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
        //通过SqlSessionFactory创建SqlSession
        SqlSession sqlSession = sessionFactory.openSession();
        //调用SqlSession操作数据库的方法
        User user = sqlSession.selectOne("findUserById", 28);
        System.out.println(user);
    }
}

 插入用户,在Mapper.xml文件中

<insert id="insertUser" parameterType="oyb.domain.User">
        INSERT  INTO USER(username,birthday,sex,address)
        VALUES (#{username},#{birthday},#{sex},#{address})
</insert>

在test类中

sqlSession.insert("insertUser",new User("pengzhen",new Date(),"1","dongguan"));
sqlSession.commit();

其他的操作类似,不做过多的介绍

3.mapper代理方式

在实际开发过程中,我们只需要编写mapper接口,mybatis会自动为mapper接口生成动态代理类

编写步骤

  • 在工程中创建一个新的包,mapper,再创建一个名为UserMapper的接口
package oyb.mapper;

import oyb.domain.User;

public interface UserMapper {
    public void insertUser(User user);
    public User findUserById(int id);
}
  • 在mapper下创建UserMapper.xml文件,文件名一定要和UserMapper接口一样
<?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="oyb.mapper.UserMapper">
    <!--
        id:statement的id,要求在命名空间内唯一
        parameterType:传入的参数类型
        resultType:返回的类型
        #{id}:表示该占位符待接收参数的名称为id。
    -->
    <select id="findUserById" parameterType="int" resultType="oyb.domain.User">
        SELECT * FROM USER WHERE id = #{id}
    </select>

    <insert id="insertUser" parameterType="oyb.domain.User">
        INSERT  INTO USER(username,birthday,sex,address)
        VALUES (#{username},#{birthday},#{sex},#{address})
    </insert>
</mapper>

全局配置文件

<mappers>
        <mapper resource="oyb/mapper/UserMapper.xml"></mapper>
    </mappers>

测试类

package oyb.test;

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 oyb.domain.User;
import oyb.mapper.UserMapper;

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


public class test {
    SqlSessionFactory sessionFactory;
    @Before
    public void setup()throws Exception{
//读取配置文件
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
        //通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂
        sessionFactory = new SqlSessionFactoryBuilder().build(is);
    }
    @Test
    public void test() throws Exception {

        SqlSession session = sessionFactory.openSession();
        UserMapper userMapper = session.getMapper(UserMapper.class);
        User user = new User();
        user.setUsername("oybbbb");
        userMapper.insertUser(user);
        session.commit();
        session.close();

    }

}

可以在src目录下配置db.properties文件

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatisday01?useUnicode=true&amp;characterEncoding=utf8
name=root
password=123456

全局配置文件就可以这样写

<?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="db.properties"></properties>
    <!--配置mybatis的环境信息-->
    <environments default="development">
        <environment id="development">
            <!--配置JDBC事务控制,由mybatis管理-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源,采用dbcp连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${driverClass}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${name}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="oyb/mapper/UserMapper.xml"></mapper>
       <!-- <mapper resource="oyb/sqlmap/User.xml"></mapper>-->
    </mappers>


</configuration>

 5.MyBatis的映射文件

1.输入映射parametertype


上面的例子已经介绍了往parameterType传递简单类型以及持久对象类型,下面介绍如果parameterType是包装类型的情况

编写包装类

package oyb.vo;

import oyb.domain.User;

public class UserQueryVO {
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

修改UserMapper.xml文件

 <select id="findUserList" parameterType="userQueryVO" resultType="user">
        SELECT * FROM USER  WHERE sex = #{user.sex} AND username LIKE '%${user.username}%'
 </select>

编写测试类

    @Test
    public void test3() throws Exception {

        SqlSession session = sessionFactory.openSession();
        UserMapper userMapper = session.getMapper(UserMapper.class);

        UserQueryVO vo = new UserQueryVO();

        User user = new User();
        user.setUsername("oy");
        user.setSex("2");
        vo.setUser(user);
        List<User> userList = userMapper.findUserList(vo);
        System.out.println(userList);

        session.close();

    }

2.输出映射resultType

简单类型跟持久化类型上面的例子已经讲到了,而持久类pojo列表和pojo对象是一样的都是类名。

 

6.动态SQL


if标签:作为判断传入的参数

where标签

修改UserMapper.xml文件

<select id="findUserList" parameterType="userQueryVO" resultType="user">
        SELECT * FROM USER
        <where>
            <if test="user != null">
                <if test="user.sex != null and user.sex != '' ">
                    sex = #{user.sex}
                </if>
                <if test="user.username != null and user.username != '' ">
                   AND  username LIKE '%${user.username}%'
                </if>
            </if>

        </where>
</select>

foreach的遍历

案例查询指定id的用户

UserQueryVO

package oyb.vo;

import oyb.domain.User;

import java.util.List;

public class UserQueryVO {
    private User user;
    private List<Integer>ids;

    public List<Integer> getIds() {
        return ids;
    }

    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

UserMapper.xml

<select id="findUserList" parameterType="userQueryVO" resultType="user">
        SELECT * FROM USER
        <where>
            <if test="ids !=null and ids.size >0">
                <foreach collection="ids" item="id" open="And id IN (" close=")" separator=",">
                    ${id}
                </foreach>

            </if>
        </where>
    </select>

测试方法

  @Test
    public void test4() throws Exception {

        SqlSession session = sessionFactory.openSession();
        UserMapper userMapper = session.getMapper(UserMapper.class);

        UserQueryVO vo = new UserQueryVO();
        List<Integer> ids = new ArrayList<Integer>();
        ids.add(34);
        ids.add(10);
        ids.add(16);
        vo.setIds(ids);
        System.out.println(userMapper.findUserList(vo));
        session.close();

    }

 

posted @ 2019-03-30 23:55  微命  阅读(139)  评论(0编辑  收藏  举报