发表于: 2019-10-29 18:49:07
2 961
Mybatis学习
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。
MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。
MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。
SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。
用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。
MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。
MyBatis 最强大的特性之一就是它的动态语句功能。如果您以前有使用JDBC或者类似框架的经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在columns列后面省略一个逗号等。动态语句能够完全解决掉这些痛苦。尽管与动态SQL一起工作不是在开一个party,但是MyBatis确实能通过在任何映射SQL语句中
1. 1.在pom文件中引入Mybatis依赖:
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
2. <dependency>
3. <groupId>org.mybatis</groupId>
4. <artifactId>mybatis</artifactId>
5. <version>3.5.0</version>
6. </dependency>
2.在Resources下创建conf.xml文件,配置数据库连接信息
1. <?xml version="1.0" encoding="UTF-8"?>
2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
3. <configuration>
4. <environments default="development">
5. <environment id="development">
6. <transactionManager type="JDBC" />
7. <!-- 配置数据库连接信息 -->
8. <dataSource type="POOLED">
9. <property name="driver" value="com.mysql.jdbc.Driver" />
10. <property name="url" value="jdbc:mysql://localhost:3306/task1" />
11. <property name="username" value="root" />
12. <property name="password" value="root" />
13. </dataSource>
14. </environment>
15. </environments>
16.
17. <mappers>
18. <!--注册userMapper.xml文件-->
19. <mapper resource="mapping/userMapper.xml"></mapper>
20. </mappers>
21. </configuration>
3.查询数据库表中students表数据---建立对应实体类
1. package model;
2.
3. import java.util.Date;
4.
5. public class User {
6. private int id;
7.
8. private String name;
9.
10. private String QQ;
11.
12. private String addmissionTime;
13.
14. private String University;
15.
16. private int onlineId;
17.
18. private String DailyLink;
19.
20. private String declaration;
21.
22. private Date create_at;
23.
24. private Date update_at;
25.
26. public int getId() {
27. return id;
28. }
29.
30. public void setId(int id) {
31. this.id = id;
32. }
33.
34. public String getName() {
35. return name;
36. }
37.
38. public void setName(String name) {
39. this.name = name;
40. }
41.
42. public String getQQ() {
43. return QQ;
44. }
45.
46. public void setQQ(String QQ) {
47. this.QQ = QQ;
48. }
49.
50. public String getAddmissionTime() {
51. return addmissionTime;
52. }
53.
54. public void setAddmissionTime(String addmissionTime) {
55. this.addmissionTime = addmissionTime;
56. }
57.
58. public String getUniversity() {
59. return University;
60. }
61.
62. public void setUniversity(String university) {
63. University = university;
64. }
65.
66. public int getOnlineId() {
67. return onlineId;
68. }
69.
70. public void setOnlineId(int onlineId) {
71. this.onlineId = onlineId;
72. }
73.
74. public String getDailyLink() {
75. return DailyLink;
76. }
77.
78. public void setDailyLink(String dailyLink) {
79. DailyLink = dailyLink;
80. }
81.
82. public String getDeclaration() {
83. return declaration;
84. }
85.
86. public void setDeclaration(String declaration) {
87. this.declaration = declaration;
88. }
89.
90. public Date getCreate_at() {
91. return create_at;
92. }
93.
94. public void setCreate_at(Date create_at) {
95. this.create_at = create_at;
96. }
97.
98. public Date getUpdate_at() {
99. return update_at;
100. }
101.
102. public void setUpdate_at(Date update_at) {
103. this.update_at = update_at;
104. }
105.
106. @Override
107. public String toString() {
108. return "User{" +
109. "id=" + id +
110. ", name='" + name + '\'' +
111. ", QQ='" + QQ + '\'' +
112. ", addmissionTime='" + addmissionTime + '\'' +
113. ", University='" + University + '\'' +
114. ", onlineId=" + onlineId +
115. ", DailyLink='" + DailyLink + '\'' +
116. ", declaration='" + declaration + '\'' +
117. ", create_at=" + create_at +
118. ", update_at=" + update_at +
119. '}';
120. }
121. }
4,创建students表Sql查询映射文件userMapper.xml:
1. <?xml version="1.0" encoding="UTF-8" ?>
2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3. <!-- 为这个mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
4. 例如namespace="com.springdemo.mapping.userMapper"就是com.springdemo.mapping(包名)+userMapper(userMapper.xml文件去除后缀)
5. -->
6. <mapper namespace="mapping.userMapper">
7. <!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复
8. 使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
9. resultType="model.User"就表示将查询结果封装成一个User类的对象返回
10. User类就是users表所对应的实体类
11. -->
12.
13. <!-- 根据id查询得到一个user对象-->
14. <select id="getUser" parameterType="int"
15. resultType="model.User"> <!-- 创建对应user实体类的位置 -->
16. select * from students where id=#{id}
17. </select>
18. </mapper>
5.在conf.xml文件中注册userMapper
1. <mappers>
2. <!--注册userMapper.xml文件-->
3. <mapper resource="mapping/userMapper.xml"></mapper>
4. </mappers>
6.进行单元测试,测试数据库连接是否成功
1. import model.User;
2. import org.apache.ibatis.io.Resources;
3. import org.apache.ibatis.session.SqlSession;
4. import org.apache.ibatis.session.SqlSessionFactory;
5. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
6. import org.junit.*;
7.
8. import java.io.IOException;
9. import java.io.InputStream;
10.
11. public class mybatisTest {
12. @BeforeClass
13. public static void before(){
14. System.out.println("global");
15. }
16. @AfterClass
17. public static void after(){
18. System.out.println("global destory");
19. }
20. @Before
21. public void start(){
22. System.out.println("测试开始");
23. }
24. @After
25. public void end(){
26. System.out.println("测试结束");
27. }
28. @Test
29. public void test1() throws IOException {
30. //Mybatsi的配置文件
31. String resource = "conf.xml";
32.
33. //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
34. InputStream is = Resources.getResourceAsStream(resource);
35.
36. //构建SqlSession的工厂
37. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
38.
39. //创建能执行映射文件中sql的sqlsession
40. SqlSession sqlSession = sessionFactory.openSession();
41.
42. //根据key查找
43. String statement = "mapping.userMapper.getUser";
44. //映射sql的标识字符串,getUser与映射文件中配置select标签id一直
45. //执行查询返回一个唯一user对象的sql
46. User user = sqlSession.selectOne(statement, 2);
47. System.out.println(user);
48.
49. }
50. }
结果:
Mybatis连接数据库成功
中间碰到的问题:mybatis3.5.2应该应1.8版本JDK,1.7版本会报错,不支持。
Mybatis增删改查
修改userMapper.xml统一管理返回类型
子元素id代表resultMap的主键,而result代表其属性。
在自定义的resultMap中第一列通常是主键id,那么id 和result有什么区别呢?
id和result都是映射单列值到一个属性或字段的简单数据类型。
唯一不同的是,id是作为唯一标识的,当和其他对象实例对比的时候,这个id很有用,尤其是应用到缓存和内嵌的结果映射。
1. <resultMap id="userMap" type="model.User">
2. <id property="id" column="id" javaType="java.lang.Integer"></id>
3. <result property="name" column="name" javaType="java.lang.String"></result>
4. <result property="QQ" column="QQ" javaType="java.lang.String"></result>
5. <result property="addmissionTime" column="addmissionTime" javaType="java.lang.String"></result>
6. <result property="University" column="University" javaType="java.lang.String"></result>
7. <result property="onlineId" column="onlineId" javaType="java.lang.Integer"></result>
8. <result property="DailyLink" column="DailyLink" javaType="java.lang.String"></result>
9. <result property="declaration" column="declaration" javaType="java.lang.String"></result>
10. <result property="create_at" column="create_at" javaType="java.util.Date"></result>
11. <result property="update_at" column="update_at" javaType="java.util.Date"></result>
12. </resultMap>
1.查询所有的user记录
1. <!-- 根据_key查询得到一个user对象-->
2. <select id="selectUser" resultMap="userMap"
3. resultType="model.User"> <!-- 创建对应user实体类的位置 -->
4. select * from students
5. </select>
1. 测试代码:
@Test
2. public void queryTest() throws IOException {
3. //Mybatsi的配置文件
4. String resource = "conf.xml";
5.
6. //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
7. InputStream is = Resources.getResourceAsStream(resource);
8.
9. //构建SqlSession的工厂
10. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
11.
12. //创建能执行映射文件中sql的sqlsession
13. SqlSession sqlSession = sessionFactory.openSession();
14. String stateSelect = "mapping.userMapper.selectUser";
15. List<User> userList = sqlSession.selectList(stateSelect);
16. for (User user : userList) {
17. System.out.println(user);
18. }
19. }
结果:
2.删除指定user记录
1. <!-- 删除指定user记录-->
2. <delete id="deleteUser" parameterType="int">
3. delete from students where id = #{id}
4. </delete>
测试代码:
1. @Test
2. public void deleteTest() throws IOException {
3. //Mybatsi的配置文件
4. String resource = "conf.xml";
5.
6. //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
7. InputStream is = Resources.getResourceAsStream(resource);
8.
9. //构建SqlSession的工厂
10. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
11.
12. //创建能执行映射文件中sql的sqlsession
13. SqlSession sqlSession = sessionFactory.openSession();
14.
15. String statementdl = "mapping.userMapper.deleteUser";
16. try {
17. sqlSession.delete(statementdl, 1);
18. sqlSession.commit();
19. } catch (Exception e){
20. e.printStackTrace();
21. sqlSession.rollback();
22. }
23. }
结果:
再次执行查询:
可以发现id为1的信息已经删除
删除成功!
3.修改students表记录
1. <!--更新user表记录-->
2. <update id="updateUser">
3. update students set name=#{name},QQ=#{QQ},University=#{University} where id=#{id}
4. </update>
测试代码:
1. @Test
2. public void updateTest() throws IOException {
3. String resource="conf.xml";
4.
5. InputStream is = Resources.getResourceAsStream(resource);
6.
7. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
8.
9. SqlSession sqlSession = sqlSessionFactory.openSession();
10.
11. String statementup = "mapping.userMapper.updateUser";
12.
13. User userUpdate = new User("灰太狼", "666666","喜洋洋科技大学");
14. userUpdate.setId(2);
15. try {
16. sqlSession.update(statementup,userUpdate);
17. sqlSession.commit();
18. }catch (Exception e){
19. e.printStackTrace();
20. sqlSession.rollback();
21. }
22.
23. }
结果:
再次执行查询语句:
更新成功!
4.新增user表记录
1. <!--新增students表记录-->
2. <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
3. INSERT INTO students (name,QQ,University)
4. VALUES (#{name},#{QQ},#{University})
5. </insert>
测试代码:
1. @Test
2. public void insertTest() throws IOException {
3. String resource = "conf.xml";
4. InputStream is = Resources.getResourceAsStream(resource);
5.
6. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
7.
8. SqlSession sqlSession = sqlSessionFactory.openSession();
9.
10. String statementIn = "mapping.userMapper.updateUser";
11.
12. User userIn = new User("红太狼", "888888", "美羊羊科技大学");
13. try {
14. sqlSession.insert(statementIn,userIn);
15. sqlSession.commit();
16. }catch (Exception e){
17. e.printStackTrace();
18. sqlSession.rollback();
19. }
20.
21. }
结果:
再执行一次查询:
成功!
评论