Mybatis入门基础----实现第一个程序(二)

创建一个Mybatis程序

详细可参考官网https://mybatis.org/mybatis-3/zh/getting-started.html

  • 在idea中建立一个maven工程
  • 添加mybatis、数据库驱动的jar包或者依赖
    在这里插入图片描述
  • 创建一个mybatis-confi.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">
<!--MyBatis配置-->
<configuration>
    <!--JDBC环境配置、选中默认开发者环境-->
    <environments default="development">
        <!--MySql数据库环境变量配置-->
        <environment id="development">
            <!--事务管理-->
            <transactionManager type="JDBC"/>
            <!--连接池(数据源)-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <!-- &转义&amp; -->
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_zr?serverTimezone=PRC&amp;useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
<!--    注册接口相应的mapper文件-->
    <mappers>
        <mapper resource="dao/UserMapper.xml"/>
    </mappers>
</configuration>

注意:注册mapper时如果为resouce属性,则包路径必须用/表示

  • 编写mybatis工具类
public class MyBatisUtils {
    
    
    private static SqlSessionFactory factory;
    //第一步,获取SqlSessionFactory对象
    static{
    
    
        //mybatis配置核心文件
        String resource="mybatis-config.xml";
        try {
    
    
            //将mybatis核心配置文件加载到内存中
            InputStream resourceAsStream = Resources.getResourceAsStream(resource);
            //通过SqlSessionFactoryBuilder构建SqlSessionFactory工厂会话
            factory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
    //有了SqlSessionFactory,可以从会话工厂中获取,SqlSession完全包含了面向数据库执行sql命令所需的所有方法
    public static SqlSession getSqlSession(){
    
    
        SqlSession sqlSession = factory.openSession();
        return sqlSession;
    }
}
  • 编写实体类
public class User {
    
    
    private Integer id;
    private String username;
    private String password;
    private Integer gender;
    private Date regist_time;

    public User(Integer id, String username, String password, Integer gender, Date regist_time) {
    
    
        this.id = id;
        this.username = username;
        this.password = password;
        this.gender = gender;
        this.regist_time = regist_time;
    }


    public User() {
    
    
    }

    public Integer getId() {
    
    
        return id;
    }

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

    public String getUsername() {
    
    
        return username;
    }

    public void setUsername(String username) {
    
    
        this.username = username;
    }

    public String getPassword() {
    
    
        return password;
    }

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

    public Integer getGender() {
    
    
        return gender;
    }

    public void setGender(Integer gender) {
    
    
        this.gender = gender;
    }

    public Date getRegist_time() {
    
    
        return regist_time;
    }

    public void setRegist_time(Date regist_time) {
    
    
        this.regist_time = regist_time;
    }

    @Override
    public String toString() {
    
    
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", gender=" + gender +
                ", regist_time=" + regist_time +
                '}';
    }
}
  • 编写dao接口类
public interface UserDao {
    
    
    List<User> selectUsers();
}
  • 接口实现类由原来的UserDaoImpl转变为了一个Mapper配置文件
<?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="dao.UserDao">
<!--    select查询语句-->
    <select id="selectUsers" resultType="entity.User">
        select * from t_user
    </select>
</mapper>

在这里插入图片描述
注意:SQL语句的标签要与SQL语法要相一致,否则会出错

  • Junit测试
public class Test {
    
    
    @org.junit.Test
    public void test(){
    
    
        //通过封装好的工具类获取SqlSession会话
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        //通过接口类型class获取接口对象实例(动态代理)
        UserDao userdao = sqlSession.getMapper(UserDao.class);
        //执行方法
        List<User> users = userdao.selectUsers();
        //遍历集合
        for (User user:users) {
    
    
            System.out.println(user);
        }
		//关闭SqlSession
        sqlSession.close();
    }
}

在这里插入图片描述
测试方法二:

public class Test {
    
    
    @org.junit.Test
    public void test(){
    
    
        //通过封装好的工具类获取SqlSession会话
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        //方法二:通过selectList直接执行方法(直接传入方法全限名即可)
        List<User> users = sqlSession.selectList("dao.UserDao.selectUsers");
        //遍历集合
        for (User user:users) {
    
    
            System.out.println(user);
        }
		//关闭SqlSession
        sqlSession.close();
    }
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

注意:如果出现资源过滤问题,生成的target目录中并没有Mapper.xml文件,因此需要在pom.xml中添加

 <build>
<!--   静态资源导出问题
目的是把src/main/java和src/main/resource目录中的xml文件和properties配置文件包含到输出结果中,
输出到classes目录中-->
        <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>

在这里插入图片描述

关于Mybatis中一些类的注意点
SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。

SqlSessionFactory
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession
每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。

猜你喜欢

转载自blog.csdn.net/weixin_45608165/article/details/113506133
今日推荐