前言
上篇简单介绍了Mybatis的简单实用,本篇先对上次实验环境的一些内容进行优化,然后验证Mybatis的XML配置以及注解方式。
实验环境优化
数据库配置
在mybatis的配置文件中,引入数据库配置文件db.properties,然后修改配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
name=root
password=admin
mybatis配置文件 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="db.properties"/>
<!-- development : 开发模式 work : 工作模式 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${name}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/lion/mapper/UserMapper.xml" />
</mappers>
</configuration>
实体类定义别名
没有为实体定义别名时,在sql映射xml中应用实体时,比如parameterType resultType 中就需要配置实体的全路径名(全限定名)。
当为实体定义了别名后,映射文件中可以直接配置实体的别名即可。因此为实体类定义别名,可以简化Sql映射xml文件中对实体的引用配置。
mybatis配置文件中<typeAlises>定义实体别名有两种方式:
- typeAlias 单个为每个实体定义别名 当实体类比较多是 配置增多 不方便
- package 指定实体的包 会自动为改包下的所有实体自动设定各自的类名为别名
优化后的Mybatis配置文件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="db.properties"/>
<!-- 配置实体的别名 -->
<typeAliases>
<!-- 此种方式是分别为每一个实体设置别名 mapper xml 中resultType即为alias的值-->
<!-- <typeAlias type="com.lion.pojo.User" alias="_User"/> -->
<!-- package 设置别名的方式会自动为该包下的所有JavaBean设置别名为其类名称 -->
<package name="com.lion.pojo"/>
</typeAliases>
<!-- development : 开发模式 work : 工作模式 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${name}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/lion/mapper/UserMapper.xml" />
</mappers>
</configuration>
Mybatis实现方式
分别使用XML和注解的方式实现对User的CURD。
XML方式
sql中参数定义为 #{} 在Mybatis配置文件中已经配置对实体类的自动设置别名,因此此处可以直接使用实体类的别名进行引用。
<?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.lion.mapper.UserMapper">
<select id="selectUser" parameterType="int" resultType="User"> select * from users where id = #{id} </select>
<delete id="deleteUser" parameterType="int"> delete from users where id = #{id} </delete>
<update id="updateUser" parameterType="User"> update users set name = #{name},age = #{age} where id = #{id} </update>
<insert id="addUser" parameterType="User"> insert into users(name,age) values(#{name},#{age}) </insert>
<select id="selectAll" resultType="User" > select * from users </select>
</mapper>
1 package com.lion.test; 2
3 import java.io.IOException; 4 import java.util.List; 5
6 import org.apache.ibatis.session.SqlSession; 7 import org.apache.ibatis.session.SqlSessionFactory; 8 import org.junit.Test; 9
10 import com.lion.pojo.User; 11 import com.lion.util.MybatisUtils; 12
13 public class TestUserCURDByXML { 14
15 @Test 16 public void testAdd() { 17 try { 18 SqlSessionFactory factory = MybatisUtils.getFactory(); 19 SqlSession session = factory.openSession(); 20
21 String statement = "com.lion.mapper.UserMapper.addUser"; 22 // id mysql设置的自增长 此处设为 -1
23 User user = new User(-1, "Spring", 25); 24 session.insert(statement, user); 25
26 // 不提交的话 数据无法提交到数据库
27 session.commit(); 28 session.close(); 29 } catch (IOException e) { 30 e.printStackTrace(); 31 } 32 } 33
34 @Test 35 public void testDelete() { 36 try { 37 SqlSessionFactory factory = MybatisUtils.getFactory(); 38 // 自动提交事务
39 SqlSession session = factory.openSession(true); 40
41 String statement = "com.lion.mapper.UserMapper.deleteUser"; 42 session.delete(statement, 4); 43
44 session.close(); 45 } catch (IOException e) { 46 e.printStackTrace(); 47 } 48 } 49
50 @Test 51 public void testUpdate() { 52 try { 53 SqlSessionFactory factory = MybatisUtils.getFactory(); 54 // 自动提交事务
55 SqlSession session = factory.openSession(true); 56
57 String statement = "com.lion.mapper.UserMapper.updateUser"; 58 User user = new User(1, "mali", 18); 59 session.update(statement, user); 60
61 session.close(); 62 } catch (IOException e) { 63 e.printStackTrace(); 64 } 65 } 66
67 @Test 68 public void testSelect() { 69 try { 70 SqlSessionFactory factory = MybatisUtils.getFactory(); 71 // 自动提交事务
72 SqlSession session = factory.openSession(true); 73
74 String statement = "com.lion.mapper.UserMapper.selectAll"; 75 List<User> users = session.selectList(statement); 76 for (User user : users) { 77 System.out.println(user); 78 } 79
80 session.close(); 81 } catch (IOException e) { 82 e.printStackTrace(); 83 } 84 } 85
86 }
注解方式
package com.lion.testAnnotation; import java.util.List; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import com.lion.pojo.User; public interface UserMapper { @Insert("insert into users(name,age) values(#{name},#{age})") int insertUser(User user); @Delete("delete from users where id = #{id}") int deleteUser(int id); @Update("update users set name = #{name},age = #{age} where id = #{id}") int updateUser(User user); @Select("select * from users where id = #{id}") User selectUser(int id); @Select("select * from users") List<User> selectAll(); }
Mybatis配置文件中注册映射接口 class
<mappers>
<mapper resource="com/lion/mapper/UserMapper.xml" />
<mapper class="com.lion.testAnnotation.UserMapper"/>
</mappers>
针对同一实体的映射文件不能放到同一个包中。
1 package com.lion.testAnnotation; 2
3 import java.io.IOException; 4 import java.util.List; 5
6 import org.apache.ibatis.session.SqlSession; 7 import org.apache.ibatis.session.SqlSessionFactory; 8 import org.junit.Before; 9 import org.junit.Test; 10
11 import com.lion.pojo.User; 12 import com.lion.util.MybatisUtils; 13
14 public class TestUserCURDByAnnotaion2 { 15
16 private SqlSessionFactory factory; 17
18 @Before 19 public void loadFactory() { 20 try { 21 factory = MybatisUtils.getFactory(); 22 } catch (IOException e) { 23 e.printStackTrace(); 24 } 25 } 26
27 @Test 28 public void testAdd() { 29 SqlSession session = factory.openSession(true); 30 // 映射器
31 UserMapper mapper = session.getMapper(UserMapper.class); 32
33 int i = mapper.insertUser(new User(-1, "xiazis", 24)); 34
35 System.out.println(i); 36
37 session.close(); 38
39 } 40
41 @Test 42 public void testDelete() { 43 SqlSession session = factory.openSession(true); 44 // 映射器
45 UserMapper mapper = session.getMapper(UserMapper.class); 46
47 int i = mapper.deleteUser(1); 48
49 System.out.println(i); 50
51 session.close(); 52
53 } 54
55 @Test 56 public void testUpdate() { 57 SqlSession session = factory.openSession(true); 58 // 映射器
59 UserMapper mapper = session.getMapper(UserMapper.class); 60
61 int i = mapper.updateUser(new User()); 62
63 System.out.println(i); 64
65 session.close(); 66
67 } 68
69 @Test 70 public void testSelect() { 71 SqlSession session = factory.openSession(true); 72 // 映射器
73 UserMapper mapper = session.getMapper(UserMapper.class); 74
75 User user = mapper.selectUser(2); 76
77 System.out.println(user); 78
79 session.close(); 80
81 } 82
83 @Test 84 public void testSelectAll() { 85 SqlSession session = factory.openSession(true); 86 // 映射器
87 UserMapper mapper = session.getMapper(UserMapper.class); 88
89 List<User> users = mapper.selectAll(); 90
91 for (User user : users) { 92 System.out.println(user); 93 } 94
95 session.close(); 96
97 } 98
99 }