使用mybatis动态代理Dao实现CRUD操作要求:
1、持久层接口(UserDao)和持久层接口的映射配置(UserDao.xml)必须在相同的包下
2、持久层映射配置中mapper标签的namespace属性取值必须是持久层接口的全限定类名
3、SQL语句的配置标签<select>,<insert>,<delete>,<update>的id属性必须和持久层接口的方法名相同。
1、创建动态代理Dao接口UserMapper
UserMapper.java
package com.sswblog.dao;
import com.sswblog.domain.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @ Author :ShaoWei Sun.
* @ Date :Created in 19:55 2018/11/5
*/
public interface UserMapper {
/**
* 根据id查询用户
*
* @param id
* @return
*/
public User findUserById(Long id);
/**
* 查询所有用户
*
* @return
*/
public List<User> findAllUsers();
/**
* 保存用户
*
* @param user
*/
public void insertUser(User user);
/**
* 根据id删除用户
*
* @param id
*/
public void deleteUser(Long id);
/**
* 更新用户
*
* @param user
*/
public void updateUser(User user);
/**
* 登录
* 使用动态代理,当接口中的某个方法有多个参数时,通过@Param注解指定参数名字
* @param userName
* @param password
* @return
*/
public User login(@Param("userName")String userName, @Param("password")String password);
}
2、创建映射文件UserMapper.xml(在核心配置文件中添加映射)
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">
<mapper namespace="com.sswblog.dao.UserMapper">
<resultMap type="User" id="userMap" autoMapping="true">
<id column="id" property="id"/>
<result column="user_name" property="userName"></result>
</resultMap>
<select id="findUserById" resultMap="userMap">
select <include refid="CommonSqlSpace.CommonSqlId"></include> from tb_user where id = #{id}
</select>
<select id="findAllUsers" resultType="User" resultMap="userMap">
select <include refid="CommonSqlSpace.CommonSqlId"></include> from tb_user
</select>
<insert id="insertUser" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
INSERT INTO tb_user (
user_name,
password,
name,
age,
sex,
birthday,
created,
updated
)
VALUES
(
#{userName},
#{password},
#{name},
#{age},
#{sex},
#{birthday},
NOW(),
NOW()
)
</insert>
<update id="updateUser">
UPDATE tb_user set
user_name = #{userName},
password = #{password},
name = #{name},
age = #{age},
sex = #{sex},
birthday = #{birthday},
updated = NOW()
WHERE
id = #{id}
</update>
<delete id="deleteUser">
delete from tb_user where
id = #{id}
</delete>
<!--
此处需要接收多个参数,有三种方式:
方式一:#{0} #{1}
方式二:#{param1} #{param2}
方式三:在接口方法的形参中加@Param注解指定名字,这里通过#{名字}来接收参数,如果只有
一个参数,#{名字}可以自定义
-->
<select id="login" resultType="User">
select * from tb_user where user_name = #{userName} and password = #{password}
</select>
</mapper>
注意:mapper中的nameSpace是持久层接口全限定名称
SQL语句的配置标签<select>,<insert>,<delete>,<update>的id属性必须和持久层接口的方法名相同
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>
<!--引入外部属性资源文件-->
<properties resource="jdbc.properties"/>
<!--开启驼峰、让实体类的属性和数据库中的键一一映射-->
<!--<settings>-->
<!--<setting name="mapUnderscoreToCamelCase" value="false"/>-->
<!--</settings>-->
<!--开启别名-->
<typeAliases>
<!--<typeAlias type="com.sswblog.domain.User" alias="User" />-->
<package name="com.sswblog.domain"/>
</typeAliases>
<!--
environments标签:用于配置多个环境(测试环境、生产环境)
default属性:默认环境的id
environment标签:配置一个具体的环境
id属性:一个具体环境的id
transactionManager标签:指定事务的类型
type属性:可以取的值有:JDBC|MANAGED
JDBC:表示从数据源获取数据库连接来提交或回滚事务
MANAGED:表示把事务交给容器来管理,一般不用
dataSource标签:配置数据源
type属性:指定数据源类型,可以取的值有:UNPOOLED|POOLED|JNDI
UNPOOLED:无连接池的数据源,每次都重新获取数据库连接,使用完后关闭连接
POOLED:带连接池的数据源
JNDI:使用JNDI数据源
-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--指定驱动类名-->
<property name="driver" value="${jdbc.driverClass}"/>
<!-- 指定连接地址 -->
<property name="url" value="${jdbc.url}"/>
<!-- 指定用户名 -->
<property name="username" value="${jdbc.username}"/>
<!-- 指定密码 -->
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<mapper resource="UserMappers.xml"></mapper>
<mapper resource="UserDaoMappers.xml"></mapper>
<mapper resource="CommonSql.xml"></mapper>
<mapper resource="UserMapper.xml"></mapper>
</mappers>
</configuration>
CommonSql.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="CommonSqlSpace">
<sql id="CommonSqlId">
id,user_name,password,name,age,sex,birthday,created,updated
</sql>
</mapper>
3、创建单元测试类UserMapperTest.java
package com.sswblog.test;
import com.sswblog.dao.UserMapper;
import com.sswblog.domain.User;
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.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
/**
* @ Author :ShaoWei Sun.
* @ Date :Created in 19:57 2018/11/5
*/
public class UserMapperTest {
private UserMapper userMapper = null;
private SqlSession sqlSession = null;
@Before
public void setup() throws IOException {
//读取mybatis配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
sqlSession = sqlSessionFactory.openSession(true);//true为自动提交事务
userMapper = sqlSession.getMapper(UserMapper.class);
}
@Test
public void findUserByIds(){
User user = userMapper.findUserById(2L);
System.out.println("user = " + user);
}
@Test
public void findAllusers(){
List<User> allUsers = userMapper.findAllUsers();
for (User allUser : allUsers) {
System.out.println("allUser = " + allUser);
}
}
@Test
public void insertUsers(){
User user = new User();
user.setUserName("小王八e");
user.setPassword("11111111");
user.setName("库里33");
user.setSex(12);
user.setAge(222);
Date date = new Date();
user.setBirthday(date);
userMapper.insertUser(user);
//手动提交事务
//sqlSession.commit();
System.out.println("user=="+user);
}
@Test
public void deleteUser(){
userMapper.deleteUser(20L);
//sqlSession.commit();
}
@Test
public void updateUser(){
User user = userMapper.findUserById(9L);
user.setAge(22);
userMapper.updateUser(user);
//sqlSession.commit();
}
@Test
public void login(){
User user = userMapper.login("lisi", "123456");
if (user == null){
System.out.println("登录失败");
}else {
System.out.println("登录成功");
}
}
}
测试了最后一条