Mybatis学习
Posted miantiao312
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis学习相关的知识,希望对你有一定的参考价值。
1、Mybatis入门Demo实践
A、根据用户id查询一个用户信息
B、根据用户名称模糊查询用户信息列表
2、搭建Java工程
A、加入mybatis核心包、依赖包、数据驱动包
B、在classpath下创建log4j.properties(mybatis默认使用log4j作为输出日志信息)
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# 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
C、在classpath下创建SqlMapConfig.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>
<!-- 和spring整合后 environments配置将废除
SqlMapConfig.xml是mybatis核心配置文件,下边文件的配置内容为数据源、事务管理
-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事物管理 -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件,将Users.xml添加在SqlMapConfig.xml -->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
</configuration>
D、pojo类
public class User {
private int id;
private String username;
private String sex;
private Date birthday;
private String address;
getter/seetter方法省略
}
E、在classpath下的sqlmap目录下创建sql映射文件Users.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是命名空间,作用sql语句的隔离,后面还有重要作用
#{}作用就是占位符,相当于jdbc的“?”
parameterType:查询的参数类型
定义输入到sql中的映射类型,#{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。
resultType:查询结果的数据类型,如果是pojo应该给全路径。
-->
<mapper namespace="test">
<!-- 通过用户id获取用户 -->
<select id="getUserById" parameterType="int" resultType="com.kid.mybatis.pojo.User">
select * from user where id = #{id}
</select>
<!-- 通过用户名模糊查询用户 -->
<select id="getUserByUsername" parameterType="string" resultType="com.kid.mybatis.pojo.User">
<!-- ${value}表示使用参数将${value}替换,做字符串的拼接。
注意:如果是取简单数量类型的参数,括号中的值必须为value
-->
select * from user where username like ‘%${value}%‘
</select>
<!-- 添加用户 -->
<insert id="insertUser" parameterType="com.kid.mybatis.pojo.User">
insert into user(username,birthday,sex,address)
value(#{username},#{birthday},#{sex},#{address})
</insert>
</mapper>
F、加载映射文件:mybatis框架需要加载映射文件,将Users.xml添加在SqlMapConfig.xml
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
G、测试代码
package com.kid.mybatis.first;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import com.kid.mybatis.pojo.User;
public class MybatisTest {
//创建会话工厂
private SqlSessionFactory sqlSessionFactory = null;
@Before
public void createSqlSessionFactory() throws Exception {
//第一步:创建一个SQLSessionFactoryBuilder对象。
SqlSessionFactoryBuilder sessionFactoryBuilder=new SqlSessionFactoryBuilder();
//第二步:加载配置文件。
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//第三步:创建SQLSessionFactory对象
sqlSessionFactory = sessionFactoryBuilder.build(inputStream);
}
@Test //根据用户id获取用户
public void getUserByIdTest() {
// 数据库会话实例
SqlSession sqlSession = null;
try {
// 创建数据库会话实例sqlSession
sqlSession = sqlSessionFactory.openSession();
// 查询单个记录,根据用户id查询用户信息
User user = sqlSession.selectOne("getUserById", 10);
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
}finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
@Test //通过用户名查询用户
public void findUserByUsernameTest() {
// 数据库会话实例
SqlSession sqlSession = null;
try {
// 创建数据库会话实例sqlSession
sqlSession = sqlSessionFactory.openSession();
//进行查询
List<User> list=sqlSession.selectList("getUserByUsername","张");
for (User user : list) {
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//释放资源
sqlSession.close();
}
}
@Test //添加用户信息
public void insertTest() {
// 数据库会话实例
SqlSession sqlSession = null;
try {
// 创建数据库会话实例sqlSession
sqlSession = sqlSessionFactory.openSession();
//创建User对象
User user = new User();
user.setUsername("小乔");
user.setBirthday(new Date());
user.setSex("2");
user.setAddress("上海");
//插入数据
sqlSession.insert("insertUser",user);
System.out.println(user.getId());
//提交事务
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
}finally {
sqlSession.close();
}
}
}
3、小结
A、#{}和${}
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。
#{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,
${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
B、parameterType和resultType
parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。
resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。
C、selectOne和selectList
selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常:
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:70)
selectList可以查询一条或多条记录。
4、Demo结构图
以上是关于Mybatis学习的主要内容,如果未能解决你的问题,请参考以下文章
markdown [mybatis参考]关于mybatis #mybatis的一些片段