mybatis学习笔记(2)-入门实例

xiaoxiao2021-02-28  47

目标

使用mybatis完成对单个表的CRUD操作

步骤

使用idea新建一个maven项目,这个相信大家都会,就不啰嗦了。

配置pom.xml文件

<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.11.0</version> </dependency> <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> </dependencies>

mybatis配置文件:

<settings> <setting name="logImpl" value="STDOUT_LOGGING"></setting> </settings> <!-- 和spring整合后 environments配置将废除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理,事务控制由mybatis--> <transactionManager type="JDBC" /> <!-- 数据库连接池,由mybatis管理--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis001?characterEncoding=utf-8" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> <!-- 加载映射文件--> <mappers> <mapper resource="mapper/User.xml"/> </mappers>

其中这一段配置能将mybatis的sql语句执行过程打印在控制台上,方便debug,具体截图后面有

<settings> <setting name="logImpl" value="STDOUT_LOGGING"></setting> </settings>

log4j.properties配置文件:

# Global logging configuration log4j.rootLogger=ERROR,WARN,INFO,DEBUG # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender #配置日志信息的布局格式 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

User.xml配置

<!-- namespace 命名空间,作用就是对sql进行分类化管理,理解为sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用 --> <mapper namespace="test"> <!-- 在映射文件中配置很多sql语句 --> <!--需求:通过id查询用户表的记录 --> <!-- 通过select执行数据库查询 id:标识映射文件中的sql,称为statement的id 将sql语句封装到mappedStatement对象中,所以将id称为statement的id parameterType:指定输入参数的类型 #{}标示一个占位符, #{value}其中value表示接收输入参数的名称,如果输入参数是简单类型,那么#{}中的值可以任意。 resultType:指定sql输出结果的映射的java对象类型,select指定resultType表示将单条记录映射成java对象 --> <select id="findUserById" parameterType="int" resultType="com.will.entiy.User"> SELECT * FROM user WHERE id=#{value} </select> <!-- 根据用户名称模糊查询用户信息,可能返回多条 resultType:指定就是单条记录所映射的java对象类型 ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。 使用${}拼接sql,引起 sql注入 ${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能使用value --> <select id="findUserByName" parameterType="java.lang.String" resultType="com.will.entiy.User"> SELECT * FROM user WHERE username LIKE '%${value}%' </select> </mapper>

最后测试类:

@Test public void findUserByIdTest() throws IOException { // mybatis配置文件 String resource = "mybatis-config.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); //创建会话工厂,传入mybatis配置文件的信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 通过工厂得到SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通过SqlSession操作数据库 // 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id // 第二个参数:指定和映射文件中所匹配的parameterType类型的参数 // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象 // selectOne查询出一条记录 User user = sqlSession.selectOne("test.findUserById", 1); System.out.println(user); // 释放资源 sqlSession.close(); } @Test public void findUserByNameTest() throws IOException { // mybatis配置文件 String resource = "mybatis-config.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 通过工厂得到SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // list中的user和映射文件中resultType所指定的类型一致 List<User> list = sqlSession.selectList("test.findUserByName", "小明"); System.out.println(list); sqlSession.close(); }

哦,对了,还有一个实体类,用户实体

public class User { private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 。。。。。//getter,setter方法省略 }

使用单元测试,结果如下:

总结

MyBatis将SQL语句放在映射配置文件中,而不是放在Java代码中编写,这样有利于程序维护,本文只演示了CRUD中的查询操作,后续文章会使用其他方式完善其他功能。在配置文件中通过标签来实现查询功能,SQL语句和相关配置信息也写在标签体内,增、删、改则可分别通过< insert>、< delete>、< update>标签来完成,与查询操作类似,此处不加以赘述。对于查询操作而言,在Java测试代码中,如果查询的结果是单个的,则使用SqlSession会话提供的selectOne方法来调用SQL语句,如果查询的结果是多个的,则应使用selectList方法。且查询结果为多个时,配置文件中的resultType值应为单条记录所映射的Java对象类型,而不是List类型。#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。 如果接收简单类型,#{}中可以写成value或其它名称。 {}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值。
转载请注明原文地址: https://www.6miu.com/read-2400216.html

最新回复(0)