Mybatis学习笔记(一)

之前学习mybatis后自己动手做了笔记,分享出来给大家学习参考

第一部分:创建Mybatis程序以及对其的一些基本使用

下一篇会讲到mybatis的一些配置和其他功能

1.1 创建第一个Mybatis程序

1.1.1 创建一个maven工程

1.1.2 导入Mybatis和数据库驱动包和单元测试的依赖

  <dependencies>
        <!--    导入Mybatis的依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
<!--        导入数据库驱动包的依赖,连接数据库-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>
<!--        导入单元测试的依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

1.1.3 创建Mybatis的工具类获取SqlSession对象

public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 获取连接
     * @return
     */
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

1.1.4 编写mybatis-config.xml主配置文件

需要注意数据库中url的写法,mysql8.0以上需要添加时区

?serverTimezone=GMT

mapper标签下的resource属性需用‘ / ’而不是‘ . ’

<?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.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/ssm?serverTimezone=GMT"/>
                <property name="username" value="root"/>
                <property name="password" value="aA15815249122"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/wlt/mapper/Mapper.xml"/>
    </mappers>
</configuration>

1.1.5 编写mapper层中的Mapper.xml配置文件

Mapper.xml文件可以放在resources路径下,但目录结构需保持一致

默认放在java路径的mapper包,但需要pom.xml文件中添加:

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

否则会报错: Could not find resource com/wlt/mapper/Mapper.xml

原因:maven的约定大于配置,可能会遇到所写的配置文件无法导出或者生效

解决方法:在pom.xml文件手动添加过滤,将src/main/java中的xml或properties文件能够导出。

namespace中的包名要和Mapper接口中的包名一致

id:对应的namespace中的方法名

resultType:对应返回值的类型,需要传入全限定类名

<?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.wlt.mapper.UserMapper">
    <select id="findAllUser" resultType="com.wlt.domain.User">
    select * from user;
  </select>
</mapper>

1.1.6 创建数据库表中对应的实体类User

类型名需与数据库对应表的字段名保持一致

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

//省略构造方法和重写方法以及set和get方法

1.1.7 mapper层中编写UserMapper的接口

public interface UserMapper {

    /**
     * 查询所有人
     * @return
     */
    List<User> findAllUser();
}

1.1.8 进行测试,在测试包下编写对应的测试类

public class UserTest {

    @Test
    public void MyUserTest(){
        //调用MapperUtils的方法获取SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> allUser = mapper.findAllUser();
        for (User user : allUser) {
            System.out.println(user);
        }
        sqlSession.close();
    }
}

1.2 使用Mybatis进行CRUD操作

后续的操作核心只需要编写mapper接口的方法和对应xml文件的sql语句

1.2.1 查询操作示例

mapper接口的方法

/**
     * 通过id查询某个人
     * @param id
     * @return
     */
    User findUserById(int id);

mapper.xml文件中的sql语句

parameterType:传入参数的类型,即方法中参数的类型

  <select id="findUserById" resultType="com.wlt.domain.User" parameterType="int">
        select * from user where id=#{id};
    </select>

1.2.2 插入操作示例

增删改操作需要提交事务,测试方法中需要new User,不然程序识别不出

    /**
     * 插入一个用户信息
     * @param user
     */
    void insertUser(User user);
    <insert id="insertUser" parameterType="com.wlt.domain.User">
        insert into user (id,username,birthday,sex,address) values (#{id},#{username},#{birthday},#{sex},#{address});
    </insert>
/**
     * 测试插入一个用户的方法
     */
    @Test
    public void insertUserTest(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.insertUser(new User(1,"小吴","2018-05-11 15:20:03","男","广东潮州"));
        //提交事务
        sqlSession.commit();
        sqlSession.close();
    }

1.2.3 删除操作示例

/**
     * 通过id删除用户
     * @param id
     */
    void deleteUserById(int id);
   <delete id="deleteUserById" parameterType="int">
        delete from user where id=#{id};
    </delete>
/**
     * 根据id删除某个用户
     */
    @Test
    public void deleteUserByIdTest(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.deleteUserById(1);
        sqlSession.commit();
        sqlSession.close();
    }

1.2.4 修改操作示例

new User中需要有相应的构造函数,否则识别不出

public User(String username,String address,int id) {
        this.id = id;
        this.username = username;
        this.address = address;
    }
/**
     * 通过id修改某个用户的信息
     * @param user
     */
    void updateUserById(User user);
 <update id="updateUserById" parameterType="com.wlt.domain.User">
        update user set username=#{username},address=#{address} where id=#{id};
    </update>
/**
     * 根据id修改某个用户信息
     */
    @Test
    public void updateUserByIdTest(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.updateUserById(new User("阿贵","广东深圳",46));
        sqlSession.commit();
        sqlSession.close();
    }

1.2.5 解决无视实体类构造函数直接传参的问题

用Map集合传参,不使用实体类,这样实体类中不需要去创建对应的构造函数了,Map集合传参适用于数据库中字段较多的数据,当然也可以在实体类中创建对应的构造函数出来,因人而异

示例

<update id="updateUserByMap" parameterType="com.wlt.domain.User">
        update user set address=#{address} where id=#{id};
    </update>
 /**
     * 通过map集合传递参数,修改用户信息
     * @param map
     */
    void updateUserByMap(Map<String,Object> map);
/**
     * 通过Map集合传递参数,重新进行修改操作的测试
     */
    @Test
    public void updateUserByMap(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Map<String,Object> map = new HashMap<String, Object>();
        map.put("address","广东佛山");
        map.put("id",41);
        mapper.updateUserByMap(map);
        sqlSession.commit();
        sqlSession.close();
    }

1.2.6 模糊查询操作示例

使用通配符%%,一般有两种方式:

1. 在xml文件中的sql语句中写:%#{value}%

2. 在测试方法中的方法传参为:"%value%",可见如下代码

/**
     * 进行模糊查询的操作
     * @param obj
     * @return
     */
    List<User> findUserLike(Object obj);
<select id="findUserLike" resultType="com.wlt.domain.User" parameterType="object">
        select * from user where username like "%"#{obj}"%";
    </select>
/**
     * 进行模糊查询的测试
     */
    @Test
    public void FindUserLike(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //第一种方式
        List<User> users = mapper.findUserLike("小");
        //第二种方式
        List<User> users = mapper.findUserLike("%小%");
        for (User user : users) {
            System.out.println(user);
        }
        sqlSession.close();
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值