索引
1、简介
2、使用配置文件写一个工程
3、使用注解写一个工程
一、简介
mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,
而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程
二、使用配置文件写一个ibaties工程
1、jar包
2、写一个实体类dog以及它的配置文件dog.xml
3、实体xml编写约束和映射、然后写sql语句
4、mybatis-config.xml(别名 SqlMapConfig.xml)下配置dog.xml
5、读取总配置文件路径
6、读取到流
7、开启数据库会话
8、提交事务
二、使用配置文件写一个Mybaties工程
- 创建接口、给接口配置文件
- 创建实体类
- mybatis-config.xml下配置dog.xml
- 可以制造一个别名
- 解决列名称和属性名不一致问题
- CRUD DMEO
- SQL片段
- 一些demo
可以先看看整体工程图
1.
public interface UserDao {
public void deleteUser(int uid);
public User selectUserById(int uid);
public List<User> queryUserBySome(List list);
public List<User> querySomeUsersArray(int[] uids);
public void updateUserByUid(Map<String, Object> map);
}
2.
public class User {
private int uid;
private String username1;
private String userpwd;
...
}
3.& 4. 填写mybatis-config.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--DTD约束引入-->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--全局配置开始-->
<configuration>
<!--引入db.properties配置文件-->
<properties resource="config/db.properties"></properties>
---别名
<typeAliases>
<package name="com.itszt.domain"></package>
</typeAliases>
---别名
---连接池
<!-- 运行环境设置 1.连接 2.事务-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${db.driverclass}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.userpwd}"/>
</dataSource>
</environment>
</environments>
---连接池
---引入部分
<mappers>
<package name="com.itszt.dao"></package>
</mappers>
---引入部分
</configuration>
5.
解决列名称和属性名不一致问题
<!--解决列明和属性名不一致问题-->
<resultMap id="userRM" type="user">
<!--id主键-->
<id property="uid" column="uid"></id>
<result property="username1" column="username" ></result>
</resultMap>
6.①查询多条数据 (传入List)
代码:
List<User> queryUserBySome(List list);
|
<select id="querySomeUsers" parameterType="list" resultMap="userRM">
|
②修改数据操作 (传递map)
如果不全部都修改:可以看看数据库出现了该情况:
解决办法:
<update id="updateUserByUid" parameterType="map" >
|
③插入数据操作(直接传入对象)
public boolean insert(Order order);
7、sql片段
①插入集合查询数据
SELECT * from USER where uid IN (1,5,8)
List<Integer> uids = new ArrayList<>();
uids.add(1);
uids.add(5);
uids.add(8);
<select id="querySomeUsers" parameterType="list" resultMap="userRM">
SELECT * from USER where uid IN
<foreach collection="list" item="uid" open="(" close=")" separator=",">
#{uid}
</foreach>
</select>
parameterType:插入的类型
collection:list 或map
item :给每条数据赋一个变量名
②插入数组查询数据
SELECT * from USER where uid IN (1,5,8)
@Test
public void test3() throws IOException {
UserDao userDao = sqlSession.getMapper(UserDao.class);
int[] uids = {1,5,8};
List<User> users = userDao.querySomeUsersArray(uids);
System.out.println("users = " + users);
}
。。。
public List<User> querySomeUsersArray(int[] uids);
。。。
<select id="querySomeUsersArray" parameterType="int[]" resultMap="userRM">
SELECT * from USER where uid IN
<foreach collection="array" item="uid" open="(" close=")" separator=",">
#{uid}
</foreach>
</select>
③插入map 并且条件查询 如果某个键或者值为空则不查询
@Test
public void test5() throws IOException {
UserDao userDao = sqlSession.getMapper(UserDao.class);
Map<String,Object> map = new HashMap<>();
map.put("uid",2);
map.put("username","%dahuang%");
List<User> users = userDao.queryUserBySome(map);
System.out.println("users = " + users);
}
。。。
public List<User> queryUserBySome(Map<String, Object> map);
。。。
<select id="queryUserBySome" parameterType="map" resultMap="userRM">
SELECT * from USER
<where>
<if test="username!=null">
username LIKE #{username}
</if>
<if test="uid!=null">
AND uid>#{uid}
</if>
</where>
</select>
④更新一条数据操作
@Test
public void test4() throws IOException {
UserDao userDao = sqlSession.getMapper(UserDao.class);
Map<String,Object> map = new HashMap<>();
map.put("uid",2);
map.put("userpwd","123555555456");
userDao.updateUserByUid(map);
}
。。。
public User selectUserById(Integer uid);
。。。
<update id="updateUserByUid" parameterType="map" >
UPDATE USER
<trim prefix="set" suffixOverrides=",">
<if test="userpwd!=null">
userpwd=#{userpwd} ,
</if>
<if test="username!=null">
username=#{username}
</if>
</trim>
where uid=#{uid}
</update>
*sql 的抽取
可以对相同的sql片段进行抽取 然后赋予一个id
<sql id="planWhere">
被抽取的sql片段
</sql>
这里举一个例子:
<select id="queryPlansConditionsCounts" resultType="long">
select count(*) from elec_device_plan
<include refid="planWhere"></include> //代表引入对应id的sql片段
</select>
案例:查询名字包含dahuang且id大于6的用户
<select id="queryUserBySome" parameterType="map" resultMap="userRM">
|
@Test
|
public List<User> queryUserBySome(Map<String, Object> map);
|
三、使用注解写一个Mybaties工程
- 接口
- 总配置文件
- 实体类
- DEMO
1、
public interface UserDao {
}
2.
3、
public class User {
private int uid;
private String username1;
private String userpwd;
。。。
}
4、一些Demo
①插入一条数据
Test:
@Test
public void test2(){
UserDao userDao = sqlSession.getMapper(UserDao.class);
User user = new User();
user.setUsername1("dahuang6");
user.setUserpwd("123456");
userDao.insertUser(user);
System.out.println("user = " + user);
}
②传入多个参数查询数据
还没这么智能 ,无法根据参数来直接查找
需要加入注解@Param
//多个参数 无法自动赋值
@ResultMap("userRM") //可以使用映射解决数据库列和bean属性名称不一致问题
@Select("select * from user where username=#{username} and userpwd=#{userpwd}")
public User queryUserByNP(@Param("username") String username, @Param("userpwd") String userpwd);
③插入一个bean对象
如图 Order 是一传入的bean对象