Mybatis学习(一)

Mybatis学习(一)

1、什么是Mybatis

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

持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的实现过程大多通过各种关系数据库来完成

持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。

mybatis的特点

  • 简单易学
  • 灵活
  • 解除sql与程序代码的耦合
  • 提供映射标签,支持对象与数据库的orm字段关系映射
  • 提供对象关系映射标签,支持对象关系组建维护
  • 提供xml标签,支持编写动态sql

2、第一个Mybatis程序

用Maven建的项目目录结构

在这里插入图片描述

注意这里是用Maven建的项目 (若不是用maven建的 注意要自己手动导包)

<!--导入依赖-->
    <dependencies>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--mybatis-->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!--junit 测试作用-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

mybatis的核心配置文件 mybatis-conf.xml 建议这样命名mybatis核心配置文件

<?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/jdbc?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="824008"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/song/mapper/UserMapperImpl.xml"/>
    </mappers>
</configuration>

mybatis工具类

//mybatis工具类获取sqlSession对象
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory ;
    //创建线程绑定对象
    private static ThreadLocal<SqlSession> th = new ThreadLocal<SqlSession>();
    //通过静态代码块 当类加载时 就会执行 可以得到sqlSessionFactory对象
    static {
        try {
            //获取sqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory =  new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("MybatisUtils工具类出现异常");
        }
    }
    //获取sqlSession对象
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }

}

实体类代码编写 (注意这里是按照我自己建的users表来建的 根据你们自己的表来建实体类)

public class User {
    private int id;
    private String name;
    private String password;
    private String email;
    private Date birthday;

    public User() {

    }

    public User(int id, String name, String password, String email, Date birthday) {
        this.id = id;
        this.name = name;
        this.password = password;
        this.email = email;
        this.birthday = birthday;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getBirthday() {
        return birthday;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", email='" + email + '\'' +
                ", birthday=" + birthday +
                '}';
    }
}

UserMapper接口(这里以查询所有信息为例)

public interface UserMapper{
    //查询所有信息
    public List<User> getUserList();
}

UserMapperImpl.xml(以前是UserMapperImp.java 实现类 这里改为Mapper xml配置文件来实现以前它的工作 建议写成UserMapper.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">
<!--namespace=绑定一个对应的Mapper接口-->
<mapper namespace="com.song.mapper.UserMapper">
<!--select查询语句-->
    <select id="getUserList" resultType="com.song.pojo.User">
       select * from jdbc.users
    </select>
</mapper>

测试

    @Test
    public void test(){
        //获取sqlSession对象
         SqlSession sqlSession = MybatisUtils.getSqlSession();

        //获取getMapper对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.getUserList();
        
        for(User user : userList){
            System.out.println(user);
        }
        //关闭资源
        sqlSession.close();
    }

3、Mybatis的CRUD操作

Mapper接口

public interface UserMapper {
    //查询所有信息
    public List<User> getUserList();

    //通过id查询信息
    public User getUserById(int id);

    //修改
    public void updateUser(User user);

    //插入
    public void insertUser(User user);

    //删除
    public void deleteUser(int id);
}

Mapper实现配置文件MapperImpl

<?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">
<!--namespace=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.song.mapper.UserMapper">

    <!--select查询语句-->
    <select id="getUserList" resultType="com.song.pojo.User">
       select * from jdbc.users
   </select>

    <!--通过id查询-->
    <select id="getUserById" resultType="com.song.pojo.User">
        select * from jdbc.users where id = #{id}
    </select>

    <!--修改名字-->
    <update id="updateUser" parameterType="com.song.pojo.User">
        update jdbc.users set `name` = #{name} where id=#{id};
    </update>

    <!--添加-->
    <insert id="insertUser" parameterType="com.song.pojo.User">
        insert into jdbc.users(id,name,password,email,birthday) values (#{id},#{name},#{password},#{email},#{birthday})
    </insert>

    <delete id="deleteUser" parameterType="com.song.pojo.User">
        delete from jdbc.users where id = #{id}
    </delete>
</mapper>

测试

@Test
    public void test(){
        //获取sqlSession对象
         SqlSession sqlSession = MybatisUtils.getSqlSession();

        //获取getMapper对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.getUserList();
        for(User user : userList){
            System.out.println(user);
        }
        //关闭资源
        sqlSession.close();
    }
    @Test
    public void getUserById(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        User userById = mapper.getUserById(1);

        System.out.println(userById);

        sqlSession.close();
    }

    @Test
    public void updateUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        Date parse = null;
        try {
            parse = new SimpleDateFormat("yyyy-MM-dd").parse("2000-8-12");
        } catch (ParseException e) {
            e.printStackTrace();
        }

        mapper.updateUser(new User(1,"赵四","456712","456712@qq.com",parse));

        sqlSession.commit(true);
        sqlSession.close();
    }

    @Test
    public void delete(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        mapper.deleteUser(1);

        sqlSession.commit(true);

        sqlSession.close();
    }

    @Test
    public void insert(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        Date parse = null;
        try {
            parse = new SimpleDateFormat("yyyy-MM-dd").parse("2000-8-12");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        mapper.insertUser(new User(1,"张飞","123456","123456@qq.com",parse));

        sqlSession.commit(true);

        sqlSession.close();
    }

4、常见遇到的问题

1.有可能用maven建的项目会遇到这个问题 org.apache.ibatis.binding.BindingException: Type interface com.kuang.dao.UserDao is not known to the MapperRegistry

解决方法

<!--在pom.xml中配置-->
<!--在build中配置resources,来防止我们资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

2.注意在mybatis-conf.xml配置文件中 配置路径不要写错了 不能写成com.song.mapper.UserMapperImpl

<mappers>
        <mapper resource="com/song/mapper/UserMapperImpl.xml"/>
</mappers>

3.在配置url的时候要主要这样配置 有可能改成useSSL=true 就会出错

<property name="url" value="jdbc:mysql://localhost:3306/jdbc?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>

MySQL在高版本需要指明是否进行SSL连接
SSL协议提供服务主要:
1)认证用户服务器,确保数据发送到正确的服务器;    .
2)加密数据,防止数据传输途中被窃取使用;
3)维护数据完整性,验证数据在传输过程中是否丢失;

4.要小心在写MybatisUtils工具类时 静态代码块出现异常 空指针异常!

若想更好的了解Mybatis建议自己阅读 Mybatis官方文档

推荐学习Mybatis的视频 B站: 遇见狂神说 或者 尚硅谷雷丰阳老师

谢谢大家的阅读! 若上面有写错的 欢迎纠正哦!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SC_IT

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

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

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

打赏作者

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

抵扣说明:

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

余额充值