Mybatis框架(2)---mapper代理方法
mapper代理方法
在我们在写MVC设计的时候,都会写dao层和daoimp实现层,但假如我们使用mapper代理的方法,我们就可以不用先daoimp实现类
当然这得需要遵守一些相应的规则:
(1)Usermapper.java接口必须和Usermapper.xml名称相同,且要在同一目录下:
(2)mapper.xml中namespace等于mapper接口的地址
(3)Usermapper.java接口中国的方法名和Usermapper.xml中statement的id一致
<!-- 7综合查询 --> <select id="findUserCount" parameterType="com.study.model.User" resultType="int"> select count(*) from user where user.sex=#{userCustomer.sex} and user.username like '%${userCustomer.username}%' </select>
如果你在Usermapper.xml配置上面这些属性那么你所写的接口就必须:
1 /*findUserCount接口的名字必须和id属性一致 2 * 传入的参数必须和parameterType是一致,前面是user这里也是user 3 * 返回类型resultType是int类型,那么这里也必须是int类型 4 */ 5 public int findUserCount(User user);
(4)SqlMapConfig.xml中加载mapper.xml
1 <mappers> 2 <!-- 这里是之前加载所写的 --> 3 <!-- <mapper resource="sqlmap/User.xml" /> --> 4 <!-- 通过mapper接口 加载单个映射文件 必须遵循一些规范: 需要将mapper接口和mapper.xml映射文件 文件名必须一致 并且在同一个目录下 --> 5 <mapper class="com.study.mapper.UserMapper" /> 6 7 </mappers>
(5)通过mapper代理方法进行增删改查
a.编写user对象
public class User { private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 /* *提供set和get方法和tostring方法 * */ }
b.配置SqlMapConfig.xml
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="db.properties"></properties> <!-- 定义 别名 --> <typeAliases> <!-- 单个别名的定义 alias:别名,type:别名映射的类型 --> <!-- <typeAlias type="com.study.model.User" alias="user"/> --> <!-- 批量别名定义 指定包路径,自动扫描包下边的pojo,定义别名,别名默认为类名(首字母小写或大写) --> <package name="com.study.model"/> </typeAliases> <!-- 和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> <!--加载mapper映射 如果将和spring整合后,可以使用整合包中提供的mapper扫描器,此处的mappers不用配置了。 --> <mappers> <mapper class="com.study.mapper.UserMapper" /> </mappers> </configuration>
在这里有两个新的知识点:
1: <properties resource="db.properties"></properties>
之前在连接数据库填写配置文件直接把属性(连接数据库用户名,密码等)写在里面,而这里是写在外面的db.properties中,这样更好的体现代码的灵活性
2:<typeAliases>标签,之前我们配置mapper.xml文件中的parameterType和resultType的属性如果是对象一定要写类的全名称,而通过<typeAliases>标签的配置我们只需要写类的名字就好了
c.配置db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://localhost\:3306/study
jdbc.username=root
jdbc.password=root
也就是这样的
d.配置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的属性对应所在的UserMapper接口全名称 --> <mapper namespace="com.study.mapper.UserMapper"> <!-- 发现这里的resultType属性我们可以不用写类的全名称com.study.model.User,因为在--> <!--SqlMapConfig.xml属性中我们配置了<typeAliases>标签 --> <!-- 根据id查询用户信息 --> <select id="findUserById" parameterType="int" resultType="user"> SELECT * FROM USER WHERE id= #{id} </select> <!-- 根据用户名称查询用户信息,可能返回多条--> <select id="findUserByName" parameterType="java.lang.String" resultType="user"> select * from user where username like '%${value}%' </select> <!-- 添加用户--> <insert id="insertUser" parameterType="user"> INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address}) </insert> </mapper>
f.配置UserMapper.java对象
public interface UserMapper { //根据用户id查询用户信息 public User findUserById(int id) throws Exception; //根据用户名称 查询用户信息 public List<User> findUserByName(String username) throws Exception;//插入用户 public void insertUser(User user)throws Exception;
//删除用户 public void deleteUser(int id) throws Exception; //修改用户 public void updateUser(User user) throws Exception; }
e.编写UserMapperTest类进行 增删改查
1 import java.io.IOException; 2 import java.io.InputStream; 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import org.apache.ibatis.io.Resources; 7 import org.apache.ibatis.session.SqlSession; 8 import org.apache.ibatis.session.SqlSessionFactory; 9 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 10 import org.junit.Before; 11 import org.junit.Test; 12 13 import com.study.mapper.UserMapper; 14 import com.study.model.User; 15 16 17 public class UserMapperTest { 18 // 会话工厂 19 private SqlSessionFactory sqlSessionFactory; 20 // 创建工厂 21 @Before 22 public void init() throws IOException { 23 String resource = "SqlMapConfig.xml"; 24 InputStream inputStream = Resources.getResourceAsStream(resource); 25 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 26 } 27 //通过用户id查找对象 28 @Test 29 public void testFindUserById() throws Exception { 30 SqlSession sqlSession = sqlSessionFactory.openSession(); 31 // 创建代理对象,这里就相当于有事先类了 32 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 33 User user = userMapper.findUserById(1); 34 System.out.println(user); 35 } 36 37 //根据用户相信模糊查询 38 @Test 39 public void testFindUserByUsername() throws Exception { 40 SqlSession sqlSession = sqlSessionFactory.openSession(); 41 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 42 List<User> list = userMapper.findUserByName("小明"); 43 System.out.println(list); 44 } 45 46 //添加用户 47 @Test 48 public void testInsertUser() throws Exception { 49 SqlSession sqlSession = sqlSessionFactory.openSession(); 50 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 51 User user = new User(); 52 user.setUsername("小小洪"); 53 //我这里只添加了用户名,其它信息没有添加,默认为null 54 //Preparing: INSERT INTO USER(username,birthday,sex,address) VALUES(?,?,?,?) 55 //Parameters: 小小洪(String), null, null, null 56 userMapper.insertUser(user); 57 sqlSession.commit(); 58 sqlSession.close(); 59 } 60 } 61 /* 62 *删除和修改我这里先不写了,大家理解就好 63 */
本文就讲到这,谢谢大家,欢迎大家指点谢谢!