根据用户ID(主键)查询用户信息
需求
根据用户ID(主键)查询用户信息
用户表user信息
user表结构
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` date DEFAULT NULL COMMENT '生日',
`sex` char(1) DEFAULT NULL COMMENT '性别',
`address` varchar(255) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COMMENT='用户表';
user表数据
创建MyBatis全局配置文件
创建MyBatis全局配置文件,如SqlMapConfig.xml
,配置MyBatis的运行环境、数据源、事务等
<?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配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理,事务控制由mybatis管理 -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池由mybatis管理 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
</configuration>
创建用户User pojo类
import java.util.Date;
public class User {
//属性名和数据库表的字段对应
private int id;
private String username; //用户姓名
private String sex; //性别
private Date birthday; //生日
private String address; //地址
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
创建映射文件
映射文件命名分两种:
- 原始ibatis命名,如User.xml
- mapper代理方法开发命名,命名形式一般是XXXMapper.xml,如UserMapper.xml、ItemsMapper.xml
User.xml
映射文件:
<!-- mapper 为根元素节点, 一个namespace对应一个dao -->
<!-- namespace命名空间,作用就是对sql进行分类管理,可以理解为sql隔离
注意:使用mapper代理方式开发,namespace有特殊重要的作用
-->
<mapper namespace="test">
<!-- 在映射文件中配置很多sql语句 -->
<!-- 根据用户ID查询用户信息 -->
<!-- 通过select执行数据库查询
id: 标识映射文件的sql
将sql语句封装到mappedStatement对象中,所以将id成为statement的id
parameterType: 指定输入参数的类型
#{}表示一个占位符号
#{id}: 其中的id表示接收输入的参数,参数名称就是id,如果输入的参数是简单类型,#{}中的参数名称可以任意,可以是value或其他名称
resultType: 指定sql输出结果所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象
-->
<select id="findUserById" parameterType="int" resultType="com.xxx.qa.po.User">
SELECT * FROM USER WHERE id = #{id}
</select>
</mapper
在SqlMapConfig.xml中加载映射文件
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配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理,事务控制由mybatis管理 -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池由mybatis管理 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
</configuration>
加载映射文件就添加如下这些内容即可
<!-- 加载映射文件 -->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
其中<mappers>
节点用来加载映射文件,resource
属性指定映射文件所在位置
入门程序
程序代码
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.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class MybatisFirst {
//根据用户id查询用户信息,得到一条记录结果
@Test
public void findUserByIdTest() throws IOException {
//mybatis配置文件
String resource = "SqlMapConfig.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类型的对象
User user = sqlSession.selectOne("test.findUserById", 1);
System.out.println(user);
//释放资源
sqlSession.close();
}
}
程序执行结果
为了方便查看打印出来的结果,在User.java
添加了toString
方法
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", sex='" + sex + '\'' +
", birthday=" + birthday +
", address='" + address + '\'' +
'}';
}
最终查看控制台输出的内容,大致如下:
......
[DEBUG]22:01:39,852,main,[Class]JdbcTransaction, [Method]openConnection, Opening JDBC Connection
[DEBUG]22:01:40,128,main,[Class]PooledDataSource, [Method]popConnection, Created connection 1226622409.
[DEBUG]22:01:40,128,main,[Class]JdbcTransaction, [Method]setDesiredAutoCommit, Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@491cc5c9]
[DEBUG]22:01:40,131,main,[Class]findUserById, [Method]debug, ==> Preparing: SELECT * FROM USER WHERE id = ?
[DEBUG]22:01:40,180,main,[Class]findUserById, [Method]debug, ==> Parameters: 2(Integer)
[DEBUG]22:01:40,216,main,[Class]findUserById, [Method]debug, <== Total: 1
User{id=2, username='张三丰', sex='0', birthday=Wed Jul 13 00:00:00 CDT 1988, address='中国杭州'}
......
可以看到,日志中返回了我们想要的结果,也打印出了映射文件中配置的sql语句以及输入参数和参数值