提供相关资料下载地址:http://download.youkuaiyun.com/detail/u010879420/9921829
Mybatis框架
一、 What is MyBatis?
MyBatis is a first class persistence framework with support for customSQL, stored procedures
and advanced mappings. MyBatis 是一个持久层框架,支持客户端sql语句,永久保存及高级映射
MyBatis eliminates almost all of the JDBC code and manual setting of
parameters and retrieval of results.
MyBatis 去除了很多JDBC代码,手动配置的参数和结果集的处理
MyBatis can use simple XML or Annotations(注释) for configuration
and map primitives(原始), Map interfaces and Java POJOs (Plain Old Java Objects) to databaserecords.
2017/7/14,9:18
二、 Mybatis连接sqlserver步骤
1. 确保sqlserver上的TCP/IP连接成功
三、 SqlMapConfig.xml中配置【其中连接串(注意端口)】
<?xmlversion="1.0" encoding="UTF-8"?>
<!DOCTYPEconfiguration
PUBLIC"-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environmentsdefault="development">
<environmentid="development">
<transactionManagertype="JDBC"/>
<dataSourcetype="POOLED">
<propertyname="driver"value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<propertyname="url"value="jdbc:sqlserver://192.168.50.112:1433;DatabaseName=SchoolSys"/>
<propertyname="username" value="sa"/>
<propertyname="password" value="123"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapperresource="sqlmap/User.xml"/>
</mappers>
</configuration>
四、 映射文件Mapper.xml配置
<?xmlversion="1.0" encoding="UTF-8"?>
<!DOCTYPEmapper
PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mappernamespace="test">
<selectid="findUserById" parameterType="java.lang.Integer"resultType="cn.zzh.mybatis.po.User">
SELECT * FROMuserinfo WHERE id = #{value}
</select>
<selectid="findUserByName" parameterType="java.lang.String"resultType="cn.zzh.mybatis.po.User">
<!-- SELECT* FROM userinfo WHERE username = #{value} -->
SELECT * FROMuserinfo WHERE username like '%${value}%'
</select>
</mapper>
1.具体的代码程序
@Test
public voidfindUserByIdTest(){
//mybatis配置文件
Stringresource = "SqlMapConfig.xml";
try {
//得到配置文件流
InputStreaminputStream = Resources.getResourceAsStream(resource);
//创建会话工厂,传入mybatis的配置信息
SqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到sqlSession
SqlSessionsqlSession =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();
} catch(IOException e) {
// TODOAuto-generated catch block
e.printStackTrace();
}
}
@Test
public voidfindUserByNTest(){
//mybatis配置文件
Stringresource = "SqlMapConfig.xml";
try {
//得到配置文件流
InputStreaminputStream = Resources.getResourceAsStream(resource);
//创建会话工厂,传入mybatis的配置信息
SqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到sqlSession
SqlSessionsqlSession =sqlSessionFactory.openSession();
//通过SqlSession操作数据库
//第一个参数:映射文件statement的ID,等于=namespace+"."+statement的ID
//第二个参数:指定和映射文件中所匹配的parameterType类型的参数
//SqlSession.selectOne结果是与映射文件中所匹配的resultType类型的对象
List<User>list = sqlSession.selectList("test.findUserByName",'z');
//清除会话
sqlSession.close();
} catch(IOException e) {
// TODOAuto-generated catch block
e.printStackTrace();
}
}
2.具体项目名称及目录
2017/7/17,10:39
五、 selectOne 和selectList
selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)
selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。会出现如下错误:
org.apache.ibatis.exceptions.TooManyResultsException:Expected one result (or null) to be returned by selectOne(), but found: 3
2017/7/17,8:26
六、 Mapper代理方法
思路
程序员还需要编写mapper.xml映射文件
程序员编写mapper接口需要准寻一些开发规范,mybatis可以自动生成mapper接口实现类代理对象
开发规范
1. 在mapper.xml中namespace等于mapper接口地址
<!--使用Mapper代理方法,namespace有特殊重要的作用,namespace等于mapper接口地址 -->
<mappernamespace="cn.zzh.mybatis.mapper.UserMapper">
2. Mapper.java接口中方法名和mapper.xml中statement的id一致
3. Mapper.java接口中方法输入参数和mapper.xml中statement的parameterType指定的类型一致
4. Mapper.java接口中方法返回值类型和mapper.xml中statement的resultType指定的类型一致
Mapper.java代码:
packagecn.zzh.mybatis.mapper;
importcn.zzh.mybatis.po.User;
public interface UserMapper {
public User findUserById(int id) throws Exception;
}
Mapper.xml代码:
<selectid="findUserById" parameterType="java.lang.Integer"resultType="cn.zzh.mybatis.po.User">
SELECT * FROMuserinfo WHERE id = #{value}
</select>
范例:
多条数据查询
Mapper.java代码:
//多条数据查询
public List<User> findUserByName(String name) throwsException;
Mapper.xml代码:
<!-- 多条数据查询 -->
<selectid="findUserByName" parameterType="java.lang.String" resultType="cn.zzh.mybatis.po.User">
SELECT * FROMuserinfo WHERE username like '%${value}%'
</select>
测试代码:
SqlSessionsqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapperuserMapper = sqlSession.getMapper(UserMapper.class);
//根据用户名查找多条用户信息
List<User> listUser =userMapper.findUserByName("zzhua");
System.out.println("---------->>>>>>>>>>>>>>>"+listUser);
七、 代理对象内部调用selectOne或selectList
如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库
如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库
八、 SqlMapConfig.xml配置文件 各个节点意义及实例
1. 加载属性文件
<!-- 加载属性文件 -->
<propertiesresource="db.properties"></properties>
实例如下:
把数据库配置信息放在属性文件中
<?xmlversion="1.0" encoding="UTF-8"?>
<!DOCTYPEconfiguration
PUBLIC"-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 加载属性文件 -->
<propertiesresource="db.properties"></properties>
<!-- 和spring整合后environments配置将废除 -->
<environments default="development">
<environmentid="development">
<!-- 使用jdbc事务管理,事务控制由mybatis -->
<transactionManagertype="JDBC"/>
<!-- 数据库连接池,由mybatis管理 -->
<dataSourcetype="POOLED">
<propertyname="driver" value="${driver}"/>
<propertyname="url" value="${url}"/>
<propertyname="username" value="${username}"/>
<propertyname="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapperresource="sqlmap/User.xml"/>
<mapperresource="Mapper/UserMapper.xml"/>
</mappers>
</configuration>
属性文件内容如下:
driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
url=jdbc:sqlserver://192.168.50.112:1433;DatabaseName=SchoolSys
username=sa
password=123
注意:Mybatis将按照下面的顺序来加载属性
在properties元素体内定义的属性首先被读取
然后读取properties元素中的resource或url中加载属性,它会覆盖以读取的同名属性
最后读取parameterType传递的属性,它会覆盖以读取的同名属性
建议:不要在properties元素体内添加任何属性值,只将属性值定义在properties文件中。
在properties文件中定义属性名要有一定的特殊性,如:xxxx.xxxx.xxxx
2.定义别名
SqlMapConfig.xml文件中定义如下:
<!-- 定义别名 -->
<typeAliases>
<!-- 针对单个别名定义
type:类型的路径
alias:别名
-->
<!--<typeAlias type="cn.zzh.mybatis.po.User"alias="user"></typeAlias> -->
<!-- 批量别名定义
指定包名,mybatis自动扫描包中的po类,自定定义别名,别名就是类名(首字母大写小写都可以)
-->
<packagename="cn.zzh.mybatis.po"></package>
</typeAliases>
Mapper.xml中使用如下:
<!-- 单条数据查询 -->
<selectid="findUserById" parameterType="java.lang.Integer"resultType="User"> <!-- user(User)使用了SqlMapConfig中定义的别名 -->
SELECT * FROMuserinfo WHERE id = #{value}
</select>
测试代码:
@Test
public voidtestFindUserById() throws Exception {
SqlSessionsqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapperuserMapper = sqlSession.getMapper(UserMapper.class);
//根据ID查询单条用户信息数据
User user =userMapper.findUserById(13);
}
3.Mapper.xml文件加载
<!-- 加载映射文件 -->
<mappers>
<mapperresource="sqlmap/User.xml"/>
<!-- 通过resource方式加载,一次加载一个映射文件 -->
<!--<mapper resource="Mapper/UserMapper.xml"/> -->
<!-- 通过Mapper接口加载映射文件
遵循规范:需将mapper接口类名和mapper.xml映射文件名称保持一致,并且在同一个目录下
上面规范的前提是使用的mapper代理的方式
-->
<mapperclass="cn.zzh.mybatis.mapper.UserMapper" />
</mappers>
4.用户综合查询
定义UserQueryVo综合查询类代码如下:
packagecn.zzh.mybatis.po;
public classUserQueryVo {
//用户查询条件
privateUserCustom userCustom;//UserCustom继承自User
publicUserCustom getUserCustom() {
return userCustom;
}
public voidsetUserCustom(UserCustom userCustom) {
this.userCustom= userCustom;
}
}
Mapper.xml文件代码如下:
<!-- 用户综合查询 -->
<selectid="findUserList"parameterType="cn.zzh.mybatis.po.UserQueryVo"resultType="cn.zzh.mybatis.po.UserCustom">
SELECT * FROMUSERINFO userinfo WHERE userinfo.sex = '${userCustom.sex}' ANDuserinfo.username like '%${userCustom.username}%'
<!-- SELECT* FROM UserInfo userinfo WHERE userinfo.sex = '2' AND userinfo.username like'%zzh%' -->
</select>
Mapper.java文件代码如下:
//用户信息综合查询
publicList<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
测试代码:
@Test
public voidtestFindUserList() throws Exception {
SqlSessionsqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapperuserMapper = sqlSession.getMapper(UserMapper.class);
//创建查询条件
UserQueryVouserQueryVo = new UserQueryVo();
UserCustomcustom = new UserCustom();
custom.setSex("2");
custom.setUsername("zzh");
userQueryVo.setUserCustom(custom);
//根据ID查询单条用户信息数据
List<UserCustom>list = userMapper.findUserList(userQueryVo);
System.out.println(list);
}
5.输出映射resultType
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出的列名和pojo中的属性名