记一次成功使用mybatis

新建一个maven项目或spring项目或直接导入jar包,新建一个什么项目不重要,不同的只是引入依赖的方式

(似乎是spring约定大于配置的缘故,同样的配置方法在使用maven时能成功,使用spring就会出错,spring集成mybatis还要再学习一下)

需要的依赖有:mybatis,mysql数据库驱动

在Resource目录下,新建一个conf目录,在conf目录下新建一个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_mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/EmployeeMapper.xml"/>
    </mappers>
</configuration>

注意,使用旧版mysql connector时,需要指定useSSL,且值为false

也可以使用新版,需指定时区

(6条消息) Java连接Mysql数据库警告:Establishing SSL connection without server's identity verification is not recommend_渴望,就奋力追寻...-CSDN博客

(6条消息) 【已解决】com.mysql.jdbc.exceptions.jdbc4.CommunicationsExcepti:Communications link failure ----mysql连接报错_L_it123的博客-CSDN博客

填好数据库连接信息

填好mapper映射文件的路径。据说idea构建的maven项目,只能解析到resource目录下的xml文件,所以mapper映射文件也写在resource目录下

(6条消息) mybatis报错:Could not find resource mapper/UserMapper.xml_java知识整理-CSDN博客

编写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">
<mapper namespace="a">
    <select id="selectAll" resultType="com.mybatis.pojo.Employee">
    select *from tbl_employee where id = #{id}
  </select>
</mapper>

执行SQL语句的方式是命名空间+SQL语句的id,这里还没用到接口编程,namespace可以随便写

id是sql语句的唯一标识,resultType是Sql语句将返回的resultSet映射成resultType这种类型,映射就体现于此了!

如果没有写resultmap,那这个resultType就要写全。

最后写一下执行sql语句的方法。

public static void test()throws IOException
  {
      String resource = "conf/mybatis-config.xml";
      InputStream inputStream = Resources.getResourceAsStream(resource);
      SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      try (SqlSession session = sqlSessionFactory.openSession()) {
          Employee employee = session.selectOne("a.selectAll",1);
          System.out.println(employee);
      }finally {

      }

  }

 session.selectOne, 这个session所包含的方法是mybatis规定的,与我们在mapper.xml中定义的sql语句无关,方法名不是id名,我们所设定的id名,作为参数传给session类的方法。

mapper.xml的参数含义:

namespace:在调用sql语句的时候,需要给定sql语句的命名空间,即由命名空间加sql的id来确定调用哪个sql语句。为什么会有命名空间的存在?设想一下,如果不止一个mapper.xml,而他们含有相同的sql id,这个时候就会产生冲突。在不使用接口编程的情况下,命名空间的命名应该是随便的。如果使用了面向接口编程,编写了dao层接口,那应该保持dao层接口名字和命名空间一致。还要保持dao接口方法名与sql id一致。

resultType:将SQL语句查询的结果集映射成resultType的对象,如果没有设置resultmap的话,需要写resultType的全路径。

当使用了resultMap来映射的时候,sql标签里面不应该写resultType,而应该写resultMap

 在进行增删改操作时,由于获取到的SQLSession不会自动提交,所以需要手动提交数据 :session.commit()。这是知识盲区

如果获取Sqlsession时给openSession方法参数给一个true,就会自动提交,不用写commit()

mybatis允许增删改直接定义一下类型返回值:Integer Long Boolean

参数处理:

1) 单个参数

可以接受基本类型,对象类型。这种情况 MyBatis 可直接使用这个参数,不需要经过任何处理。

2) 多个参数

任意多个参数,都会被 MyBatis 重新包装成一个 Map 传入。Map key param1 param2,或者 0,1…,值就是参数的值

3) 命名参数

为参数使用@Param 起一个名字,MyBatis 就会将这些参数封装进 map 中,key 就是我们自己指定的名字

4) POJO

当这些参数属于我们业务 POJO 时,我们直接传递 POJO

5) Map

我们也可以封装多个参数为 map,直接传递

6) Collection/Array

会被MyBatis 封装成一个map 传入, Collection 对应的key 是collection,Array 对应的key

array. 如果确定是 List 集合,key 还可以是 list.

SQL注入是什么,如何避免SQL注入? (biancheng.net)

 学习junit和log4j势在必行

 

posted @ 2021-10-13 18:41  北征愚人  阅读(26)  评论(0编辑  收藏  举报