目标
- 使用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读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值。