学习mybatis3的第一天
1、根据这个全局的mybatis-config.xml配置文件生成一个SqlSessionFactory对象。
2、根据SqlSessionFactory对象获取sqlSession实例,整个实例可以执行已经映射的sql语句。
问:什么叫做已经映射的sql语句呢?
有一个xml文件,里面的内容如下:这个xml文件是EmployeeMapper.xml
放在conf目录下面
<?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.rtl.mybatis.EmployeeMapper"> <select id="selectEmp" resultType="com.rtl.mybatis.bean.Employee"> select * from tbl_employee where id = #{id} </select> </mapper>
解释xml内容里面的参数含义。
1、namespace是命名空间
namespace=com.rtl.mybatis.EmployeeMapper
2、id是唯一标识
id=selectEmp
3、resultType是返回值类型
resultType=“com.rtl.mybatis.bean.Employee”
4、#{id} 从传递过来的参数中取出id的值
selectOne(String statement, Object parameter);
解释参数含义:
1、sql的唯一标识。
statement – Unique identifier matching the statement to use.
这里推荐第一个参数写xml文件里面的namespace+id作为第一个参数的值。
也就是statement=com.rtl.mybatis.EmployeeMapper.selectEmp
这就相当于告诉mybatis需要执行这个sql
2、
执行sql要用的参数。
parameter – A parameter object to pass to the statement.
select * from tbl_employee where id = #{id}
这条sql里面需要传入一个参数,#{id},这个参数就是由第二个参数给出
parameter=1,就说明:
select * from tbl_employee where id = 1
查询的是1号员工。
修改mybatis-config.xml里面的mapper标签
将我们写好的sql映射文件一定要注册到全局的配置文件中。
<mappers> <mapper resource="EmployeeMapper.xml"/> </mappers>
总的mybatis-config.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> <environments default="development"> <environment id="development"> <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> <mappers> <mapper resource="EmployeeMapper.xml"/> </mappers> </configuration>
EmployeeMapper.xml:
这个文件被称为sql的映射文件
mybatis-config.xml:
这个文件被称为全局的配置文件
运行测试类之后,报错:
java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing
发现是juint的错,降低了版本,由4.12变为4.10
https://blog.csdn.net/qq_41709577/article/details/120962399
改了之后又报错:
java.io.IOException: Could not find resource mybatis-config.xml
将conf目录变为source root目录。
https://blog.csdn.net/qq_41709577/article/details/120962517
我们会发现,其中lastName的值为null,但是数据库里面的值不是Null
问题就出在我们再写java bean对象的时候,
他的属性名是lastName,但是数据库的属性名是last_name
这时候我们修改EmployeeMapper.xml sql映射文件里面的sql语句为:
之前的sql:
select * from tbl_employee where id = #{id}
现在的sql:
select id,last_name lastName,gender,email from tbl_employee where id = #{id}
前面是:last_name数据库的名字
后面的别名是java bean对应的属性名。
这样的lastName才会出现数据值。
总结:步骤
1、写好mybatis-config.xml的全局配置信息,包含运行的环境信息
2、写好sql的映射文件EmployeeMapper.xml,里面配置了sql和sel的封装规则。
3、将sql映射文件注册在全局配置文件中
4、写测试类代码。
其中
SqlSession openSession = sqlSessionFactory.openSession();
这个SqlSession openSession ,一个这个代表和数据库的一次会话,用完记得关闭。
项目架构:
全部代码:
1、测试类:
package com.rtl.mybatis.test; import com.rtl.mybatis.bean.Employee; 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; public class MybatisTest { //2、 @Test public void test() throws IOException { //(16,17,18行)1、根据这个全局的mybatis-config.xml配置文件生成一个SqlSessionFactory对象。 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2、根据SqlSessionFactory对象获取sqlSession实例,整个实例可以执行已经映射的sql语句。 SqlSession openSession = sqlSessionFactory.openSession(); try { //3、 Employee employee = openSession.selectOne("com.rtl.mybatis.EmployeeMapper.selectEmp", 1); System.out.println(employee); }finally { openSession.close(); } } }
2、java bean类:
package com.rtl.mybatis.bean; public class Employee { private Integer id; //注意:数据库的字段名字是last_name private String lastName; private String email; private String gender; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "Employee{" + "id=" + id + ", lastName='" + lastName + '\'' + ", email='" + email + '\'' + ", gender='" + gender + '\'' + '}'; } }
3、EmployeeMapper.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.rtl.mybatis.EmployeeMapper"> <select id="selectEmp" resultType="com.rtl.mybatis.bean.Employee"> select id,last_name lastName,gender,email from tbl_employee where id = #{id} </select> </mapper>
4、mybatis-config.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> <environments default="development"> <environment id="development"> <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> <mappers> <mapper resource="EmployeeMapper.xml"/> </mappers> </configuration>
改进版本:
为什么需要改进呢?