mybatis学习第一天,一些配置以及练习
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis学习第一天,一些配置以及练习相关的知识,希望对你有一定的参考价值。
Mybatis(数据库框架 )
1. MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射
2. 接下来是用法截图,完整代码我会贴在最后面
(1) 创建一个lib文件夹存放jar文件(jar包:https://files.cnblogs.com/files/x-long/mybatis.zip)
(2) 创建一个 datasource.properties文件,放在src下面,把数据库相应的连接所用写在里面,当然前面的名字是可以改的,键值对应就成
(3) 接下来创建SqlMapConfig.xml 配置文件,同样放在src下面
基本上只有四步配置
<1> 获取到datasource.properties配置文件
<2> 配置类型别名
<3> 配置运行环境
<4> 映射mapper xml文件
在映射这个文件的时候首先需要先去建立一个xml文件 下面我贴出映射方法截图 下面mapper xml文件我会单独写
<5>接下来是SqlMapConfig.xml完整代码
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 6 <!-- 简单连接配置 --> 7 <configuration> 8 <!-- 获取到数据库配置文件 --> 9 <properties resource="datasource.properties"></properties> 10 11 <!-- 配置实体类的别名 12 方法一:直接使用package下的所有类 这样的别名就是类名--> 13 <typeAliases> 14 <package name="com.lovo.bean" /> 15 </typeAliases> 16 17 <!-- 方法二:挨个配置实体类别名 使用时就用alias里面的值--> 18 <!-- <typeAliases> 19 <typeAlias type="com.lovo.bean.User" alias="User"/> 20 </typeAliases> --> 21 22 <!--配置运行环境 23 default中的默认值development不用改变 获取到.properties文件中的数据库属性 --> 24 <environments default="development"> 25 <!-- id对应上面的默认值 --> 26 <environment id="development"> 27 <!-- 用JDBC的方式连接 --> 28 <transactionManager type="JDBC" /> 29 <!-- 把配置文件中的数据库连接所需获取出来 POOLED 连接池--> 30 <dataSource type="POOLED"> 31 <property name="driver" value="${jdbc.driver}" /> 32 <property name="url" value="${jdbc.url}" /> 33 <property name="username" value="${jdbc.username}" /> 34 <property name="password" value="${jdbc.password}" /> 35 </dataSource> 36 </environment> 37 </environments> 38 39 <!-- 把mapper中的xml映射出来 --> 40 <mappers> 41 <mapper resource="com/lovo/mapper/UserMapper.xml"></mapper> 42 </mappers> 43 44 </configuration>
(4) mapper xml文件配置
a. 在写mapper配置文件以及接口的时候建议写上一个mapper包
b. UserMapper.java这是一个接口,相当于dao里面的接口,代码如下
1 package com.lovo.mapper; 2 3 import java.util.List; 4 5 import org.apache.ibatis.annotations.Param; 6 7 import com.lovo.bean.User; 8 9 public interface UserMapper { 10 //如果是对象属性需要@Param("user")给他设置一个别名然后在xml里面调值使用 11 //基础数据类型就不需要 12 public int addUser(@Param("user")User user); 13 14 //删除用户 15 public int delUserById(int id); 16 17 //查找用户 18 public User findUserById(int id); 19 20 //查找有多少条用户信息 21 public int findUserCount(); 22 23 //根据name模糊查询user的list 24 //因为String不是基本数据类型所以需要加上别名 25 public List<User> findUserLikeName(@Param("name")String name); 26 }
c. 注意事件就是在接口方法中的参数不是基础数据类型那么一定要用@param("别名")加上别名
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" > <!-- 命名空间 --> <mapper namespace="com.lovo.mapper.UserMapper"> <!-- 把数据库中的字段映射到User实体类中 property对应实体类中的属性 column对应sql中的字段 javaType对应数据类型 数据库中的字段要和实体类中的相对应 可以少写 也可以多写几个resultMap给返回不同的数据使用 --> <resultMap type="User" id="userMapper"> <id property="userId" column="user_id" javaType="int" /> <result property="userName" column="user_name" javaType="java.lang.String"/> <result property="userPwd" column="user_pwd" javaType="java.lang.String"/> <result property="userType" column="user_type" javaType="int"/> </resultMap> <!-- id要和UserMapper.java中的方法名对应 parameterType这是传入对象别名--> <insert id="addUser" parameterType="User"> <!-- 写sql语句 --> <!-- 获取对象值就需要对象.属性名 user就是在 UserMapper.java中add方法下参数用@Param()起的别名--> insert into users values(null,#{user.userName},#{user.userPwd},#{user.userType}) </insert> <!-- 这个id是从 UserMapper.java中delUserById中的参数列表中获取的 基本数据类型可以不用别名 否则就需要设置别名 有别名就用别名 --> <delete id="delUserById"> delete from users where user_id=#{id} </delete> <!-- 在需要返回值但是不是user对象的时候 那么就可以设置返回类型 --> <select id="findUserCount" resultType="int"> select count(*) from users </select> <!-- resultMap如果返回的是对象的话那么就要用这个 后面跟上上面自己写的resultMap的id--> <select id="findUserById" resultMap="userMapper"> select * from users where user_id=#{id} </select> <!-- 在模糊查询的时候需要用concat进行拼接(其他方法也可以) 否则的话最后的sql语句会是: ‘%‘name‘%‘ 如果返回的试一个user对象list集合 那么依然写上resultMap="userMapper" 在biz层的方法返回值设置为list就可以了 --> <select id="findUserLikeName" resultMap="userMapper"> select * from users where user_name like concat(‘%‘,#{name},‘%‘) </select> </mapper>
e.注意事项都写在代码注释了
(a) 这一块命名空间要和.java文件名相同
(b) 返回类型,增删改的返回类型默认为int,其他需要自己设置
1 <!-- 在需要返回值但是不是user对象的时候 那么就可以设置返回类型 --> 2 <select id="findUserCount" resultType="int"> 3 select count(*) from users 4 </select> 5 6 <!-- resultMap如果返回的是对象的话那么就要用这个 后面跟上上面自己写的resultMap的id--> 7 <select id="findUserById" resultMap="userMapper"> 8 select * from users where user_id=#{id} 9 </select> 10 11 12 <!-- 在模糊查询的时候需要用concat进行拼接(其他方法也可以) 13 否则的话最后的sql语句会是: ‘%‘name‘%‘ 14 如果返回的试一个user对象list集合 那么依然写上resultMap="userMapper" 15 在biz层的方法返回值设置为list就可以了 16 --> 17 <select id="findUserLikeName" resultMap="userMapper"> 18 select * from users where user_name like concat(‘%‘,#{name},‘%‘) 19 </select>
(c) 自己定义的对象返回类型,通过字段名的映射到相应的实体类中
<!-- 把数据库中的字段映射到User实体类中 property对应实体类中的属性 column对应sql中的字段 javaType对应数据类型 数据库中的字段要和实体类中的相对应 可以少写 也可以多写几个resultMap给返回不同的数据使用 --> <resultMap type="User" id="userMapper"> <id property="userId" column="user_id" javaType="int" /> <result property="userName" column="user_name" javaType="java.lang.String"/> <result property="userPwd" column="user_pwd" javaType="java.lang.String"/> <result property="userType" column="user_type" javaType="int"/> </resultMap>
(d) 还有就是sql语句的id要和接口类的方法名相同 比如以下代码
接口
1 public int addUser(@Param("user")User user); 2 3 //删除用户 4 public int delUserById(int id);
xml
<insert id="addUser" parameterType="User"> insert into users values(null,#{user.userName},#{user.userPwd},#{user.userType}) </insert> <delete id="delUserById"> delete from users where user_id=#{id} </delete>
(5) 最后就是建立一个获取SqlSessionFactory的DBUtil类,用于在service层进行调用,下面是DBUtil源码
1 package com.lovo.util; 2 3 import java.io.IOException; 4 import java.io.InputStream; 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 11 public class DBUtil { 12 13 //所有的程序都要在到达数据库的时候访问SqlSessionFactory然后创建一个session(会话) 14 private static SqlSessionFactory sessionFactory; 15 //静态加载 只加载一次 16 static { 17 InputStream in = null; 18 try { 19 //通过输入流获取到SqlMapConfig.xml配置信息 20 in = Resources.getResourceAsStream("SqlMapConfig.xml"); 21 22 //通过SqlSessionFactoryBuilder把SqlMapConfig.xml配置信息放在sessionFactory里面去 23 sessionFactory = new SqlSessionFactoryBuilder().build(in); 24 25 } catch (IOException e) { 26 // TODO Auto-generated catch block 27 e.printStackTrace(); 28 } finally { 29 //记得关闭 30 try { 31 if (in != null) in.close(); 32 } catch (IOException e) { 33 // TODO Auto-generated catch block 34 e.printStackTrace(); 35 } 36 } 37 } 38 39 //返回一个数据库连接好了的sessionFactory会话 40 public static SqlSession getSession(){ 41 return sessionFactory.openSession(); 42 } 43 44 }
这个没什么难度,就是获取inputstream流然后把SqlMapConfig.xml文件读取出来。
最后贴上在service中的代码,个人使用的是biz命名,为了快速,所以没有写上接口
1 package com.lovo.biz; 2 3 import java.util.List; 4 5 import org.apache.ibatis.annotations.Param; 6 import org.apache.ibatis.session.SqlSession; 7 8 import com.lovo.bean.User; 9 import com.lovo.mapper.UserMapper; 10 import com.lovo.util.DBUtil; 11 12 public class UserBiz { 13 //私有化获取到一个会话连接 14 private SqlSession session = DBUtil.getSession(); 15 //因为UserMapper是一个接口 没有实现类 所以只能通过SqlSession下的getMapper来获取到他的对象 16 UserMapper mapper = session.getMapper(UserMapper.class); 17 18 public int regist(User user){ 19 int result = mapper.addUser(user); 20 //要记得提交数据 不然是不会成功的 21 session.commit(); 22 return result; 23 } 24 25 /** 26 * 删除用户 27 * @param id 28 * @return 29 */ 30 public int delUserById(int id){ 31 int result = mapper.delUserById(id); 32 //要记得提交数据 不然是不会成功的 33 session.commit(); 34 return result; 35 } 36 37 38 /** 39 * 根据id查找用户用户 40 * @param id 41 * @return 42 */ 43 public User findUserById(int id){ 44 User u = mapper.findUserById(id); 45 session.commit(); 46 return u; 47 } 48 49 50 //查找有多少条用户信息 51 public int findUserCount(){ 52 int count = mapper.findUserCount(); 53 session.commit(); 54 return count; 55 56 } 57 58 //根据name模糊查询user的list 59 //因为String不是基本数据类型所以需要加上别名 60 public List<User> findUserLikeName(@Param("name")String name){ 61 List<User> list = mapper.findUserLikeName(name); 62 session.commit(); 63 return list; 64 } 65 }
以上是关于mybatis学习第一天,一些配置以及练习的主要内容,如果未能解决你的问题,请参考以下文章