Java web开发(12)Mybatis入门
入门案例操作一个单表,user,在数据库hello中
表结构
Field | Type | Comment | |
id | int(11) NOT NULL | ||
username | varchar(32) NOT NULL | 用户名称 | |
birthday | date NULL | 生日 | |
sex | char(1) NULL | 性别 | |
address | varchar(256) NULL | 地址 |
对应的User.java文件,包名com.legion.hello
public class User { //属性名和数据库表的字段对应 private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 //getter and setter ... }
本节简单目标:通过id查询一行数据。
操作步骤:
1.新建一个简单Maven 普通jar工程。
pom.xml内容如下
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.nothing</groupId> <artifactId>MyBatisDay01</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.40</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies> </project>
2.
新建一个source folder ,config,里面新建2个log4j.properties和SqlMapConfig.xml
# Global logging configuration #\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error 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
别名定义:
在SqlMapConfig.xml中使用标签,<typeAliases>,提供包名,那么Mapper配置文件中,对于POJO类,使用类名代替类的完整路径,
比如user代替com.legion.ssm.dao.User
<!-- 别名定义 --> <typeAliases> <!-- 批量别名定义 指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以) --> <package name="cn.itcast.ssm.po"/> </typeAliases>
<?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="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/hello" /> <property name="username" value="root" /> <property name="password" value="123456" /> </dataSource> </environment> </environments> <!-- 加载 映射文件 --> <mappers> <package name="com.legion.mapper"/> </mappers> </configuration>
3.编写DAO接口UserMapper.java和其映射文件UserMapper.xml。
package com.legion.mapper; import com.legion.hello.User; public interface UserMapper { public User findUserById(int id) throws Exception; }
UserMapper.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"> <mapper namespace="com.legion.mapper.UserMapper"> <select id="findUserById" parameterType="int" resultType="com.legion.hello.User"> select * from user where id=#{value} </select> </mapper>
注意:遵循下述规范,MyBatis会为UserMapper接口生成代理对象
1.两个文件都属于包com.legion.mapper,已经在SqlMapperConfig中配置,通过搜索包名加载所有映射文件。
2.mapper.xml中的namespace就是UserMapper接口全路径。
3.UserMapper.java 中的 方法名和UserMapper.xml中的statement id一致。
4.接口方法输入参数类型和xml中的对应statement 的parameterType类型一致。
5.接口方法的返回值类型和xml中的对应statement的resultType类型一致。
测试代码
public class MyTest { private SqlSessionFactory sqlSessionFactory; @Before public void setup() throws Exception{ String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息 sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); } @Test public void testFindUserByName() throws Exception{ SqlSession session=sqlSessionFactory.openSession(); UserMapper userMapper=session.getMapper(UserMapper.class); User user=userMapper.findUserById(25); System.out.println(user); } }