在mybatis中方法注入,属性名称必须一致:
package com.rl.test;
import static org.junit.Assert.*;
import java.io.InputStream;
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.rl.model.Person;
public class MyBatisTest {
SqlSessionFactory sessionFactory;
//执行初始化,每一次执行方法前都会先执行此方法
@Before
public void setUp() throws Exception {
InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
sessionFactory = new SqlSessionFactoryBuilder().build(in);
}
@Test
public void test() {
//创建SqlSession
SqlSession session = sessionFactory.openSession();
//通过session进行查询
try {
//selectOne:第一个参数:要执行的SQL语句。命名空间.sql的ID
//selectOne:第二个参数:要传递给SQL的实际参数
Person person = session.selectOne("com.rl.mapper.PersonTestMapper.selectPersonById", 1);
System.out.println(person);
} finally{
session.close();
}
}
}
对应Person字段:
package com.rl.model;
import java.util.Date;
public class Person {
private Integer id;
private String name;
private Integer gender;
private String address;
private Date birthday;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", gender=" + gender
+ ", address=" + address + ", birthday=" + birthday + "]";
}
}
查看测试结果:
如果修改其中的一个字段:将无法注入(修改name字段为name1,从新提供get/set方法):
另外,如果不提供set/get方法,mybatis会根据所给的字段直接匹配赋值:
删除Person中的get/set方法:
package com.rl.model;
import java.util.Date;
public class Person {
private Integer id;
private String name1;
private Integer gender;
private String address;
private Date birthday;
@Override
public String toString() {
return "Person [id=" + id + ", name1=" + name1 + ", gender=" + gender
+ ", address=" + address + ", birthday=" + birthday + "]";
}
}
测试:
思考,为什么是private属性还可以被获得?
因为反射机制将private去除了,所以能拿到。
对于name字段,在实际开发中,很难避免出现对应错误的情况,这就需要寻找一个可以解决的方案,在实际开发时,字段对应的名称多使用组合单词:
生成脚本:
/*==============================================================*/
/* DBMS name: MySQL 5.0 */
/* Created on: 2019/7/23 11:47:09 */
/*==============================================================*/
drop table if exists PERSON;
/*==============================================================*/
/* Table: PERSON */
/*==============================================================*/
create table PERSON
(
PERSON_ID int(10) not null auto_increment,
NAME varchar(10),
GENDER int(1),
PERSON_ADDR varchar(50),
BIRTHDAY date,
primary key (PERSON_ID)
);
在数据库中执行:
创建映射文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- mapper文件命名规范:驼峰模式——数据库表名首字母大写+Mapper(例如:PersonTestMapper) -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
namespace:当前表(映射文件)的命名空间(命名规范:映射文件的包的全路径)
-->
<mapper namespace="com.rl.mapper.PersonMapper">
<!--
查询标签(
id:sql唯一标识、
parameterType:传递给SQL的参数的数据类型、
resultType:返回的数据的结果类型、
要查询的SQL语句,#{id}:用于接收参数的语法{}中的内容,如果是接收一个参数,内容任意
Preparing: select * from person_test where id = ? (#{ }使用预编译的方式生成SQL语句)
)
-->
<select id="selectPersonById" parameterType="java.lang.Integer" resultType="com.rl.model1.Person">
select * from person where person_id = #{id}
</select>
</mapper>
创建对应实体:
package com.rl.model1;
import java.util.Date;
public class Person {
private Integer personId;
private String name;
private Integer gender;
private String personAddr;
private Date birthday;
public Integer getPersonId() {
return personId;
}
public void setPersonId(Integer personId) {
this.personId = personId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public String getPersonAddr() {
return personAddr;
}
public void setPersonAddr(String personAddr) {
this.personAddr = personAddr;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Person [personId=" + personId + ", name=" + name + ", gender="
+ gender + ", personAddr=" + personAddr + ", birthday="
+ birthday + "]";
}
}
配置映射文件:
<?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>
<!-- 环境配置(连接数据库类型配置),可以配置多个数据库环境,但是使用时只能使用一个,由default决定使用哪个数据库 -->
<environments default="development">
<!-- id:唯一标识 -->
<environment id="development">
<!-- 事务管理器(后期和spring整合以后,就不需要单独配置事务了,由springMVC统一管理) -->
<transactionManager type="JDBC" />
<!-- 数据源(连接池和非连接池) -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!--
映射文件配置(管理每一张表的映射文件)
resource:引入映射文件
注意:包之间用/,不能使用.
-->
<mappers>
<mapper resource="com/rl/mapper/PersonTestMapper.xml" />
<mapper resource="com/rl/mapper/PersonMapper.xml" />
</mappers>
</configuration>
如果不添加映射文件,将无法找到对应的SQL语句
测试:
测试中组合单词在数据库中使用的下划线,程序中使用的驼峰,从设计规范上是没有问题的,要解决这个问题就要使用resultMap标签,修改PersonMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- mapper文件命名规范:驼峰模式——数据库表名首字母大写+Mapper(例如:PersonTestMapper) -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
namespace:当前表(映射文件)的命名空间(命名规范:映射文件的包的全路径)
-->
<mapper namespace="com.rl.mapper.PersonMapper">
<!--
结果的映射:
type:查询实体的数据类型
id:赋值给引用处的唯一标识
-->
<resultMap type="com.rl.model1.Person" id="BaseResultMap">
<!--
column:表中的字段
property:实体类中的字段
-->
<id column="person_id" property="personId"/>
<!-- 全映射 -->
<result column="name" property="name"/>
<result column="gender" property="gender"/>
<result column="person_addr" property="personAddr"/>
<result column="birthday" property="birthday"/>
</resultMap>
<!--
查询标签(
id:sql唯一标识、
parameterType:传递给SQL的参数的数据类型、
resultType:返回的数据的结果类型、
要查询的SQL语句,#{id}:用于接收参数的语法{}中的内容,如果是接收一个参数,内容任意
Preparing: select * from person_test where id = ? (#{ }使用预编译的方式生成SQL语句)
)
-->
<select id="selectPersonById" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select * from person where person_id = #{id}
</select>
</mapper>
重新测试:
获得id和地址
个人学习笔记,请勿转载