一、需求
根据用户ID查询用户信息
根据用户名查找用户列表
添加用户
二、原始Dao的开发方式
1、创建Dao/UserDao接口
package com.itzheng.mybatis.dao;
import java.util.List;
import com.itzheng.mybatis.pojo.User;
public interface UserDao {
// 根据用户ID查询用户信息
/*
* 用户信息持化接口
*/
User getUserById(Integer id);
// 根据用户名查找用户列表
List<User> getUserByUserName(String userName);
// 添加用户
void insertUser(User user);
}
2、创建接口对应的实现类
public class UserDaoImpl implements UserDao {
@Override
public User getUserById(Integer id) {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
User user = sqlSession.selectOne("user.getUserByid", id);
sqlSession.close();
return user;
}
@Override
public List<User> getUserByUserName(String userName) {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
List<User> selectList = sqlSession.selectList("user.getUserByUserName", userName);
sqlSession.close();
return selectList;
}
@Override
public void insertUser(User user) {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(true);// true自动提交
sqlSession.insert("user.insertUser", user);
sqlSession.close();
}
}
3、创建单元测试
(1)通过id查询用户
@Test
public void testGetUserById() {
UserDao userDao = new UserDaoImpl();
User user = userDao.getUserById(30);
System.out.println(user);
}
(2)通过name查询用户
@Test
public void testGetUserByUserName() {
UserDao userDao = new UserDaoImpl();
List<User> userByUserName = userDao.getUserByUserName("张");
for (User user : userByUserName) {
System.out.println(user);
}
}
(3)插入用户
@Test
public void testInsertUser() {
UserDao userDao = new UserDaoImpl();
User user = new User();
user.setUsername("张飞1111");
user.setSex("2");
user.setBirthday(new Date());
user.setAddress("深圳黑马");
userDao.insertUser(user);
}
三、官方推荐,接口动态代理
通过动态代理的方式有实现类但是不需要自己手动去写
1、创建UserMapper接口
package com.itzheng.mybatis.mapper;
import java.util.List;
import com.itzheng.mybatis.pojo.User;
public interface UserMapper {
// 根据用户ID查询用户信息
/*
* 用户信息持化接口
*/
User getUserByid(Integer id);
// 根据用户名查找用户列表
List<User> getUserByUserName(String userName);
// 添加用户
void insertUser(User user);
}
2、创建UserMapper.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">
<!-- namespace:命名空间,用于隔离SQL语句,后继有重要 #{}:是一个占位符,相当于jdbc的?号 用字符串拼接指令${}:字符串拼接指令,如果入参为普通数据类型{}内部只能写value -->
<!-- 动态代理开发规则:
1、namespace:必须是接口的全路径名
2、接口的方法名必须与SQL的id一致
3、接口的入参与parameterType类型一致
4、接口的返回值必须与resultType类型一致
-->
<mapper namespace="com.itzheng.mybatis.mapper.UserMapper">
<!-- id:sql语句的唯一标识 parameterType:入参的数据类型 resultType:返回结果的数据类型 -->
<select id="getUserByid" parameterType="int"
resultType="com.itzheng.mybatis.pojo.User">
SELECT * FROM USER WHERE id = #{id1}
</select>
<!-- resultType:如果返回结果为集合,只需要设置为每一个数据类型 -->
<select id="getUserByUserName" parameterType="string"
resultType="com.itzheng.mybatis.pojo.User">
SELECT id,username,birthday,sex,address FROM `user` WHERE username LIKE
'%${value}%'
</select>
<!-- 插入用户 -->
<!-- useGeneratedKeys:使用自增 keyProperty与之配套使用,这里是keyProperty的主键 -->
<insert id="insertUser"
parameterType="com.itzheng.mybatis.pojo.User" useGeneratedKeys="true"
keyProperty="id">
<!-- selectKey :主键返回 keyProperty:user中的主键属性 resultType:主键的数据类型 order:指定selectKey何时执行,AFTER之后,也就是在插入数据之后执行查询语句返回int类型的最后一行,赋值到User当中的ID选择 -->
<!-- <selectKey keyProperty="id" resultType="int" order="AFTER" > select
LAST_INSERT_ID() </selectKey> -->
INSERT INTO USER
(`username`,
`birthday`,
`sex`,
`address`)
VALUES (#{username},
#{birthday},
#{sex},
#{address});
</insert>
</mapper>
3、修改SqlMapConfig.xml当中添加映射文件
<mapper resource="mybatis/UserMapper.xml" />
4、创建单元测试
(1)根据ID查询用户
@Test
public void testGetUserById() {
SqlSession openSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
// 获取接口的代理实现类
UserMapper userMapper = openSession.getMapper(UserMapper.class);
User user = userMapper.getUserByid(30);
System.out.println(user);
openSession.close();
}
(2)根据name查询用户
@Test
public void testGetUserByUserName() {
SqlSession openSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
// 获取接口的代理实现类
UserMapper userMapper = openSession.getMapper(UserMapper.class);
List<User> list = userMapper.getUserByUserName("张");
for (User user : list) {
System.out.println(user);
}
openSession.close();
}
(3)插入用户
@Test
public void testInsertUser() {
SqlSession openSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(true);
// 获取接口的代理实现类
UserMapper userMapper = openSession.getMapper(UserMapper.class);
User user = new User();
user.setUsername("张飞1111");
user.setSex("2");
user.setBirthday(new Date());
user.setAddress("深圳黑马");
userMapper.insertUser(user);
openSession.close();
}
、
四、属性加载:抽取JDBC
1、创建jdbc.properties
2、修改SqlMapConfig.xml,在SqlMapConfig.xml当中引入jdbc.properties
<?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>
<!-- 先加载内部标签,再加载外部文件,名称一致的时候,会替换内容 -->
<properties resource="jdbc.properties" >
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="root"/>
</properties>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="mybatis/user.xml" />
<mapper resource="mybatis/UserMapper.xml" />
</mappers>
</configuration>
五、别名的配置:typeAliases
别名的作用将复杂的数据用其他的名称简单的代替
1、mybatis支持的别名:
2、自定义别名:方式一,配置对应的类的别名
(1)修改SqlMapConfig.xml
<typeAliases>
<!-- 单个别名定义 -->
<!-- <typeAlias type="com.itheima.mybatis.pojo.User" alias="user"/> -->
<!-- 别名包扫描器(推荐使用此方式),整个包下的类都被定义别名,别名为类名,不区分大小写-->
<package name="com.itzheng.mybatis.pojo"/>
</typeAliases>
(2)修改UserMapper.xml,在UserMapper.xml当中引用别名:别名不区分大小写
<select id="getUserByUserName" parameterType="string"
resultType="user">
SELECT id,username,birthday,sex,address FROM `user` WHERE username LIKE
'%${value}%'
</select>
3、自定义别名:方式二,配置包别名,默认别名就是类名称不区分大小写
(1)修改SqlMapConfig.xml:别名包扫描器:别名是类的全称,不区大小写
<package name="com.itzheng.mybatis.pojo" />
(2)UserMapper.xml当中直接使用类名就OK
六、映射器(mappers)
Mapper配置的几种方式:
1、将UserMapper.xml复制到mapper文件下
2、修改SqlMapConfig.xml:方式一:类配置
1、接口文件必须与映射文件在同一个目录下
2、接口文件的名称必须与映射文件的名称一致
<package name="com.itzheng.mybatis.mapper"/>
3、修改SqlMapConfig.xml:方式二:包扫描->推荐
1、接口文件必须与映射文件在同一个目录下
2、接口包文件的名称必须与映射文件的名称一致
<package name="com.itzheng.mybatis.mapper"/>