Mybatis-conf.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">
<!-- 配置mybatis的环境信息: 各标签的位置顺序如下[顺序不对会报错]:
properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?
-->
<configuration>
<!-- 引入外部配置文件 数据相关参数 -->
<properties resource="db.properties"/>
<!-- 设置Mybatis的一些运行参数:日志,缓存.... -->
<settings>
<!-- name 属性值固定选项; value 属性值固定选项 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
<!--设置类型别名:在执行sql语句的时候,如果不设置别名。每次在指定的时候都需要包名+类名,得写的长 -->
<typeAliases>
<typeAlias type="pojo.User" alias="User"/>
<typeAlias type="pojo.Order" alias="Order"/>
<typeAlias type="pojo.UserInfo" alias="UserInfo"/>
<!--
也可以直接指定包名 <typeAlias type="pojo"/>
在没有注解指定名字的时候,默认按照Bean首字母小写作为别名
pojo.User user / pojo.Order order / pojo.UserInfo userInfo
-->
</typeAliases>
<environments default="development">
<environment id="development">
<!-- 配置 JDBC 事务控制,由 Mybatis 进行管理 ,有 JDBC,MANAGED 两种事务管理器
JDBC: 直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。
MANAGED: 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。
-->
<transactionManager type="JDBC"/>
<!-- 配置数据源,采用dbcp连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--
1.使用类路径查找资源文件 <mapper resource="xx\xx\xx.xml"/>
2.使用包名 <package name="xx.xx.xx"/>
3.使用本地文件 <mapper url="file:///c:/xx/xx.xml"/>
4.使用接口 <mapper class="xx.xx.xx"/>
-->
<!-- 映射文件 -->
<mapper resource="mybatis\mapper\UserMapper.xml"/>
</mappers>
</configuration>
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="dao.UserDao">
<select id="selectOne" parameterType="Integer" resultType="User">
select * from user where id = #{id}
</select>
<resultMap id="userAttr" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
<select id="selectAll" resultMap="userAttr">
select * from user
</select>
<select id="selectManyByName" parameterType="String" resultMap="userAttr">
select * from user where name like #{name}
</select>
<select id="selectUserByPage" parameterType="page.Page" resultMap="userAttr">
select * from user limit #{offset},#{pageSize}
</select>
<delete id="deleteUserById" parameterType="Integer" >
delete from user where id = #{id}
</delete>
<!-- 因为 id 自动生成 可以加上这两个参数 反向赋值给类实例
keyColumn="id" 数据表中id为
useGeneratedKeys="true" 声明此处添加的 id 用的是自增长
keyProperty="id" 将 id 值 传递给当前方法的参数中的 id 属性
-->
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into user(name,age) values(#{name},#{age})
</insert>
<!-- 一对一 用户:用户信息 方式一-->
<resultMap id="user_userInfo" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<association property="userInfo" javaType="UserInfo">
<id property="id" column="id"/>
<result property="user_id" column="user_id"/>
<result property="card" column="card"/>
<result property="birth_date" column="birth_date"/>
</association>
</resultMap>
<select id="selectUserAndUserInfo" parameterType="Integer" resultMap="user_userInfo">
select * from user a,u_info b where a.id=b.user_id and a.id=#{id}
</select>
<!-- 一对一 用户:用户信息 方式二 -->
<select id="selectUserAndUserInfo2" parameterType="Integer" resultMap="user_userInfo2">
select * from user where id =#{id}
</select>
<resultMap id="user_userInfo2" type="User">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<!-- column是传的参数, select是调用的查询 -->
<association property="userInfo" column="id" select="selectUserInfo" fetchType="lazy"/> <!-- 延迟加载 使用时再加载-->
</resultMap>
<select id="selectUserInfo" parameterType="Integer" resultType="UserInfo">
select * from u_info where user_id=#{id}
</select>
<!-- 一对多 用户:订单-->
<resultMap id="user_orders" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<collection property="orderList" ofType="Order" fetchType="lazy"> <!-- 延迟加载 使用时再加载-->
<id property="id" column="o_id"/>
<result property="user_id" column="user_id"/>
<result property="name" column="o_name"/>
</collection>
</resultMap>
<select id="selectUserAndOrder" parameterType="Integer" resultMap="user_orders">
select a.* , b.*
from user a , u_order b
where a.id=b.user_id
and a.id = #{id}
</select>
<!--
如果使用 $ ,则必须使用 @Param 注解,否则 ${name} 会认为是要从参数中取名为 name 的属性
注意 ${} 做字符串拼接使用 '${}' 而不是 ${}
类似 String sql = “select ..... from tt where name='”+name+"'";
sql 拼接有注入风险
#{} 占位符,此处使用 #{name} 而不是 ‘${name}’
-->
<!-- 必须使用 $ 场景 -->
<select id="test" parameterType="String" resultMap="user_userInfo">
select * from user order by id ${name}
</select>
<select id="test2" parameterType="String" resultMap="user_userInfo">
select * from ${name}
</select>
<!-- 动态SQL -->
<!-- if-->
<select id="selectDySql" resultType="User">
select * from user
where
<if test="name!=null and name!=''">name=#{name}</if>
<if test="id>=1"> and id>#{id}</if>
<if test="flag == false">and age=18</if>
</select>
<!-- choose -->
<select id="selectDySql2" resultType="User">
select * from user
where
<choose>
<when test="id != null">id>#{id}</when>
<when test="name != null">name=#{name}</when>
<otherwise>age=18</otherwise>
</choose>
</select>
<!-- where 如果条件不成立 不加 where关键字 如果有 and or 开头的会自动去掉 -->
<select id="selectDySql3" resultType="User">
select * from user
<where>
<if test="name!=null and name!=''">name=#{name}</if>
<if test="id>=1">and id>#{id}</if>
<if test="flag == false">and age=18</if>
</where>
</select>
<!-- set 标签 主要你用于 update 中-->
<update id="updateDySql">
update user
set
<if test="name!=null and name!=''">name=#{name}</if>
<if test="id>=1"> and id>#{id} </if>
<if test="flag == false">and age=18</if>
where id = #{id}
</update>
<update id="updateDySql2">
update user
<set>
<if test="name!=null and name!=''">name=#{name}</if>
<if test="id>=1">and id>#{id}</if>
<if test="flag == false">and age=18</if>
</set>
where id = #{id}
</update>
<!-- Trim 标签
<trim prefix="where" prefixOverrides="and|or"> 等价于 where
prefix="where" where 开头
suffix="test" test 结尾
prefixOverrides="and|or" 表示会除去开头的 and 或 or
suffixOverrides="," 去除最后的,
-->
<select id="selectDySql4" resultType="User">
select * from user
<trim prefix="where" prefixOverrides="and|or" >
<if test="name!=null and name!=''">name=#{name}</if>
<if test="id>=1"> and id>#{id} </if>
<if test="flag == false">and age=18</if>
</trim>
</select>
<!-- Foreach 标签 -->
<select id="selectDySql5" resultType="User">
select * from user
where id in
<foreach collection="list" item="id" index="ind" open="(" close=")" separator="," >
#{id}
</foreach>
</select>
<!--
复用 SQL
1.定义一段 sql
2.引入
-->
<sql id="tmp">
id,name,age
</sql>
<select id="selectDySql55" resultType="User">
select
<include refid="tmp"/>
from user
</select>
</mapper>
UserDao
public interface UserDao {
//基本操作
User selectOne(int id);
List<User> selectAll();
List<User> selectManyByName(String name);
List<User> selectUserByPage(Page page);
void deleteUserById(int id);
void insertUser(User user);
//一对一
User selectUserAndUserInfo(int id);
User selectUserAndUserInfo2(int id);
//一对多
List<User> selectUserAndOrder(int id);
// ${} #{} 使用场景
List<User> test(@Param("name") String name);
List<User> test2(@Param("name") String name);
}
MybatisUntils
/**
* Mybatis 工具类
*/
public class MyBatisUntil {
private static String config="mybatis/config.xml";
public static SqlSession getSqlSession(){
SqlSession sqlSession=null;
try {
InputStream inputStream = Resources.getResourceAsStream(config);
//加载构建 SqlSessionFactory 实例
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
//创建 sqlSession 对象实例
sqlSession = factory.openSession();
} catch (IOException e) {
e.printStackTrace();
}
return sqlSession;
}
public static void main(String[] args) {
t1();
t2();
}
public static void t1(){
Object selectOne = getSqlSession().selectOne("selectOne", 1);
getSqlSession().selectOne("selectOne", 1);
System.out.println(selectOne);
}
public static void t2(){
System.out.println("查询所有用户信息");
UserDao userDao = getSqlSession().getMapper(UserDao.class);
List<User> userList=userDao.selectAll();
userList.forEach(u -> System.out.println(u));
}
}
网友评论