MyBaits
- MyBaits的jar包介绍
- MyBaits的入门案例
- 创建实体
- java日志处理框架
- 常用的日志处理框架
- Log4j的日志级别
- Mybatis配置的完善
- Mybatis的日志管理
- 使用别名alias
- 方式一
- 方式二
- SqlSession对象下的常用API
- 查询操作
- Mapper动态代理
- Mapper 动态代理规范
- 查询所有用户
- 根据用户ID查询用户
- Mapper动态代理模式下的多参数处理
- @Param注解传参法
- POJO传参法
MyBaits的jar包介绍
MyBaits的入门案例
创建实体
E:\java\MyBaits\mybatisdemo\src\com\bjsxt\pojo\Users.java
java日志处理框架
常用的日志处理框架
Log4j: Log For Java(Java 的日志) 是 Apache 提供的一个开源的 Java主流日志框架
Log4j的日志级别
Mybatis配置的完善
Mybatis的日志管理
使用别名alias
Mybatis 中的别名配置它只和 XML 配置有关, 只用来减少类完全限定名的多余部分。注
意:别名都是大小写不敏感的。
方式一
使用 typeAlias 指定单个类的别名
<typeAliases>
<typeAlias type="com.bjsxt.pojo.Users" alias="u"/>
</typeAliases>
<!--注意该标签的顺序,放在<settings>标签后面,具体顺序查看Ctrl+<configuration>-->
<select id="selectUsersById" parameterType="int" resultType="u">
select * from users where userid = #{suibian}
</select>
表示用u来代替com.bjsxt.pojo.Users
方式二
使用package指定某个包下所有类的默认别名
<typeAliases>
<package name="com.bjsxt.pojo"/>
</typeAliases>
引入后的映射文件
<select id="selectUsersById" parameterType="int" resultType="users">
select * from users where userid = #{suibian}
</select>
这段代码的主要意思呢就是给com.bjsxt.pojo这个包结构下所有的类都起一个别名这个别名就是这个类名的小写字母,以后就可以用小写字母来代替这个包结构了。
eg:
com.xxx.xxx.GoodsName就可以替换为goodsname
com.xxx.xxx.GoodsNumber就可以替换为goodsnumber
SqlSession对象下的常用API
查询操作
1.E:\java\MyBaits\mybatisdemo\src\com\bjsxt\mapper\UsersMapper.xml
<!-- 根据用户名与用户性别查询用户,用集合返回-->
<select id="selectUsersByNameAndSex" resultType="users">
select * from users where username = #{name} and usersex = #{sex}
</select>
</mapper>
//2.E:\java\MyBaits\mybatisdemo\src\com\bjsxt\dao\UsersDao.java
Map<Integer,Users> selectUsersByNameAndSex(String username, String usersex);
//3.E:\java\MyBaits\mybatisdemo\src\com\bjsxt\dao\impl\UsersDaoImpl.java(省略了UsersDao.java)
@Override
public Map<Integer, Users> selectUsersByNameAndSex(String username, String usersex) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
Map<String,String> param = new HashMap<>();
param.put("name",username);//要和UserMapper.xml中username = #{name} and usersex = {sex}对应
param.put("sex",usersex);
Map<Integer, Users> users = sqlSession.selectMap("com.bjsxt.mapper.UserMapper.selectUsersByNameAndSex", param, "userid");
return users;
}
//4.E:\java\MyBaits\mybatisdemo\src\com\bjsxt\service\serviceimpl\UsersServiceImpl.java
@Override
public Map<Integer, Users> findUsersByNameAndSex(String username, String usersex) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
Map<Integer, Users> integerUsersMap = null;
try {
UsersDaoImpl usersDao = new UsersDaoImpl();
integerUsersMap = usersDao.selectUsersByNameAndSex(username, usersex);
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
MybatisUtils.closeSqlSession();
}
return integerUsersMap;
}
//5.测试
@Test
public void findUsersByNameAndSex(){
UsersServiceImpl usersService = new UsersServiceImpl();
Map<Integer, Users> usersByNameAndSex = usersService.findUsersByNameAndSex("潘海宸", "男");
Set<Integer> integers = usersByNameAndSex.keySet();
for (Integer key:integers){
Users users = usersByNameAndSex.get(key);
System.out.println(key + "\t" + users.getUserid() + "\t" + users.getUsername() + "\t" + users.getUsersex());
}
}
Mapper动态代理
在 MyBatis 中提供了另外一种 Dao 层的实现方式,既:Mapper 动态代理(或称为接口
绑定)的操作方式。这种方式下程序员只需要写 Dao 接口,不需要创建 Dao 的接口实现类,
Mybatis 会自动生成接口实现类的代理对象。在 Dao 层我们只要创建接口与映射配置文件即
可。这种方式可以大大简化 Dao 层的代码结构,是在开发中最常见的使用方式。
Mapper 动态代理规范
- 接口名称需要与映射配置文件名称相同
- 映射配置文件中 namespace 必须是接口的全名
- 接口中的方法名和映射配置文件中的标签的 id 一致
- 接口中的返回值类型和映射配置文件中的 resultType的指定类型一致
注意:引入mapper映射配置文件时mapper标签内有所不同,需要用package标签
<!--引入 Mapper 映射配置文件-->
<mappers>
<package name="com.bjsxt.mapper"/>
</mappers>
查询所有用户
1.修改映射配置文件
<!--查询所有用户-->
<select id="selectUsersAll" resultType="users">
select * from users
</select>
2.修改UserMapper接口添加抽象方法
public interface UsersMapper {
List<Users> selectUsersAll();
}
3.创建业务层接口
public interface UsersService {
List<Users> findUsersAll();
}
- 创建业务层接口实现类
//可以通过接口的名字定位到映射配置文件,所以要求映射配置文件里面的namespace属性的值要和使用接口的全名相同;定位到映射配置文件后,根据方法名定位到要2使用的标签,所以方法名要和id的值相同。这样就能执行标签里的Sql语句了
public List<Users> findUsersAll() {
List<Users> list = null;
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {
//getMapper 方法的作用是根据给定的接口的 Class 对象,生成该接口的接口实现类的代理对象
UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);//可以通过接口的名字定位到映射配置文件,所以要求映射配置文件里面的namespace属性的值要和使用接口的全名相同;
//定位到映射配置文件后,根据方法名定位到要2使用的标签,所以方法名要和id的值相同。这样就能执行标签里的Sql语句了
list = mapper.selectUsersAll();
} catch (Exception e) {
sqlSession.rollback();
e.printStackTrace();
} finally {
MybatisUtils.closeSqlSession();
}
return list;
}
5.测试
@Test
public void findUsersAll(){
UsersServiceImpl usersService = new UsersServiceImpl();
List<Users> usersAll = usersService.findUsersAll();
Iterator<Users> iterator = usersAll.iterator();
while (iterator.hasNext()){
Users next = iterator.next();
System.out.println(next.toString());
}
}
根据用户ID查询用户
- 修改映射配置文件
<select id="selectUsersById" parameterType="_int" resultType="users">
select * from users where userid = #{id}
</select>
- 修改UsersMapper接口添加抽象方法
Users selectUsersById(int id);
- 修改业务层接口
Users findUsersById(int id);
- 修改业务层接口实现类
@Override
public Users findUsersById(int id) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
Users users = null;
try {
UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);
users = mapper.selectUsersById(id);
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
MybatisUtils.closeSqlSession();
}
return users;
}
- 测试
@Test
public void findUsersById(){
UsersServiceImpl usersService = new UsersServiceImpl();
Users user = usersService.findUsersById(2);
System.out.println(user.toString());
}
Mapper动态代理模式下的多参数处理
@Param注解传参法
注解中@param(“…”)中的参数代表的是Mapper映射文件中#{…}里面的值。
- 修改映射配置文件
<!--根据用户姓名与性别查询用户,使用@Param 注解传参法-->
<select id="selectUsersAnnParam" resultType="users">
select * from users where username = #{name} and usersex= #{sex}
</select>
- 修改UsersMapper接口添加抽象方法
List<Users> selectUsersAnnParam(@Param("name") String username,@Param("sex") String usersex);
- 修改业务层接口
List<Users> findUsersAnnParam(@Param("name") String username1, @Param("sex") String usersex);
- 修改业务层接口实现类
@Override
public List<Users> findUsersAnnParam(String username1, String usersex) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
List<Users> list = null;
try {
UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);
list = mapper.selectUsersAnnParam(username1, usersex);
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
MybatisUtils.closeSqlSession();
}
return list;
}
- 测试
@Test
public void findUsersAnnParam(){
UsersServiceImpl usersService = new UsersServiceImpl();
List<Users> user = usersService.findUsersAnnParam("潘海宸", "男");
Iterator<Users> iterator = user.iterator();
while (iterator.hasNext()){
Users next = iterator.next();
System.out.println(next.toString());
}
POJO传参法
在 Mapper 动态代理中也可以使用 POJO 作为传递参数的载体,在 SQL 语句中绑定参数
时使用 POJO 的属性名作为参数名即可。此方式推荐使用。
- 修改映射配置文件
<!--根据用户姓名与性别查询用户,使用 POJO 传参法-->
<select id="selectUsersPOJOParam" resultType="users">
select * from users where username = #{username} and usersex=#{usersex}
</select>
- 修改UsersMapper接口添加抽象方法
List<Users> selectUsersPOJOParam(Users users);
- 修改业务层接口
List<Users> findUsersPOJOParam(Users users);
- 修改业务层接口实现类
@Override
public List<Users> findUsersPOJOParam(Users users) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
List<Users> list = null;
try {
UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);
list = mapper.selectUsersPOJOParam(users);
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
MybatisUtils.closeSqlSession();
}
return list;
}
- 测试
@Test
public void selectUsersPOJOParam(){
UsersServiceImpl usersService = new UsersServiceImpl();
Users user = new Users();
user.setUsername("潘海宸");
user.setUsersex("男");
List<Users> usersPOJOParam = usersService.findUsersPOJOParam(user);
Iterator<Users> iterator = usersPOJOParam.iterator();
while (iterator.hasNext()){
Users next = iterator.next();
System.out.println(next.toString());
}
}