mybatis
持久层技术解决方案有几种
1.JDBC技术–>Connection、PreparedStatement、ResultSet
2.Spring的JdbcTemplate–>Spring中对Jdbc的简单封装
3.Apache的DBUtils–>它和Spring的JdbcTemplate很像,也是对Jdbc的简单封装
以上这些都不是框架(JDBC是规范、Spring的JdbcTemplate和Apache的DBUtils都只是工具类)
mybatis持久层框架
mybatis是一个用Java编写的持久层框架,它使用ORM实现了结果集的封装。
ORM是Object Relational Mapping 对象关系映射。简单来说,就是把数据库表和实体类及实体类的属性对应起来,让开发者操作实体类就实现操作数据库表。
它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等烦杂过程
测试用例搭建
搭建环境流程如下四点:
-
创建maven工程并导入坐标
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.43</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> </dependencies>
-
创建实体类和Mapper的接口
public class User implements Serializable { private int id ; private String username; ...... } public interface IUserMapper { /** * 查询所有操作 * @return */ List<User> findAll(); }
-
创建mybatis的主配置文件
<configuration> <!--配置环境--> <environments default="mysql"> <!--配置Mysql的环境--> <environment id="mysql"> <!--配置事务的类型--> <transactionManager type="JDBC"></transactionManager> <!--配置数据源(连接池)--> <dataSource type="POOLED"> <!--配置连接数据库的四个基本信息--> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/db1" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> <mappers> <mapper resource="Mybatis/IuserMapper.xml" /> </mappers> </configuration>
-
创建映射配置文件
<mapper namespace="com.Mapper.IUserMapper" > <select id="findAll" resultType="com.Pojo.User" > select * from usr </select> </mapper>
测试方法
...... InputStream in = Resources.getResourceAsStream("mybatis/MapperConfig.xml"); //创建SqlSessionFactory工厂 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(in); //使用工厂生产SqlSession对象 SqlSession session = factory.openSession(); //使用SqlSession创建Mapper接口的代理对象 UserMapper userMapper = session.getMapper(UserMapper.class); //使用代理对象执行方法 List<mybatis_user> users = userMapper.findAll(); for (mybatis_user muser : users){ System.out.println(muser); } session.close(); in.close(); ......
mybatis主配置文件
mybatis的配置文件推荐为命名mybatis-config.xml,其内容包含了会深深影响mybatis行为的设置和属性信息。以下是全配置文件列表:
使用者掌握方面有properties、settings、typeAliases、enveronments、mappers
具体各个配置内容如下:
-
properties 标签
开发者可通过properties属性来实现引用配置文件。这些属性都是可外部配置且可动态替换的
[注]
1.如果两个配置文件有同一个字段,优先使用外部配置文件的
2.可以直接引入外部配置文件,properties子元素中可以增加一些属性配置 -
typeAliases 标签
typeAliases类型别名是为java类型设置一个短的名字,存在的意义仅在于用来减少类完全限定名的冗余。java内置内建类型别名它们都不区分大小写,注意对基本类型名称重复采用的特殊命名风格。
别名
映射的类型
_byte
byte
_long
long
_int
int
_integer
int
_double
double
_float
float
_boolean
boolean
string
String
byte
Byte
long
Long
short
Short
int
Integer
Integer
Integer
double
Double
float
Float
boolean
Boolean
date
Date
object
Object
map
Map
hashmap
HashMap
list
List
arraylist
ArrayList
[注]
方法二中,每一个在包中的Java bean,在没有注解的情况下,会使用bean的首字母小写的非限定类名来作为它的别名。若有注解,则别名为其注解值。(实体类上使用注解:@Alias(“user”)) -
setting 标签
setting设置标签,这是Mybatis中极为重要的调整设置,它们会改变Mybatis的运行时行为
-
dataSource 标签
我们在实际开发中都会使用连接池,因为它可以减少我们获取连接所消耗的时间,在mybatis中连接池提供了3种方式的配置
[注]主配置文件的dataSource标签,type属性就是表达采用何种连接池方式1)POOLED 方式
*采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现
[注]观察出POOLED它是从池中获取一个连接来用2)UNPOOLED 方式
*采用传统的获取连接的方式,虽然也实现javax.sql.DataSource接口,但是并没有使用连接池技术
[注]UNPOOLED每次创建一个新的连接来用
3)JNDI 方式
*采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样的
[注]如果不是web或者maven的war工程,是不能使用的
-
mappers 属性
mappers映射器属性,MapperRegistry:注册绑定我们的Mapper文件。有三种方式如下:
<mappers> <mapper resource="com/ferao/mapper/UserMapper.xml"/> </mappers>
或
<mappers> <mapper class="com.ferao.mapper.UserMapper" /> </mappers>
[注]
使用class文件绑定注册,接口和它的Mapper配置文件必须同名且接口且它的Mapper配置文件必须在同一个包下或
<mappers> <package name="com.ferao.mapper"></package> </mappers>
[注]
扫描包进行注入绑定方式,接口和它的Mapper配置文件必须同名且接口和它的Mapper配置文件必须在同一个包下
mybatis映射文件
映射配置文件里的参数信息如下:
-
parameterType(输入类型)
可输入的类型有三种:简单类型、pojo对象、pojo包装对象
1)简单类型
2)pojo对象
mybaits使用OGNL表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称
[注]OGNL表达式:object Graphic Navigation Language (对象图导航语言),它是通过对象的取值方法来获取数据。在写法上把gat给省略了。比如:我们获取用户的名称类中的写法:user.getUsername();
OGNL表达式写法:user.username
那么,mybatis中为什么能直接写username,而不用user呢?因为在parameterType中已经提供了属性所属的类,所以此时不需要写对象名3)pojo包装对象
开发中通过pojo传递查询条件,查询条件是综合的查询条件,不仅包括用户查询条件还包括其他的查询条件(比如将用户购买商品消息也作为查询条件),这时可以使用包装对象传递输入pojo类参数中包含pojo。
-
resultType(输出类型)
可输出的类型有四种:返回一般数据类型(单条)、JavaBean 类型(单条)、List类型(多条)、Map类型
1)一般数据类型(单条)
比如要根据Id属性获得数据库中的某个字段值,示例:
①mapper(dao)接口
String getStuNameById(Integer id);
②Mapper.xml 映射文件
<select id="getStuNameById" resultType="string"> select username from t_student where id = #{id} </select>
2)JavaBean 类型(单条)
比如根据某个字段获得数据库中的信息,把查询的结果信息封装成某个javaBean类型的数据
①mapper(dao)接口
Student getStuById(Integer id);
②Mapper.xml 映射文件
<select id="getStuById" resultType="student"> select * from t_student where id = #{id} </select>
3)List类型(多条)
有时候开发者查询的数据不止一条,比如,模糊查询,全表查询等,这时候返回的数据可能不止一条数据,对于多数据的处理可以存放在List集合中
①mapper(dao)接口
List<Student> getAllStus();
②Mapper.xml 映射文件
<!--注意这里的 resultType 返回值类型是集合内存储数据的类型,不是 'list'--> <select id="getAllStus" resultType="student"> select * from t_student </select>
4)Map类型
mybatis支持将查询的数据封装成Map。
如果查询的结果是一条,开发者可以把查询的数据以(表字段名,对应的值)方式存入到map中
①mapper(dao)接口
Map<String, Object> getStuAsMapById(Integer id);
②Mapper.xml 映射文件
<!-- 注意这里的 resultType 返回值类型是 'map'--> <select id="getStuAsMapById" resultType="map"> select * from t_student where id = #{id} </select>
如果查询的结果是多条数据,我们也可以把查询的数据以{表中某一字段名, JavaBean}方式来封装成Map
①mapper(dao)接口
// 查询所有学生的信息,把数据库中的 'id' 字段作为 key,对应的 value 封装成 Student 对象 // @MapKey 中的值表示用数据库中的哪个字段名作 key @MapKey("id") Map<Integer, Student> getAllStusAsMap();
②Mapper.xml 映射文件
<!--注意 resultType 返回值类型,不再是 'map',而是 Map 的 value 对应的 JavaBean 类型--> <select id="getAllStusAsMap" resultType="student"> select * from t_student </select>
返回map集合时返回的类型是List<Map<String, Object>>
①mapper(dao)接口
List<Map<String, Object>> getAllStuAsMapById(Integer id);
②Mapper.xml 映射文件
<!--查询多条--> <select id="getAllStuAsMapById" parameterType="int" resultType="map"> select * from usr </select>
-
resultMap(映射实体类)
数据库字段名和实体类属性不相同时,无法映射到值,输出为Null。这是因为mybatis会根据这些从数据库中查询到的列名,将列名转化为小写(数据库不区分大小写)去对应实体类中查询相应列名的set方法设值,由于找不到setUserName(),所以会返回Null值。
要明确与Java对象对应的列不是数据库中表的列名,而是查询后结果集的列名
解决方案有两种:
1)为列名指定别名,别名和Java实体类的属性名一致
2)使用结果集映射ResultMap [推荐]resultMap的作用是建立sql查询结果字段与实体属性的映射关系信息,将查询的结果集转换为java对象,方便进一步操作,即结果集中的列与Java对象中的属性对应起来并值填充进去
resultMap 属性全内容如下:
<!--colu